adrian@portfolio:~/blog
Blog
Notes on Astro, eCommerce, performance and engineering practice.
19 entries
- 01Use Claude Code with Any Model via OpenRouterClaude Code reads a few environment variables that pick the endpoint and the model. Point them at OpenRouter and the model becomes a flag.09/2026
- 02Scoring a Fantasy League on Data That Has Not ArrivedA music fantasy league scores teams on streaming growth from a third-party API. That API is sparse, late and revisable, and every backend decision follows.09/2026
- 03The Rate Limiter Was the OutageA KV-backed rate limiter wrote one key per request against a 1,000-writes-a-day tier. When the quota ran out, the thing protecting the API took it down.09/2026
- 04Writing Every Component Twice to Stop a Preview LyingA resizable preview makes viewport breakpoints lie. The fix was two files per component, one for the viewport and one for the container.09/2026
- 05Astro Actions and Vanilla JS for Form ValidationBuild a contact form with Astro Actions: server-side validation in the Action, vanilla JavaScript for the UI, no client framework.08/2025
- 06Automate a Google Merchant Center Feed with Node.jsSync an eCommerce catalogue with Google Merchant Center through the Content API: service account, batch inserts and a daily cron.08/2025
- 07AI Product Search for eCommerce with Orama and OpenAIHow hybrid vector search with Orama and OpenAI embeddings changed product discovery on a padel store: index pipeline, fallbacks and CRO wins.05/2025
- 08Redsys with Next.js 15, Part 2: Payment NotificationsHandle Redsys notifications in Next.js 15: the notification route, signature checks, idempotency and why the order must come from your database.03/2025
- 09Scrape Products into Sanity CMS with Cheerio and CronMove a WordPress catalogue into Sanity CMS: scrape product pages with Cheerio, validate and enrich the data, then keep it in sync with cron.03/2025
- 10Redsys Payments in Next.js 15 with Server ActionsIntegrate Redsys in Next.js 15: environment variables, the signing client, a Server Action and the redirect form that starts the payment.02/2025
- 11TinaCMS: A Headless CMS with Git Version ControlTinaCMS stores content as Markdown and JSON in Git, with live editing on top. How it works, when it fits and what the setup actually involves.01/2025
- 12Using Notion to Run Freelance Web ProjectsThe Notion setup I use as a freelance developer: one database per project, a client pipeline, and templates that keep proposals and handovers short.01/2025
- 13What Astro Actually Changes for SEOAstro does not rank by itself. Static HTML, opt-in islands and a typed content layer are what the crawler gets. Where it wins and where a SPA does.12/2024
- 148 Product Page Optimization Tips That Lift ConversionsEight product page fixes that lift conversion: clarity, photography, variants, copy, trust and the details most stores skip.02/2024
- 15Brand Narrative for Websites: Structure and ExamplesHow to build a brand narrative a website can use: message, homepage promise, proof along the journey and the tests that keep it honest.09/2023
- 16Scrum for Web Projects: Sprints, Roles and EstimatesHow Scrum works on a client web project: sprint length, user stories, story points, the two roles that matter and where the process breaks.09/2023
- 17Graphic Design for Digital Marketing: What MattersVisual identity, formats per channel and image weight: the graphic design decisions that affect attention, trust and page speed.08/2023
- 18Technical SEO Checklist for a New WebsiteA practical technical SEO checklist for a new site: crawlability, information architecture, internal links, metadata and the audits that catch regressions.07/2023
- 19Responsive Design and Core Web Vitals: A Field GuideResponsive design is a performance budget, not a breakpoint list: mobile-first layout, image strategy and how it moves LCP and CLS.06/2023