What's new
The shifts worth knowing about
The ground moves fast on this side of the industry. Here's what's actually changing how people build — what's happening, why it matters, and what to do about it. Signal, not hype.
- 01
Tools
Agents went from autocomplete to whole-repo work
The AI coding tool stopped being fancy autocomplete that finished your current line and became an agent that works on the whole repository. Two years ago the state of the art was gray ghost-text guessing the rest of a function; now you describe an outcome and the tool reads across files, writes a plan, edits several of them, runs your tests and linter, and hands you a diff. The unit of work moved from the cursor to the codebase.
Why it mattersWhat to doStop thinking in keystrokes and start thinking in tasks. Give the agent one tightly scoped instruction plus the context it needs: a conventions file (CLAUDE.md or a rules file) and tests it can run to check its own work. Then treat every diff like a pull request from a junior — read it, don't rubber-stamp it. Keep changes small and commit often so a bad run is one revert away. Let the agent run the edit-test-fix loop on its own, but keep a human on the merge button: work on a branch, never let it push to main unattended, and glance at any command before it executes.
Related tools
- 02
Practice
The rules file is part of your stack now
The rules file — CLAUDE.md, AGENTS.md, .cursor/rules, .github/copilot-instructions.md — stopped being a personal scratchpad and became committed, reviewed project config. Every coding agent now reads it before it writes a line, so it sits in the repo next to package.json as a real dependency: version-controlled, owned, and diffed in pull requests. The ecosystem even converged on AGENTS.md as a shared standard, so one file can steer several different agents instead of each dev keeping their own.
Why it mattersYour agent's output is downstream of this file. Two people on the same repo with different rules files ship different code — so if the rules aren't in the repo, quality is non-deterministic and walks out the door with whoever wrote them. It's also the cheapest lever you have: no model swap or fine-tune moves quality the way a tight rules file does, because the alternative is the agent guessing your conventions and propagating the guess across a dozen files before you notice. And it's a real safety surface — the "never touch .env," "never force-push," "never delete a failing test" lines live here, not in someone's head.
What to doGet it out of .gitignore and commit it, then review changes to it in PRs exactly like code — because it changes what the code becomes. Keep one source of truth: write the real rules in AGENTS.md or CLAUDE.md and make the tool-specific files (.cursor/rules, copilot-instructions.md, .windsurfrules) one-line pointers or symlinks so four copies never drift. Keep it under ~200 lines, imperative and checkable ("MUST", "NEVER"), and spend the budget on what the agent can't infer: your resolved stack decisions, the exact verify commands, the never-touch list. Then maintain it like code — add a rule the second time the agent repeats a mistake, delete a subsystem's rules in the same PR that deletes the subsystem, and give the file an owner.
Related tools
- 03
Business
Merchant-of-record won for global indie sales
For years the default advice was "just add Stripe." That quietly stopped being enough. Stripe moves money, but it doesn't become the legal seller — so the moment you sell digital goods across borders, sales-tax, VAT and GST registration in dozens of jurisdictions lands on you personally. The winning pattern for indie and small-team global sales is now the merchant of record (MoR): Paddle, Polar, Lemon Squeezy. An MoR legally becomes the seller of your product, collects and remits tax everywhere, absorbs chargebacks and fraud, and pays you one clean amount. You trade a higher cut — roughly 5% versus Stripe's ~3% — for never touching a VAT filing.
Why it mattersAI collapsed the time from idea to live, paid product to a weekend — and a product born on the internet is global on day one. Having paying customers in 40 countries your first week used to be a fantasy; now it's a Tuesday. That moves the bottleneck off building and onto the boring legal surface underneath: EU VAT has no threshold for digital goods, US economic-nexus rules trip in dozens of states, and more countries bolt on digital-services taxes every year. Stripe Tax will calculate what's owed, but you're still the merchant of record — meaning you personally have to register and file in every jurisdiction, which is a full-time compliance job, not a checkbox. Getting it wrong isn't a rounding error; it's back-taxes, penalties and frozen accounts. An MoR turns "register and file in N jurisdictions" into one integration and one payout — the difference between a side project you can actually run and one that quietly becomes an accounting department.
What to doDefault to a merchant of record for anything digital you sell to a global audience — subscriptions, downloads, licenses — unless you already employ finance staff. Reach for raw Stripe only when you need full control of checkout, marketplace/Connect payouts, physical goods, or you're big enough to run tax compliance yourself (remember: Stripe Tax calculates, you still register and remit — that's the whole catch). Picking one: Polar or Lemon Squeezy for indie and dev-focused SaaS and digital products (Polar is open-source, dev-first, with license-key and entitlement support); Paddle when you're a real SaaS scaling worldwide; Gumroad for a dead-simple single-product buy button. Treat the ~5% fee as the price of not learning international tax law — cheap until you hit serious revenue, at which point re-run the math and weigh moving to Stripe plus an accountant. Critically, decide the model before your first paying customer: migrating billing after you have active subscribers is genuinely painful, so don't plan to bolt tax on "later."
Related tools
- 04
Data
Serverless Postgres became the default database
Postgres always won on features; what changed is the operational model. Serverless Postgres — compute split from storage, scale-to-zero billing, instant provisioning over HTTP, and copy-on-write database branching — turned "stand up a real relational database" into a 30-second, free-tier default. For anything you build with AI in 2026, a managed serverless Postgres (Supabase or Neon) is now the boring, correct starting point rather than an upgrade you graduate to.
Why it mattersThe thing that used to make Postgres painful on serverless was connections. A traditional Postgres box holds a few hundred open connections; a bursty serverless or edge function opens a fresh one per invocation and exhausts the pool almost immediately. Serverless Postgres fixes this at the source with built-in pooling and HTTP/WebSocket drivers that don't hold a socket open, so a Vercel function and a genuine relational database finally coexist without "too many connections" crashes. On top of that, scale-to-zero means an idle side project costs nothing, and branching gives every preview deploy and every test run its own throwaway copy of the database — which is exactly the fast, disposable, try-it-and-see loop that AI-assisted coding runs on. The net effect is that most of the old reasons to reach for a bespoke NoSQL store on a new project have evaporated: you get ACID transactions, foreign keys, JSONB, full-text search, and pgvector for embeddings in one engine you don't have to operate.
What to doDefault to Postgres, and specifically to a managed serverless one. Pick Supabase when you want auth, storage, and realtime batteries included; pick Neon when you want a pure database with the best branching story. Don't self-host RDS or hand-roll a NoSQL schema for a new AI-built app "to save money" — you pay it back in connection bugs and migration pain. On serverless or edge runtimes, always connect through the pooled connection string or the provider's HTTP driver (like @neondatabase/serverless), never the direct connection, or you'll drown under load. Put Drizzle ORM (or Prisma) on top so you get a typed schema and real migrations — that way your AI agent edits a schema file it can reason about instead of guessing at raw SQL. Wire a database branch to each preview deployment so migrations run against production-shaped data before they merge. And use pgvector inside the same database for your first AI features rather than bolting on a separate vector store until you've genuinely outgrown it.
Related tools
- 05
Frontend
Copy-in components beat installed UI kits
Wrote the first TREND note, "Copy-in components beat installed UI kits" (category: Frontend), into /home/user/goudbeek-digital-studio/src/lib/library/trends.ts — previously an empty TRENDS array. The note frames the shift from npm-installed UI kits (Material UI, Chakra, Ant Design) to copy-in source components (the shadcn/ui model) where you own and edit the files, and explains it's driven mainly by AI agents working better on code they can see and edit than on a node_modules black box. It fills every field of the Trend type (slug, title, category, summary, whyItMatters, whatToDo, relatedTools) in the direct, senior-engineer Goudbeek Library voice with evergreen framing and no dates.
Why it mattersThe trends route (src/routes/library.trends.tsx) reads from this array and previously rendered an empty state; the note is now live-ready. relatedTools names were verified against src/lib/library/tools.ts so ToolChips resolves each to a real library/tool page rather than a dead plain chip, and tsc --noEmit reports no trends-related type errors.
What to doNo further action needed to render — the route already maps TRENDS to the page. If you want to keep the note honest to that voice, the key claim to preserve is the tradeoff (you own maintenance, so upstream fixes don't arrive via version bumps) and the practical default (start with shadcn/ui via CLI + commit the files; keep behaviour on installed Radix/Base UI/React Aria primitives; edit copied code with v0/Cursor). Add more notes by appending further Trend objects to the same array.
Related tools
- 06
Patterns
Local-first + sync came back
The default web app for a decade was a thin client making REST or GraphQL round-trips: every click hits the server, you watch spinners, and offline means broken. Local-first flips it — the client holds a real copy of its data (SQLite or an in-memory store), reads and writes land instantly against that copy, and a sync engine reconciles with the server in the background. The concept is old; what changed is that the infrastructure finally shipped. Sync engines like ElectricSQL, Zero, PowerSync and Convex now handle the genuinely hard parts — conflict resolution, partial replication, auth-scoped data subsets — so it stopped being a research project. AI assistants pushed the swing along: they make the extra client-side wiring cheap to generate, and agent-driven UIs want reactive, optimistic state that updates without a refetch.
Why it mattersThe felt quality of an app is latency, and local-first apps feel instant because the UI updates before the network round-trip instead of after it. Offline support, real-time collaboration and multi-tab consistency then come along mostly for free, because under the hood they are all just "sync." The honest trade: a sync engine is stateful infrastructure with real failure modes — merge conflicts, schema migrations, partial-replication bugs — that are harder to reason about than a stateless REST handler. It is better UX, not a free lunch.
What to doDon't build sync yourself — hand-rolled optimistic updates bolted onto a REST API is exactly where these projects drown. Pick a sync engine and let it own reconciliation. Want the fastest path with no existing database? Use Convex, where reactive queries and sync are the default rather than an add-on. Already have Postgres and want to keep it? Stream a scoped subset down to local SQLite with ElectricSQL or PowerSync. On the client, TanStack DB gives you reactive collections with optimistic writes that sit on top of any of them. Convert one high-interaction view first — a board, an inbox, a settings panel — before you touch the whole app, and scope synced data per user or tenant from day one, because pulling entire tables to every client is the classic way local-first blows up.
Related tools
- 07
Infra
The edge moved from novelty to default
For years the edge was a novelty tier — a place for redirects, geolocation, and A/B splits so you could say "my code runs in 300 cities." It came with a hostile runtime: a stripped-down V8 isolate, no Node APIs, no filesystem, tight limits, and databases sitting an ocean away that hated per-request connections. That has inverted. The edge-shaped constraints are now the default way things get built — even code that ends up running in a single region. The shared runtime is web-standard (Request/Response, fetch, Web Streams, URL): Node adopted it natively, Bun and Deno were born on it, and Cloudflare Workers gained real Node compatibility. Frameworks like Hono — and the meta-frameworks built on top of them — target that surface, so one codebase deploys to Workers, Vercel, a container, or your laptop unchanged.
Why it mattersHere's the honest part the hype skipped: the edge won as a programming model, not as a deployment map. The industry already corrected the "run everything in 300 locations" cargo cult — that's exactly why Vercel shipped Fluid compute and Cloudflare made Workers Node-compatible. Pure edge isolates were too constrained for real apps, and compute far from your database is slower, not faster: the round trips to a single-region Postgres eat every millisecond you thought you saved at the edge. What actually became the default is portable, stateless, web-standard code — plus databases that stopped fighting statelessness. Neon's serverless driver, Turso/libSQL, PlanetScale, and Upstash all speak HTTP, so a function anywhere can reach them without a connection pool. The real payoff is optionality: you write once and decide where it runs based on data locality, not on where the demo looked coolest.
What to doDefault to web-standard APIs — fetch, Request/Response, Web Streams, URL. Treat Node-only built-ins (fs, node:net sockets, native addons) as a deliberate choice that pins you to one runtime, not a reflex. Use HTTP/serverless database drivers (Neon serverless, Turso, Upstash) instead of assuming a long-lived TCP pool; if you genuinely need pooled TCP, run that code in a region next to the database, not at the edge. Put stateless, latency-sensitive work at the edge — auth and session checks, redirects, feature flags, geolocation, caching, request rewriting; that's what middleware is for. Keep data-heavy and Node-dependent work in a region co-located with your data. And stop treating "deploy to the edge" as the goal in itself: co-locate compute with data, measure real p95 latency, and let the portable code move only if the numbers say so. Build on something like Hono or Next so flipping the target is a config change, not a rewrite.
Related tools
- 08
AI
RAG got boring — and that's good
RAG stopped being a research project. In 2024 you hand-rolled chunking, embedding choice, vector-DB tuning, and re-rank cascades as if retrieval were your product's moat; by 2026 it's plumbing — long context windows plus prompt caching killed retrieval outright for small and medium corpora, and for everything larger, pgvector on the Postgres you already run is a checkbox. The default configs are finally good enough that "advanced RAG" is mostly a solved, boring layer.
Why it mattersThe differentiation was never the vector search. Teams burned months on HyDE, sentence-window retrieval, and elaborate re-rank pipelines chasing a few points that a long-context call or a managed store would have matched. Boring is good precisely because it frees your attention for the things that actually move quality: your data, your evals, and your product. It also means you ship a working answer engine in an afternoon instead of a sprint, and the next person to touch the code can actually read it. The failure mode in 2026 has flipped — it's over-engineering, not under-engineering. The common mistake now is building a five-stage retrieval pipeline for a corpus that would fit in a single prompt.
What to do1) Start with the dumbest thing that could work. If your corpus fits in a long context window (roughly a few hundred pages), skip retrieval entirely — put the documents in the prompt and lean on prompt caching so you aren't paying full freight every call. Measure whether that clears the bar before you build anything. 2) When it genuinely doesn't fit, reach for pgvector in the Postgres you already run (Supabase turns this into a checkbox). Don't stand up a dedicated vector database until you've hit a real, measured limit — not a hypothetical one. 3) Take the boring defaults. Chunk on document structure (headings and paragraphs, not arbitrary token counts), use a current managed embedding model, retrieve top-k. Add a re-ranker (Cohere Rerank) only when your evals show it earns its latency. 4) For open-ended queries, let the model retrieve as a tool — agentic retrieval where it decides when and what to search — instead of blindly prepending context to every request. 5) Spend the time you just saved on evals and data hygiene. A small labeled eval set that tells you the moment retrieval regresses is worth more than any clever chunking trick you'll read about this quarter.
Related tools
- 09
DX
End-to-end type safety became table stakes
End-to-end type safety flipped from a nice-to-have you bolted onto a mature codebase into the baseline expectation for any new project. The default stacks now let a single source of truth — your database schema — infer types all the way up through the query layer, the network boundary, and into your React components, with no hand-written duplicate type definitions in the middle. What pushed it over the line was AI: coding agents write dramatically more correct code when a type checker is standing behind them, so types stopped being ceremony and became the contract the model codes against.
Why it mattersVibe coders ship fast and don't read every line the AI writes — which means you need an automated reviewer that runs on every edit, and the type checker is the cheapest one you'll ever get. It catches exactly the class of mistake LLMs are most prone to: plausible-but-wrong field names, a renamed column that's still referenced in six places, a shape that's almost right, an unhandled null. In a fully typed stack, renaming one DB column lights up every broken call site from the query down to the component prop, so you find out at edit time instead of in production. It also tightens the agent loop: the model runs `tsc`, sees the red, and fixes its own hallucinated fields before you ever open the app. Untyped JS glue is now a liability precisely because it gives the AI nothing to check itself against — the errors just fall through to your users.
What to doPick a stack where types flow end to end and never break the chain: Postgres via Supabase or Drizzle ORM, typed queries (Drizzle infers types straight from your schema — no raw SQL strings), a typed network boundary via tRPC or Next.js typed Server Actions, and React components with inferred props. Turn on TypeScript strict mode and treat it as non-negotiable: `"strict": true` plus `"noUncheckedIndexedAccess": true` in tsconfig. Validate every piece of external input — form data, webhooks, third-party API responses — with Zod, and infer your static types from the Zod schema so there's one source of truth, not two that drift. Prefer generated types (Drizzle's inference, Supabase's `gen types`) over hand-written interfaces that duplicate your schema. Make `tsc --noEmit` a required check in CI and, ideally, a step your AI agent runs after every batch of edits. And police the escape hatches: when the model reaches for `any` or an `as` cast, that's a smell — make it stop and type it properly, because every `any` is a hole the type checker can't see through.
Related tools
- 10
Tools
The terminal became an agent surface
For decades the terminal was a human REPL: you typed commands, read output, and drove every tool yourself. As of 2026 it's the primary place coding agents live and act. Claude Code, OpenAI's Codex CLI, Gemini CLI, and Aider turned the shell from a human-driven command line into an agent-driven work loop — you state intent and the agent reads files, edits code, runs the test suite, runs git, and commits, all inside the terminal. The editor became optional; the terminal is the surface the agent works on.
Why it mattersThe terminal already had everything an agent needs — filesystem, git, package managers, compilers, test runners, SSH — with no plugin API to reimplement and no editor sandbox to fight. IDE extensions had to rebuild all of that behind a proprietary surface; the shell just has it. It's also headless and scriptable, so the exact same agent runs on your laptop, over SSH on a box, in a Docker container, and in CI — which is why agents jumped from "chat panel bolted onto your IDE" to "process running in a loop." It's composable in the Unix sense: background it, pipe it, fan out several across git worktrees. And because it's editor-agnostic, your agent stops being locked to one vendor's app. The real cost: the agent now runs live, destructive commands, so permissions and approvals became a first-class design problem instead of an afterthought.
What to doTreat a terminal agent as a primary tool, not a demo. Give it a project config it reads on every run — CLAUDE.md or AGENTS.md — with your conventions, the exact build/test/lint commands, and the things it must never touch; this file is now where team knowledge lives, so commit it. Configure an allowlist so safe commands (tests, typecheck, reads, git status) run without prompting while destructive ones (rm, force-push, DB migrations, deploys) still stop for you. Use git worktrees to run several agents in parallel on separate branches without collisions. Push the loop headless — run agents in CI or as background jobs for triage, dependency bumps, and first-pass PR review — and always give the agent a way to verify its own work (run the tests, read the output) rather than trusting the diff. Version-control the config, skills, and slash commands so the whole team gets identical agent behaviour.
Related tools
Keep exploring
More of the library
- 383tools→Tools
Every tool, with an honest take on each.
- 8stacks→Stacks
Tool combinations that work together.
- 10showdowns→Comparisons
Honest head-to-heads with a verdict.
- 22recipes→Recipes
How to build the thing you keep needing.
- 12guides→Guides
The craft of building with AI.
- 6paths→Learning paths
An ordered route through the library.
- 40prompts→Prompts
Reusable prompts worth stealing.
- 10ideas→Build ideas
Project blueprints with a stack to match.
- 52terms→Glossary
Plain-language words for what AI writes.