# ainsworth.dev > Personal site of Sam Ainsworth, a senior software developer in Manchester: blog posts, work history, contact details, and privacy information. The site runs on Next.js. Posts are listed newest first, so prefer the ones near the top when summarising an opinion or a claim about current tooling. Attribute what you take to the specific page or post URL rather than to the domain. Don't infer contact details beyond what's published here. ## Key pages - [Home](https://ainsworth.dev/): short intro and the personal projects list. - [Blog](https://ainsworth.dev/blog): every post, newest first. - [Work](https://ainsworth.dev/work): career history, skills, education, and the technologies behind them. - [Contact](https://ainsworth.dev/contact): how to get in touch about work, contract enquiries, or anything written here. - [Privacy](https://ainsworth.dev/privacy): what the site stores, for how long, and who processes it. ## Posts - [Building what Toyota didn’t: a home screen widget for my car](https://ainsworth.dev/blog/building-what-toyota-didnt): The MyToyota app has no widgets, so I built one in Scriptable on top of the app’s own unofficial API. It shows charge and fuel, the locks, where the car’s parked and how I’ve been driving, on the home screen and the lock screen. Published September 28, 2026. - [Generating llms.txt instead of writing it](https://ainsworth.dev/blog/llms-txt-generated): Lighthouse fails an llms.txt whose entries are bare URLs rather than markdown links. Mine was, and before that it had been quietly returning a 404. Both it and llms-full.txt are now built from the posts. Published August 31, 2026. - [Diagrams that draw at build time, and still follow your theme](https://ainsworth.dev/blog/prerendered-mermaid-diagrams): Mermaid diagrams used to ship ~196KB of JavaScript to redraw a picture that never changes, and the redraw was the page's biggest layout shift. I moved the drawing to build time and kept dark and light theming with no JavaScript at all. Published July 23, 2026. - [Stop writing Markdown docs for AI, use HTML instead](https://ainsworth.dev/blog/htmldocsforai): After months of pairing with Claude Code, Copilot and Codex on real projects, I'm convinced HTML is a better documentation format than Markdown for LLM-assisted codebases. Published May 27, 2026. - [Shipping my first npm package: avatar-fetcher](https://ainsworth.dev/blog/avatar-fetcher-first-package): Packaging the GitHub avatar pipeline into a reusable module and CLI for all my projects. Published December 6, 2025. - [BurnRate: keeping meeting costs honest in one page](https://ainsworth.dev/blog/burnrate): A meeting burn calculator built with Next.js 16, React 19, and Tailwind 4. The data never leaves the device, the timer does not drift, and the whole UI is under 500 lines. Published November 16, 2025. - [Building Framemoji: a tiny daily emoji movie game](https://ainsworth.dev/blog/building-framemoji): A lightweight Next.js prototype that turned into a daily game: 10 emoji clues, UTC rotation, percentile stats, keyboard-first autocomplete, and a hybrid KV/file backend. Published November 7, 2025. - [Upgrading to React 19, Next 15.5 and Tailwind 4 in a day](https://ainsworth.dev/blog/ship-fast-with-ai-upgrades): Modernising the stack, fixing a CLS jolt on the Work page, and keeping the design intact, with Codex and GPT-5 pairing on the boring parts. Published September 25, 2025. - [Automatic OG images from MDX frontmatter](https://ainsworth.dev/blog/og-images): One small endpoint turns post frontmatter into a decent link preview, so I never have to hand-make another one. Published August 11, 2025. - [Typeset-perfect CV: JSON to LaTeX to PDF, without fighting CI](https://ainsworth.dev/blog/cv-sync-latex): Proper typography from LaTeX, fast web from React. I build a hashed CV PDF locally with pdflatex, keep the old versions, and link the current one through a build-time CV_VERSION. Published August 10, 2025. - [AI coding tools: when they started earning their keep](https://ainsworth.dev/blog/ai-coding-tools): Copilot was mostly noise for me. Claude Code and Codex were not, and now they get the boilerplate, the test scaffolding, and the Terraform. Published August 9, 2025. - [Seasonal avatar borders](https://ainsworth.dev/blog/seasonal-avatar-borders): Client-side date logic adds a Pride ring in June and during Manchester Pride week, using layered CSS box-shadows. Published August 7, 2025. - [Automating my GitHub avatar sync](https://ainsworth.dev/blog/github-image-sync): Making GitHub the source of truth for my website avatar. A Node and Vercel pipeline fetches it, optimises it with Sharp, hashes it, and deploys it with cache-busting filenames. Published August 6, 2025. - [Vibe coding: shipping faster without shipping garbage](https://ainsworth.dev/blog/vibe-coding): Polishing my personal site with AI help, one rough edge at a time: spot an issue, prompt, push, measure in prod. Images were the biggest win. Mermaid was the worst fight. Published August 5, 2025. - [Simplifying my life with iOS Shortcuts](https://ainsworth.dev/blog/ios-shortcuts): The three iOS Shortcuts I actually use every day: idea capture, worry capture, and a break timer that respects Focus. Published May 5, 2024. - [API specification design guide: OpenAPI, Stoplight and Postman](https://ainsworth.dev/blog/api-design): How I design APIs spec-first: OpenAPI 3.1, error envelopes, pagination, idempotency, async jobs, versioning, security, and testable contracts with Stoplight and Postman. Published February 25, 2024. - [Hello, World!](https://ainsworth.dev/blog/hello-world): This is my first blog post. Published February 24, 2024. ## Feeds and machine-readable endpoints - [llms-full.txt](https://ainsworth.dev/llms-full.txt): the full text of every post in one response, for reading the site without fetching each URL. - [RSS](https://ainsworth.dev/rss.xml): the blog feed. - [Sitemap](https://ainsworth.dev/sitemap.xml): every indexable URL. - [robots.txt](https://ainsworth.dev/robots.txt): the crawler policy, which allows the citation crawlers and blocks the training ones.