41554 blogs · [ { "id": "01a0d927-092f-7265-80e0-ce1ef77734b1", "title": "Retention Theatre: Why Companies Lose Good Engineers Whilst Pretending to Listen", "url": "https://johnkavanagh.co.uk/articles/retention-theatre-why-companies-lose-good-engineers/", "published_at": "2026-09-24T00:00:00+00:00" }, { "id": "01a0d927-0930-70d5-8377-f57a041ec329", "title": "Why Transformation Programmes Fail After the Slide Deck", "url": "https://johnkavanagh.co.uk/articles/why-transformation-programmes-fail-after-slide-deck/", "published_at": "2026-09-20T00:00:00+00:00" }, { "id": "01a0bb42-3571-73bd-94b4-4ab22928333c", "title": "Technical AEO: Structuring Content for Direct Answers Without Creating FAQ Spam", "url": "https://johnkavanagh.co.uk/articles/technical-aeo-structuring-direct-answers-without-faq-spam/", "published_at": "2026-09-18T00:00:00+00:00" }, { "id": "01a0bb42-3571-73bd-94b4-4ab229e47677", "title": "Building an LRU Cache in TypeScript: Hash Map and Doubly Linked List in Practice", "url": "https://johnkavanagh.co.uk/articles/lru-cache-typescript-hash-map-doubly-linked-list/", "published_at": "2026-09-16T00:00:00+00:00" }, { "id": "01a09511-56e1-7312-8e54-ea14e50f4ea6", "title": "How to Make Content Easier for Generative Engines to Trust", "url": "https://johnkavanagh.co.uk/articles/how-to-make-content-easier-for-generative-engines-to-trust/", "published_at": "2026-09-12T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14073727d24", "title": "The Consultancy Rescue Loop", "url": "https://johnkavanagh.co.uk/articles/consultancy-rescue-loop/", "published_at": "2026-09-08T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140741165f9", "title": "The Deadline Debt Nobody Tracks", "url": "https://johnkavanagh.co.uk/articles/deadline-debt-nobody-tracks/", "published_at": "2026-09-04T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1407438c35d", "title": "When Sass Colours Break After a Next.js Production Build", "url": "https://johnkavanagh.co.uk/articles/sass-colours-break-nextjs-production-build/", "published_at": "2026-09-03T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1407444af30", "title": "Mastering Server Components in Next.js", "url": "https://johnkavanagh.co.uk/articles/mastering-server-components-in-next-js/", "published_at": "2026-08-31T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1407516d51b", "title": "The Engineering Capability Trap", "url": "https://johnkavanagh.co.uk/articles/engineering-capability-trap/", "published_at": "2026-08-27T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1407522365c", "title": "HTTP 402 finally Found a Purpose", "url": "https://johnkavanagh.co.uk/articles/http-402-finally-found-a-purpose/", "published_at": "2026-08-26T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1407583e82c", "title": "LeetCode: 'Maximum Subarray' and Kadane's Algorithm Explained", "url": "https://johnkavanagh.co.uk/articles/leetcode-maximum-subarray-and-kadanes-algorithm-explained/", "published_at": "2026-08-23T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140762442f1", "title": "The Seniority Trap: Hiring Experience Without Giving Authority", "url": "https://johnkavanagh.co.uk/articles/seniority-trap-hiring-experience-without-authority/", "published_at": "2026-08-19T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1407688e90e", "title": "The Talent Bar Paradox in Engineering Hiring", "url": "https://johnkavanagh.co.uk/articles/talent-bar-paradox/", "published_at": "2026-08-15T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140769b6e5f", "title": "The Web is Becoming Machine‑Readable First", "url": "https://johnkavanagh.co.uk/articles/web-becoming-machine-readable-first/", "published_at": "2026-08-12T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140775fbcef", "title": "Converting Objects to Query Strings and Vice Versa", "url": "https://johnkavanagh.co.uk/articles/converting-objects-to-query-strings-and-vice-versa/", "published_at": "2026-08-11T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14077f700c9", "title": "The False Economy of Cheap Engineering", "url": "https://johnkavanagh.co.uk/articles/false-economy-cheap-engineering/", "published_at": "2026-08-07T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14078503c8f", "title": "HTTP Cache Validation with ETag and Last-Modified", "url": "https://johnkavanagh.co.uk/articles/http-cache-validation-etag-last-modified/", "published_at": "2026-08-05T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1407923f44f", "title": "Best Practices for Managing Environment Variables in Next.js", "url": "https://johnkavanagh.co.uk/articles/managing-environment-variables-in-next-js/", "published_at": "2026-08-03T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14079c4005a", "title": "Production Observability for Next.js: Instrumentation, Logs, and Release Debugging", "url": "https://johnkavanagh.co.uk/articles/production-observability-for-nextjs/", "published_at": "2026-08-01T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14079e8e41d", "title": "The False Economy of Cutting QA in the AI Delivery Era", "url": "https://johnkavanagh.co.uk/articles/false-economy-cutting-qa-ai-delivery-era/", "published_at": "2026-07-30T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1407a38172f", "title": "Everyone Wants the Best Engineers. Fewer Companies Want to Pay for Them.", "url": "https://johnkavanagh.co.uk/articles/everyone-wants-the-best-engineers/", "published_at": "2026-07-26T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1407aa0e0b3", "title": "Your Website Has a New Customer: The AI Agent", "url": "https://johnkavanagh.co.uk/articles/website-new-customer-ai-agent/", "published_at": "2026-07-24T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1407b348b76", "title": "AI Slop is a Symptom, Not the Disease", "url": "https://johnkavanagh.co.uk/articles/ai-slop-symptom-not-disease/", "published_at": "2026-07-22T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1407c223bf5", "title": "Faceted Navigation SEO in Headless Commerce: Filters, Canonicals, and Crawl Control", "url": "https://johnkavanagh.co.uk/articles/faceted-navigation-seo-headless-commerce/", "published_at": "2026-07-20T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1407ca9acdc", "title": "The Platform Dependency Trap: When Efficiency Becomes Lock‑in", "url": "https://johnkavanagh.co.uk/articles/platform-dependency-trap-efficiency-lock-in/", "published_at": "2026-07-18T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1407da1b461", "title": "Right to Represent Agreements for UK Contractors", "url": "https://johnkavanagh.co.uk/articles/right-to-represent-agreements-uk-contractors/", "published_at": "2026-07-16T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1407e0b35a1", "title": "Error Handling in JavaScript with try, catch, and finally", "url": "https://johnkavanagh.co.uk/articles/advanced-javascript-error-handling-try-catch-finally/", "published_at": "2026-07-14T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1407e71df46", "title": "Gatsby Build Times are Slow: Fix or Migrate?", "url": "https://johnkavanagh.co.uk/articles/gatsby-build-times-slow-fix-or-migrate/", "published_at": "2026-07-13T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1407ebcd883", "title": "When AI Search Creates Visibility Without a Visit", "url": "https://johnkavanagh.co.uk/articles/when-ai-search-creates-visibility-without-a-visit/", "published_at": "2026-07-12T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1407faff745", "title": "The AI Governance Gap in Digital Transformation", "url": "https://johnkavanagh.co.uk/articles/ai-governance-gap-digital-transformation/", "published_at": "2026-07-10T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14080849c9a", "title": "GTM, Consent Tools, and Core Web Vitals: How to Audit Third‑Party Script Cost", "url": "https://johnkavanagh.co.uk/articles/third-party-script-cost-core-web-vitals/", "published_at": "2026-07-08T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14080fd4994", "title": "Why AI Makes Senior Engineers More Important, Not Less", "url": "https://johnkavanagh.co.uk/articles/why-ai-makes-senior-engineers-more-important/", "published_at": "2026-07-06T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14081249e8e", "title": "Gatsby to Next.js Migration Checklist", "url": "https://johnkavanagh.co.uk/articles/gatsby-to-nextjs-migration-checklist/", "published_at": "2026-07-03T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140813d67da", "title": "The Automation Tax No One Measures", "url": "https://johnkavanagh.co.uk/articles/automation-tax-no-one-measures/", "published_at": "2026-07-02T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1408165ec6e", "title": "Contentful to Sanity Migration Checklist for Next.js Sites", "url": "https://johnkavanagh.co.uk/articles/contentful-to-sanity-migration-checklist-for-next-js-sites/", "published_at": "2026-06-29T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1408204daa0", "title": "SEO Best Practices in Next.js: Improving Core Web Vitals", "url": "https://johnkavanagh.co.uk/articles/seo-best-practices-in-next-js-improving-core-web-vitals/", "published_at": "2026-06-28T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14082d6f58d", "title": "Google's Search Monopoly Was Built on a Deal. AI is Rewriting It.", "url": "https://johnkavanagh.co.uk/articles/googles-search-deal-ai-is-rewriting-it/", "published_at": "2026-06-27T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1408304fe9d", "title": "Why Your Next.js App Router Page is Stale: Cache Tags, Revalidation, and CMS Publishing", "url": "https://johnkavanagh.co.uk/articles/nextjs-app-router-cache-tags-revalidation/", "published_at": "2026-06-26T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14083285df3", "title": "Contentful to Sanity Migration Risks for Next.js Sites", "url": "https://johnkavanagh.co.uk/articles/contentful-to-sanity-migration-risks-nextjs/", "published_at": "2026-06-25T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140840f6e99", "title": "AI and the Collapse of Organisational Memory", "url": "https://johnkavanagh.co.uk/articles/ai-collapse-organisational-memory/", "published_at": "2026-06-24T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140849cddcf", "title": "CMS Preview Should Be a Migration Requirement, Not an Afterthought", "url": "https://johnkavanagh.co.uk/articles/cms-preview-migration-requirement-nextjs/", "published_at": "2026-06-22T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14084a3324f", "title": "The Hidden Cost of Replacing Juniors with AI", "url": "https://johnkavanagh.co.uk/articles/hidden-cost-replacing-juniors-with-ai/", "published_at": "2026-06-20T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14085077648", "title": "The Web Just Invented a Toll Booth for AI", "url": "https://johnkavanagh.co.uk/articles/web-invented-toll-booth-for-ai/", "published_at": "2026-06-19T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140856b2ba2", "title": "Should You Move from Contentful to Sanity?", "url": "https://johnkavanagh.co.uk/articles/should-you-move-from-contentful-to-sanity/", "published_at": "2026-06-18T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140860b5b57", "title": "AGI vs. AI vs. ASI: What Actually Changes?", "url": "https://johnkavanagh.co.uk/articles/agi-vs-ai-vs-asi-what-actually-changes/", "published_at": "2026-06-17T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14086fc1cf7", "title": "A Deep Dive into JavaScript's Proxy and Reflect API", "url": "https://johnkavanagh.co.uk/articles/a-deep-dive-into-javascripts-proxy-and-reflect-api/", "published_at": "2026-06-16T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140879f319f", "title": "Fixing Contentful Preview in Next.js Draft Mode", "url": "https://johnkavanagh.co.uk/articles/contentful-preview-nextjs-draft-mode/", "published_at": "2026-06-14T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140888ad8b5", "title": "Union‑Find Explained: Solving the 'Number of Provinces' Problem", "url": "https://johnkavanagh.co.uk/articles/union-find-number-of-provinces/", "published_at": "2026-06-12T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14088f68ccc", "title": "Privacy by Design is Not a Cookie Banner", "url": "https://johnkavanagh.co.uk/articles/privacy-by-design-is-not-a-cookie-banner/", "published_at": "2026-06-10T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14089a1b51d", "title": "The Great AI Content Collapse: Why Cheap Content Makes Real Expertise More Valuable", "url": "https://johnkavanagh.co.uk/articles/great-ai-content-collapse-real-expertise/", "published_at": "2026-06-08T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14089f1ac06", "title": "The AI Middle Manager Problem", "url": "https://johnkavanagh.co.uk/articles/ai-middle-manager-problem/", "published_at": "2026-06-04T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1408acd624a", "title": "Next.js Build Failing on Vercel: How to Find the First Real Failure", "url": "https://johnkavanagh.co.uk/articles/nextjs-build-failing-on-vercel/", "published_at": "2026-06-02T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1408b01d3ff", "title": "Technical GEO for Websites: Entities, Structured Data, and Crawl Paths", "url": "https://johnkavanagh.co.uk/articles/technical-geo-entities-structured-data-crawl-paths/", "published_at": "2026-05-31T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1408bb62f59", "title": "State Management in Angular: NgRx vs. SignalStore", "url": "https://johnkavanagh.co.uk/articles/state-management-in-angular-ngrx-vs-signalstore/", "published_at": "2026-05-27T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1408c82aae2", "title": "Schema for Service Pages Without Overclaiming", "url": "https://johnkavanagh.co.uk/articles/schema-for-service-pages-without-overclaiming/", "published_at": "2026-05-26T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1408ce55331", "title": "How Service Pages Become Answerable in AI Search", "url": "https://johnkavanagh.co.uk/articles/service-pages-for-ai-search-and-llm-retrieval/", "published_at": "2026-05-24T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1408dc3bc9e", "title": "AI is Making Technical Debt Cheaper to Create", "url": "https://johnkavanagh.co.uk/articles/ai-making-technical-debt-cheaper-to-create/", "published_at": "2026-05-23T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1408e0532b4", "title": "Traffic Dropped After a Replatform: The Technical Checks I Run First", "url": "https://johnkavanagh.co.uk/articles/traffic-dropped-after-replatform/", "published_at": "2026-05-21T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1408e8ff28e", "title": "E‑Commerce SEO Migration: Product and Category Pages in Next.js", "url": "https://johnkavanagh.co.uk/articles/ecommerce-seo-migration-product-category-pages-nextjs/", "published_at": "2026-05-20T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1408f6426f3", "title": "The AI Productivity Mirage: When More Output Does Not Mean More Value", "url": "https://johnkavanagh.co.uk/articles/ai-productivity-mirage-more-output-less-value/", "published_at": "2026-05-19T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1408f7e43a8", "title": "AI Will Be OK If We Stop Treating It Like Magic", "url": "https://johnkavanagh.co.uk/articles/ai-will-be-ok-if-we-stop-treating-it-like-magic/", "published_at": "2026-05-18T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1408feea01c", "title": "Should You Move a Shopify Storefront to Next.js?", "url": "https://johnkavanagh.co.uk/articles/shopify-to-nextjs-headless-commerce-decision/", "published_at": "2026-05-16T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140900f585a", "title": "What is Artificial Superintelligence (ASI)?", "url": "https://johnkavanagh.co.uk/articles/what-is-artificial-superintelligence-asi/", "published_at": "2026-05-15T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14090a2c134", "title": "What is a Timing Attack? Side Channels, Examples, and Safer Comparisons", "url": "https://johnkavanagh.co.uk/articles/what-is-a-timing-attack-examples-and-safer-comparisons/", "published_at": "2026-05-13T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140919bfb88", "title": "Next.js Multi‑Tenant Architecture", "url": "https://johnkavanagh.co.uk/articles/nextjs-multi-tenant-routing-configuration-content/", "published_at": "2026-05-12T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140928437dc", "title": "State Management in Vue: Vuex vs. Pinia", "url": "https://johnkavanagh.co.uk/articles/state-management-in-vue-vuex-vs-pinia/", "published_at": "2026-05-11T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14092a98b77", "title": "Content Security Policy in Next.js: Static Pages, Nonces, and Real‑World Trade‑Offs", "url": "https://johnkavanagh.co.uk/articles/content-security-policy-in-nextjs/", "published_at": "2026-05-09T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14092bb68ce", "title": "Pages Router to App Router Migration Risk Checklist", "url": "https://johnkavanagh.co.uk/articles/nextjs-app-router-migration-risk-checklist/", "published_at": "2026-05-08T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140933822df", "title": "What AEO is, and How It Fits with SEO and GEO", "url": "https://johnkavanagh.co.uk/articles/what-aeo-is-and-how-it-fits-with-seo-and-geo/", "published_at": "2026-05-07T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14093a34d8b", "title": "Core Web Vitals Got Worse After a Redesign", "url": "https://johnkavanagh.co.uk/articles/core-web-vitals-regression-after-redesign/", "published_at": "2026-05-04T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14093b1b2b2", "title": "Solving the LeetCode N‑Queens Problem", "url": "https://johnkavanagh.co.uk/articles/solving-the-n-queens-problem/", "published_at": "2026-05-03T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14094300880", "title": "The AI Layoff Trap: When Local Efficiency Becomes Systemic Fragility", "url": "https://johnkavanagh.co.uk/articles/the-ai-layoff-trap-local-efficiency-to-systemic-fragility/", "published_at": "2026-04-30T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14094619ef6", "title": "When Production Data Breaks a Next.js Site", "url": "https://johnkavanagh.co.uk/articles/production-data-makes-nextjs-fail/", "published_at": "2026-04-29T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14094a480e3", "title": "How to Vet a Senior Next.js Developer for a Replatform or Recovery Project", "url": "https://johnkavanagh.co.uk/articles/vet-senior-nextjs-developer-replatform-recovery/", "published_at": "2026-04-28T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1409535f8f4", "title": "Using Angular Signals for Performance Optimisation", "url": "https://johnkavanagh.co.uk/articles/using-angular-signals-for-performance-optimisation/", "published_at": "2026-04-27T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14095799d1f", "title": "Responsible AI Needs an Owner", "url": "https://johnkavanagh.co.uk/articles/responsible-ai-needs-an-owner/", "published_at": "2026-04-23T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140961f1fe7", "title": "NextAuth Works Locally but Fails in Production", "url": "https://johnkavanagh.co.uk/articles/nextauth-production-debugging-vercel/", "published_at": "2026-04-21T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14096400735", "title": "LeetCode: The 'Kth Smallest Element in a BST' Problem", "url": "https://johnkavanagh.co.uk/articles/leetcode-the-kth-smallest-element-in-a-bst-problem/", "published_at": "2026-04-20T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140971be682", "title": "Using RxJS for State Management in Angular", "url": "https://johnkavanagh.co.uk/articles/using-rxjs-for-state-management-in-angular/", "published_at": "2026-04-17T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140979916d8", "title": "Why Next.js Builds Time Out on Vercel", "url": "https://johnkavanagh.co.uk/articles/why-nextjs-builds-time-out-on-vercel/", "published_at": "2026-04-15T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14098845221", "title": "React Developer vs. Next.js Developer: What Actually Changes in Production", "url": "https://johnkavanagh.co.uk/articles/react-developer-vs-nextjs-developer-production/", "published_at": "2026-04-14T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14098ec6860", "title": "Backtracking Decision Trees: Solving 'Combination Sum'", "url": "https://johnkavanagh.co.uk/articles/backtracking-decision-trees-solving-combination-sum/", "published_at": "2026-04-13T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1409933d549", "title": "GEO vs. SEO: Where They Overlap, and Where They Don't", "url": "https://johnkavanagh.co.uk/articles/geo-vs-seo-where-they-overlap-and-where-they-dont/", "published_at": "2026-04-09T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14099490085", "title": "Next.js Site Broke After Deploy: A Production Triage Checklist", "url": "https://johnkavanagh.co.uk/articles/nextjs-site-broke-after-deploy-production-triage/", "published_at": "2026-04-07T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140999bd707", "title": "Solving the 'Jump Game' Problem with Greedy Algorithms", "url": "https://johnkavanagh.co.uk/articles/solving-the-jump-game-problem-with-greedy-algorithms/", "published_at": "2026-04-06T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b14099cfeaeb", "title": "Memoisation in JavaScript: Optimising Function Calls", "url": "https://johnkavanagh.co.uk/articles/memoization-in-javascript-optimising-function-calls/", "published_at": "2026-04-03T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1409ab7e6c4", "title": "Next.js Proxy Replaces Middleware: What Changes in Practice", "url": "https://johnkavanagh.co.uk/articles/next-js-proxy-replaces-middleware/", "published_at": "2026-04-02T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1409b5ceeb5", "title": "CMS Content Not Updating in Next.js", "url": "https://johnkavanagh.co.uk/articles/content-not-updating-from-cms-debugging-runbook/", "published_at": "2026-03-31T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1409b862fa2", "title": "Dynamic Programming in LeetCode: Solving 'Coin Change'", "url": "https://johnkavanagh.co.uk/articles/dynamic-programming-in-leetcode-solving-coin-change/", "published_at": "2026-03-30T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1409c285ed6", "title": "Handling API Routes in Next.js: When to Use Server Actions vs. API Routes", "url": "https://johnkavanagh.co.uk/articles/when-to-use-server-actions-vs-api-routes-in-nextjs/", "published_at": "2026-03-27T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1409d0e5b71", "title": "LeetCode: Finding the Diameter of a Binary Tree", "url": "https://johnkavanagh.co.uk/articles/leetcode-finding-the-diameter-of-a-binary-tree/", "published_at": "2026-03-25T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1409d4c7691", "title": "Headless CMS SEO Controls Checklist", "url": "https://johnkavanagh.co.uk/articles/headless-cms-seo-controls-checklist/", "published_at": "2026-03-24T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1409e3df803", "title": "Topological Sort: Solving the 'Course Schedule' Problem", "url": "https://johnkavanagh.co.uk/articles/topological-sort-solving-the-course-schedule-problem/", "published_at": "2026-03-23T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1409edb7548", "title": "Enterprise AI Delivery Starts After the Pilot", "url": "https://johnkavanagh.co.uk/articles/enterprise-ai-delivery-after-the-pilot/", "published_at": "2026-03-19T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1409f05bd3e", "title": "Technical SEO Launch Criteria for a Next.js Migration", "url": "https://johnkavanagh.co.uk/articles/technical-seo-launch-criteria-nextjs-migration/", "published_at": "2026-03-17T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1409fd55cd6", "title": "What GEO is, and Why It is Not Just SEO for AI", "url": "https://johnkavanagh.co.uk/articles/what-geo-is-and-why-it-is-not-just-seo-for-ai/", "published_at": "2026-03-16T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b1409ffd0c31", "title": "Understanding the Module Pattern in JavaScript", "url": "https://johnkavanagh.co.uk/articles/understanding-the-module-pattern-in-javascript/", "published_at": "2026-03-11T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140a0ab8454", "title": "How to Compare Rendered HTML Before and After a Migration", "url": "https://johnkavanagh.co.uk/articles/rendered-html-comparison-migration-audit/", "published_at": "2026-03-10T00:00:00+00:00" }, { "id": "01a0878f-6676-72b9-a6fb-b140a1a8b3ff", "title": "Multi‑Source BFS: Solving the 'Rotting Oranges' Problem", "url": "https://johnkavanagh.co.uk/articles/multi-source-bfs-solving-the-rotting-oranges-problem/", "published_at": "2026-03-09T00:00:00+00:00" } ] posts Claim your blog
Back to johnkavanagh.co.uk
Blog · corpus.blog/blogs/johnkavanagh.co.uk/posts

johnkavanagh.co.uk

johnkavanagh.co.uk

2026