56,966 blogs · [ { "id": "01a0da68-3b08-7370-b01b-4ad26c48faf5", "title": "Building one portfolio view for all my crypto wallets", "url": "https://paulund.co.uk/projects/satzo-crypto-wallet-portfolio", "published_at": "2026-09-25T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01334ae57e8b", "title": "Email verification belongs at the API boundary", "url": "https://paulund.co.uk/notebook/apis/email-verification-belongs-at-the-api-boundary", "published_at": "2026-08-02T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01334b563dc4", "title": "Infrastructure questions belong before the first line of code", "url": "https://paulund.co.uk/notebook/ai/infrastructure-questions-before-code", "published_at": "2026-08-02T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01334bc9ecc1", "title": "SEO feedback should become bounded engineering work", "url": "https://paulund.co.uk/notebook/ai/seo-feedback-bounded-engineering-work", "published_at": "2026-08-02T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01334c8f1e99", "title": "A status page should explain incidents, not just show green", "url": "https://paulund.co.uk/notebook/observability/status-pages-should-explain-incidents", "published_at": "2026-07-29T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01334d4ad822", "title": "Agent workflows should outlive their models", "url": "https://paulund.co.uk/notebook/ai/agent-workflows-should-outlive-their-models", "published_at": "2026-07-27T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01334dc9d397", "title": "Building PostConductor: Why I Pivoted to MCP-First", "url": "https://paulund.co.uk/notebook/ai/building-postconductor-mcp-first", "published_at": "2026-07-01T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01334e8141ed", "title": "Stop Blaming the Model", "url": "https://paulund.co.uk/notebook/ai/stop-blaming-the-model", "published_at": "2026-06-19T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01334f671c90", "title": "Harness Engineering", "url": "https://paulund.co.uk/notebook/ai/harness-engineering", "published_at": "2026-06-18T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01334f8fd99d", "title": "A Modern Quality Pipeline and Testing Strategy for Frontend Projects", "url": "https://paulund.co.uk/notebook/good-code/a-modern-quality-pipeline-and-testing-strategy-for-frontend-projects", "published_at": "2026-06-17T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01334fc8f9e2", "title": "Agents Are Cron Jobs and Markdown Files", "url": "https://paulund.co.uk/notebook/ai/agents-are-cron-jobs-and-markdown-files", "published_at": "2026-06-17T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-0133507c500c", "title": "Measure Your Agent Skills or Delete Them", "url": "https://paulund.co.uk/notebook/ai/measure-your-agent-skills-or-delete-them", "published_at": "2026-06-12T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01335108e064", "title": "What to Do If You're Not Detail Oriented", "url": "https://paulund.co.uk/notebook/career/what-to-do-if-youre-not-detail-oriented", "published_at": "2026-06-08T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-013351ea1e94", "title": "How to Stay Resilient in a Difficult Engineering Job", "url": "https://paulund.co.uk/notebook/career/staying-resilient-in-a-difficult-engineering-job", "published_at": "2026-06-06T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-013351faf17e", "title": "Agentic Engineering Patterns", "url": "https://paulund.co.uk/notebook/ai/agentic-engineering-patterns", "published_at": "2026-06-05T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-0133521e411b", "title": "AI Ate the Translation Layer", "url": "https://paulund.co.uk/notebook/ai/ai-ate-the-translation-layer", "published_at": "2026-06-03T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-013352f5ff2d", "title": "Why Smaller Teams Will Win With AI", "url": "https://paulund.co.uk/notebook/ai/why-smaller-teams-will-win-with-ai", "published_at": "2026-06-02T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-013353ecae99", "title": "AI Code Review: Pre-Existing Bugs as a Side Quest", "url": "https://paulund.co.uk/notebook/ai/ai-code-review-pre-existing-bugs-as-a-side-quest", "published_at": "2026-06-01T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-0133541024c4", "title": "Software Factory: Build Factories, Not Features", "url": "https://paulund.co.uk/notebook/ai/software-factory-build-factories-not-features", "published_at": "2026-06-01T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-0133549ce56d", "title": "Small npm Packages Are Mostly Dead", "url": "https://paulund.co.uk/notebook/ai/small-npm-packages-are-mostly-dead", "published_at": "2026-05-30T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-013355994ee9", "title": "The Four Levels of Working with AI", "url": "https://paulund.co.uk/notebook/ai/the-four-levels-of-working-with-ai", "published_at": "2026-05-30T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-013356298cfe", "title": "What Happens to Developers Who Don't Adapt to AI", "url": "https://paulund.co.uk/notebook/ai/what-happens-to-developers-who-dont-adapt-to-ai", "published_at": "2026-05-30T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-013356ca262c", "title": "Software Ecology and the 10x Moment", "url": "https://paulund.co.uk/notebook/ai/software-ecology-and-the-10x-moment", "published_at": "2026-05-29T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-0133570f74ca", "title": "How AI Agents Made Me CLI-First", "url": "https://paulund.co.uk/notebook/ai/how-ai-agents-made-me-cli-first", "published_at": "2026-05-27T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-013357ddbfdf", "title": "How I Build Software With Agent Loops", "url": "https://paulund.co.uk/notebook/ai/how-i-build-software-with-agent-loops", "published_at": "2026-05-27T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-013358490450", "title": "paulund/goldcli v1.1.0 - Caching layer keeps you under the API free tier", "url": "https://paulund.co.uk/releases/paulundgoldcli-v110-caching-layer-keeps-you-under-the-api-free-tier", "published_at": "2026-05-26T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-013358e795f0", "title": "Higher-Order Components and Why Hooks Replaced Them", "url": "https://paulund.co.uk/notebook/react/higher-order-components-and-why-hooks-replaced-them", "published_at": "2026-05-25T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01335940795d", "title": "Pure Components and Why Purity Matters in React", "url": "https://paulund.co.uk/notebook/react/pure-components-and-why-purity-matters-in-react", "published_at": "2026-05-18T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01335a1ae517", "title": "React Fragments and When You Actually Need Them", "url": "https://paulund.co.uk/notebook/react/react-fragments-and-when-you-actually-need-them", "published_at": "2026-05-11T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01335a221f50", "title": "Refs and when useRef beats useState", "url": "https://paulund.co.uk/notebook/react/refs-and-when-useref-beats-usestate", "published_at": "2026-05-07T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01335a333114", "title": "Default Props and Optional Props in React", "url": "https://paulund.co.uk/notebook/react/default-props-and-optional-props-in-react", "published_at": "2026-05-01T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01335a7d3bbd", "title": "Handling Form Submission in React", "url": "https://paulund.co.uk/notebook/react/handling-form-submission-in-react", "published_at": "2026-04-30T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01335a9f5797", "title": "Client-side validation before Server Actions in Next.js", "url": "https://paulund.co.uk/notebook/nextjs/client-side-validation-before-server-actions-in-nextjs", "published_at": "2026-04-29T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01335b1678b3", "title": "Type-Safe Adapter Registries with as const and satisfies", "url": "https://paulund.co.uk/notebook/typescript/type-safe-adapter-registries-with-as-const-and-satisfies", "published_at": "2026-04-29T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01335c11ccfc", "title": "Using Service Interfaces and Null Objects for Resilient TypeScript Scripts", "url": "https://paulund.co.uk/notebook/typescript/using-service-interfaces-and-null-objects-for-resilient-typescript-scripts", "published_at": "2026-04-29T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01335ca4d988", "title": "Validating Multi-Provider Credentials with Zod Discriminated Unions", "url": "https://paulund.co.uk/notebook/typescript/validating-multi-provider-credentials-with-zod-discriminated-unions", "published_at": "2026-04-27T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01335cf57cd3", "title": "paulund/ai v3.1.0 - Writing Humanizer skill", "url": "https://paulund.co.uk/releases/paulundai-v310-writing-humanizer-skill", "published_at": "2026-04-25T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01335de695b4", "title": "Building a URL Shortener with Next.js", "url": "https://paulund.co.uk/notebook/nextjs/building-a-url-shortener-with-nextjs", "published_at": "2026-04-22T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01335e9f6a62", "title": "Magic Link Authentication in Next.js", "url": "https://paulund.co.uk/notebook/apis/magic-link-authentication-in-nextjs", "published_at": "2026-04-22T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-01335f2450df", "title": "API Key Management in Next.js", "url": "https://paulund.co.uk/notebook/apis/api-key-management-in-nextjs", "published_at": "2026-04-21T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-013360188706", "title": "paulund/ai v3.0.0 - Skills-only layout and new planning skills", "url": "https://paulund.co.uk/releases/pauundai-v300-skills-only-layout-and-new-planning-skills", "published_at": "2026-04-21T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-013360812fad", "title": "Transactional Email with Resend and React Email", "url": "https://paulund.co.uk/notebook/nextjs/transactional-email-with-resend-and-react-email", "published_at": "2026-04-21T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-013360ab662a", "title": "Type Annotations vs Type Inference: When to Write the Type", "url": "https://paulund.co.uk/notebook/typescript/type-annotations-vs-type-inference", "published_at": "2026-04-21T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-0133619c699b", "title": "The Compound Component Pattern in React", "url": "https://paulund.co.uk/notebook/react/the-compound-component-pattern-in-react", "published_at": "2026-04-20T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-013362480725", "title": "The Render Prop Pattern in React", "url": "https://paulund.co.uk/notebook/react/the-render-prop-pattern-in-react", "published_at": "2026-04-20T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-0133631fbddd", "title": "useReducer for Complex State", "url": "https://paulund.co.uk/notebook/react/usereducer-for-complex-state", "published_at": "2026-04-19T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-0133637279bd", "title": "The React Context API: Shared State Without a Library", "url": "https://paulund.co.uk/notebook/react/the-react-context-api-shared-state-without-a-library", "published_at": "2026-04-18T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-013363dd3de3", "title": "Dynamic OG Images in Next.js with opengraph-image.tsx", "url": "https://paulund.co.uk/notebook/nextjs/dynamic-og-images-in-nextjs-with-opengraph-imagetsx", "published_at": "2026-04-17T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-013364765e06", "title": "Lifting State Up in React", "url": "https://paulund.co.uk/notebook/react/lifting-state-up-in-react", "published_at": "2026-04-17T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-0133652e0efa", "title": "Conditional Rendering Patterns in React", "url": "https://paulund.co.uk/notebook/react/conditional-rendering-patterns-in-react", "published_at": "2026-04-16T00:00:00+00:00" }, { "id": "01a087be-49bd-705d-82c1-013365dddcff", "title": "Lists and Keys in React: Why They Actually Matter", "url": "https://paulund.co.uk/notebook/react/lists-and-keys-in-react-why-they-actually-matter", "published_at": "2026-04-15T00:00:00+00:00" } ] posts Claim your blog
Back to paulund.co.uk
Blog · corpus.blog/blogs/paulund.co.uk/posts

paulund.co.uk

paulund.co.uk

2026