When I start a new feature in Go I keep reaching for the interface first. That order is wrong: write the concrete struct, and let interfaces show up at whatever consumes the dependency.
Blog
Notes on mobile engineering, React Native, Go, product architecture, and things I am learning in public.
No framework, no container, no reflection scanning your struct fields at startup: Go's version of dependency injection is a constructor argument, and interfaces are what make that argument swappable.
Antigravity IDE can install the GitHub Pull Requests extension but can't run it properly. I replaced it with the GitHub CLI and shipped this post with four commands, without opening github.com once.
VS Code refused to let me switch branches after a GitHub merge. The uncommitted changes weren't the problem — my local main was just stale.
Go collapses for, for-of, for-in, and forEach into one for, and a missing map key returns a zero value instead of undefined. Both are smaller languages on purpose.
A method is just a function with a receiver, a nil interface panics differently than a nil pointer, and iota isn't a TypeScript enum — three Go idioms I had to unlearn my TS assumptions for.
Defer's evaluation timing and named return values that get mutated after the return statement: two Go function features with no real TypeScript equivalent.
Slice headers, nil comparisons, and pointer fields for optional values: three places Go's syntax looks like TypeScript but the semantics don't match.
Six Go patterns that compile cleanly and quietly do the wrong thing: loop capture, typed nil, slice aliasing, shadowed err, defer in a loop, and range copies.
Setting up Glance, a self-hosted dashboard, to replace the dozen tabs.
A quick-reference table of macOS terminal commands: file system navigation, file operations, system monitoring, network utilities, and permissions.
I finished vimtutor, used kickstart.nvim for a nicer practice setup, and wrote down the commands that felt useful without becoming a wall of Vim trivia.
A small query key factory made my TanStack Query cache updates and invalidations much less annoying.
How I set up Cmd+Shift+L in VSCode to instantly insert console.log() — or console.log('varName', varName) when a variable is selected.
AI code generation is genuinely useful, but approving every suggestion without reading it is a habit that will eventually cost you.
Adding a custom Telegram icon to an Astro project broke all icons and threw a cryptic error. The fix was deleting the .astro cache folder.
Go has no constructor keyword or new syntax, so the language leans on a plain function that returns a pointer, named NewX by convention.
A small FastLED sketch for the Waveshare ESP32-S3-Matrix that cycles through six colorful effects on the 8x8 LED matrix.