// writing
Thoughts on code,
craft & exploration.
A mix of technical deep-dives, career reflections, and dispatches from the road.

obsidianNov 10, 2026· 4 min
Obsidian as Your Default Markdown App: Opening Files Outside the Vault
Obsidian 1.14 can finally open a Markdown file that isn't in a vault. Here's how to make it your default .md app, what works on stray files, and what doesn't.
read more →

developmentNov 9, 2026· 4 min
Laravel 13 Vector Search: Semantic Queries Without a Search Service
Laravel 13 adds whereVectorSimilarTo, vector columns, and an AsVector cast, so meaning-based search can live in the Postgres or MariaDB database you run.
read more →

developmentNov 8, 2026· 4 min
React's browser() API: Opt Out of SSR Without the Mounted-State Hack
React 19.3 adds use(browser()), a first-class way to mark a component browser-only during SSR, replacing typeof window checks and useEffect mounted flags.
read more →

financeNov 8, 2026· 4 min
Proof of Reserves: What an Exchange's Merkle Tree Can and Can't Prove
Exchanges publish proof of reserves to show customer funds are backed. Here's how the Merkle sum tree works, and the liabilities it was never built to see.
read more →

AINov 8, 2026· 4 min
LLM Rate Limits: Your Retry Loop Is the Easy Part
Not every 429 is worth retrying. How to handle LLM API rate limits without stacking retries, burning budget on spend-cap errors, or finding limits by failing.
read more →

AINov 6, 2026· 4 min
Writing an MCP Server: The Tool Description Is the Whole API
A walkthrough of building an MCP server with the v2 TypeScript SDK, and why your schemas, descriptions, and error messages matter more than protocol plumbing.
read more →

developmentNov 5, 2026· 4 min
Oxlint JS Plugins: Your Custom ESLint Rules No Longer Keep You on ESLint
Oxlint now runs ESLint plugins and your own custom rules, so the last excuse for a slow lint step is gone. Here's how JS plugins work and where the gaps are.
read more →

financeNov 4, 2026· 4 min
Your Bitcoin Wallet Has No Balance: UTXOs, Change, and Why Fees Ignore the Amount
Bitcoin tracks unspent outputs, not balances. Here's how the UTXO model works, where change goes, and why sending $50 can cost more than sending $50,000.
read more →

obsidianNov 3, 2026· 4 min
Obsidian Maps: Put Your Place Notes on a Map With Bases
The official Maps plugin turns any Base into an interactive map. Here's how to structure coordinates, drive marker icons from properties, and avoid setup traps.
read more →

developmentNov 2, 2026· 4 min
GraphQL @defer: Stop Letting Your Slowest Field Set Your Load Time
One slow resolver can hold a whole GraphQL response hostage. Here's how @defer and @stream split a query into an initial payload and patches, and what to check.
read more →
// the newsletter