April 10, 2026
Hello, World

I have been building software professionally for close to a decade, mostly backend systems, cloud infrastructure, and the occasional frontend when nobody else was around to do it. This blog is where I plan to write about that work in more detail than a commit message allows.
Expect posts about:
- Backend architecture and API design
- AWS/cloud infrastructure decisions and the tradeoffs behind them
- Debugging stories: the kind where the fix is one line but the diagnosis took a day
- Small, reusable code snippets I keep reaching for
Here is one of those snippets, a debounce helper I rewrite in nearly every frontend project:
function debounce<T extends (...args: unknown[]) => void>(fn: T, delayMs: number) {
let timer: ReturnType<typeof setTimeout>;
return (...args: Parameters<T>) => {
clearTimeout(timer);
timer = setTimeout(() => fn(...args), delayMs);
};
}
And the Go equivalent of a pattern I use constantly on the backend, a context-aware retry with exponential backoff:
func retry(ctx context.Context, attempts int, fn func() error) error {
var err error
for i := 0; i < attempts; i++ {
if err = fn(); err == nil {
return nil
}
select {
case <-time.After(time.Duration(1<<i) * 100 * time.Millisecond):
case <-ctx.Done():
return ctx.Err()
}
}
return err
}
More posts soon.