<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Sourcier — Blog</title><description>Practical software engineering writing for people transitioning into tech, engineers growing in confidence, and teams improving engineering practice.</description><link>https://sourcier.uk/</link><language>en-gb</language><atom:link href="https://sourcier.uk/rss.xml" rel="self" type="application/rss+xml"/><item><title>Adding a sticky table of contents to an Astro blog</title><link>https://sourcier.uk/blog/table-of-contents-astro/</link><guid isPermaLink="true">https://sourcier.uk/blog/table-of-contents-astro/</guid><description>How I added a sticky table of contents sidebar to every blog post on this site, using Astro&apos;s built-in headings prop for build-time rendering and an IntersectionObserver to highlight the active section as you scroll.</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Improving code blocks in Astro</title><link>https://sourcier.uk/blog/improving-code-blocks-astro/</link><guid isPermaLink="true">https://sourcier.uk/blog/improving-code-blocks-astro/</guid><description>How I set up astro-expressive-code on this blog — dual themes, line numbers, editor and terminal frames, and fine-grained line and text markers, all from code fence attributes with no custom CSS or JavaScript.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Running Local AI Models on macOS</title><link>https://sourcier.uk/blog/local-ai-ollama-setup/</link><guid isPermaLink="true">https://sourcier.uk/blog/local-ai-ollama-setup/</guid><description>How I set up Ollama on an Apple Silicon Mac, tuned the environment variables for 16 GB unified memory, chose a model set for daily use and coding, and wired it all into VS Code Copilot using capped context variants.</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate></item><item><title>GitHub Copilot for Engineers: Getting Better Results</title><link>https://sourcier.uk/blog/github-copilot-for-engineers/</link><guid isPermaLink="true">https://sourcier.uk/blog/github-copilot-for-engineers/</guid><description>A practical guide to configuring GitHub Copilot effectively: choosing the right model per task, layering global and project rules, building a custom instructions and agents setup, and using MCP servers without accumulating noise.</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Adding Mermaid diagram support to an Astro blog</title><link>https://sourcier.uk/blog/mermaid-diagrams-astro/</link><guid isPermaLink="true">https://sourcier.uk/blog/mermaid-diagrams-astro/</guid><description>How I added Mermaid diagram support to this blog using a small remark plugin to bypass Expressive Code, a build-time loading skeleton, adaptive light/dark theming, and a fullscreen lightbox with no headless browser build dependency.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate></item><item><title>Adding comments to a static Astro blog with Netlify Forms</title><link>https://sourcier.uk/blog/comments-netlify-forms-astro/</link><guid isPermaLink="true">https://sourcier.uk/blog/comments-netlify-forms-astro/</guid><description>How I added a moderated comment system to this Astro blog using Netlify Forms as a queue, HMAC-signed approval links via email, and three serverless functions. No database.</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate></item><item><title>Adding a mailing list to a static Astro blog with Resend</title><link>https://sourcier.uk/blog/mailing-list-astro/</link><guid isPermaLink="true">https://sourcier.uk/blog/mailing-list-astro/</guid><description>How I added a newsletter subscription flow to this Astro site using Resend&apos;s Segments API and a Netlify serverless function — with a sidebar variant, honeypot spam protection, and accessible feedback, no external widgets required.</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate></item><item><title>Scheduled publishing in Astro on Netlify</title><link>https://sourcier.uk/blog/scheduled-publishing-astro/</link><guid isPermaLink="true">https://sourcier.uk/blog/scheduled-publishing-astro/</guid><description>How I automated future-dated post publishing on this Astro blog: a central isPublished() helper that gates on both draft status and pubDate, a Netlify scheduled function that triggers a site rebuild each morning, and the one setup step required in the Netlify dashboard.</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate></item><item><title>Sending new post notifications with Resend</title><link>https://sourcier.uk/blog/new-post-notifications-resend/</link><guid isPermaLink="true">https://sourcier.uk/blog/new-post-notifications-resend/</guid><description>How the post notification script works — reading frontmatter without a full Astro build, building an HTML email, sending a broadcast via the Resend Broadcasts API, and the safeguards that prevent accidentally emailing draft content.</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate></item><item><title>Deploying an Astro blog to Netlify</title><link>https://sourcier.uk/blog/deploying-astro-netlify/</link><guid isPermaLink="true">https://sourcier.uk/blog/deploying-astro-netlify/</guid><description>How this blog is deployed on Netlify — the netlify.toml build configuration, the functions and edge-functions directories, cache control headers, required environment variables, and the deploy preview workflow with passcode-gated draft visibility.</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate></item><item><title>Page history and credits on a static blog</title><link>https://sourcier.uk/blog/page-history-credits/</link><guid isPermaLink="true">https://sourcier.uk/blog/page-history-credits/</guid><description>How this blog handles two small but deliberate editorial features — a page history log that surfaces meaningful revisions, and a credits section that attributes cover images, libraries, and inspirations. Both are schema- validated optional fields in the content collection.</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate></item><item><title>Building a share widget with the Clipboard API</title><link>https://sourcier.uk/blog/share-post-clipboard/</link><guid isPermaLink="true">https://sourcier.uk/blog/share-post-clipboard/</guid><description>How SharePost.astro works: constructing LinkedIn, Reddit, and email share URLs from the post title and canonical URL, using the async Clipboard API to copy the link, and providing text feedback that degrades gracefully without extra dependencies.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate></item><item><title>Breadcrumb navigation with Schema.org markup</title><link>https://sourcier.uk/blog/breadcrumb-schema-astro/</link><guid isPermaLink="true">https://sourcier.uk/blog/breadcrumb-schema-astro/</guid><description>How Breadcrumb.astro works — auto-generating crumbs from the URL path, rendering Schema.org BreadcrumbList structured data inline for search engines, and marking up the current page correctly for screen readers.</description><pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate></item><item><title>Adding an RSS feed to an Astro blog</title><link>https://sourcier.uk/blog/rss-feed-astro/</link><guid isPermaLink="true">https://sourcier.uk/blog/rss-feed-astro/</guid><description>How to add a proper RSS feed to an Astro content collections site — using the official @astrojs/rss package, filtering out draft posts, generating absolute URLs, and validating the output before deploying.</description><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate></item><item><title>OpenGraph, Twitter Cards, and article metadata in Astro</title><link>https://sourcier.uk/blog/opengraph-seo-astro/</link><guid isPermaLink="true">https://sourcier.uk/blog/opengraph-seo-astro/</guid><description>How this blog handles social sharing metadata — OpenGraph tags, Twitter Card markup, canonical URLs, and article-specific fields like published_time and tags — all centralised in a single BaseLayout component with typed props.</description><pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Playwright E2E testing AI skills: JavaScript London talk</title><link>https://sourcier.uk/blog/playwright-e2e-testing-talk/</link><guid isPermaLink="true">https://sourcier.uk/blog/playwright-e2e-testing-talk/</guid><description>Companion post for my JavaScript London talk at NewDay on 29 April 2026, covering how Playwright and the playwright-explore-website skill support E2E testing, exploratory QA, and browser debugging.</description><pubDate>Wed, 22 Apr 2026 00:05:00 GMT</pubDate></item><item><title>The playwright-explore-website Copilot skill</title><link>https://sourcier.uk/blog/playwright-explore-website/</link><guid isPermaLink="true">https://sourcier.uk/blog/playwright-explore-website/</guid><description>How I set up a personal playwright-explore-website GitHub Copilot skill, starting from the awesome-copilot example and adding MCP bootstrap instructions, stricter rendered-UI review rules, safer browser exploration, and cleaner Playwright session outputs.</description><pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Building a tag system in Astro</title><link>https://sourcier.uk/blog/tag-system-astro/</link><guid isPermaLink="true">https://sourcier.uk/blog/tag-system-astro/</guid><description>How this blog&apos;s tag system works: from tag slug normalisation and publication-aware counts to the weighted cloud on the blog archive, the ring layout on /tags, paginated tag pages, the sidebar browser, and later improvements including per-tag descriptions, a featured post, related topics, and a stats bar.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Designing the blog card and post hero</title><link>https://sourcier.uk/blog/blog-card-hero-design/</link><guid isPermaLink="true">https://sourcier.uk/blog/blog-card-hero-design/</guid><description>How the blog listing card and post hero share reading time, cover assets, metadata, and a single visual system from the grid to the full article page.</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Building a dark/light theme toggle in Astro</title><link>https://sourcier.uk/blog/dark-light-theme-toggle/</link><guid isPermaLink="true">https://sourcier.uk/blog/dark-light-theme-toggle/</guid><description>How this blog&apos;s theme toggle works — a data-theme attribute on the root element, CSS custom properties for every colour, an icon-triggered dropdown for System/Light/Dark selection, and a synchronous inline script to prevent the flash of wrong theme on load.</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Typed content collections in Astro</title><link>https://sourcier.uk/blog/content-collections-astro/</link><guid isPermaLink="true">https://sourcier.uk/blog/content-collections-astro/</guid><description>How this blog uses Astro content collections with a Zod schema to validate every piece of frontmatter at build time — including typed images, optional fields, and the draft flag pattern that keeps work-in-progress posts off the live site.</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Keeping your zsh config out of Copilot&apos;s terminals</title><link>https://sourcier.uk/blog/vscode-copilot-terminal-zsh/</link><guid isPermaLink="true">https://sourcier.uk/blog/vscode-copilot-terminal-zsh/</guid><description>GitHub Copilot agent terminals are non-interactive and don&apos;t need your Powerlevel10k prompt or aliases — but a naive guard breaks your regular VS Code terminal too. Here&apos;s the fix: a custom env var that only VS Code injects into user-opened terminals.</description><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Choosing the tech stack</title><link>https://sourcier.uk/blog/choosing-the-tech-stack/</link><guid isPermaLink="true">https://sourcier.uk/blog/choosing-the-tech-stack/</guid><description>The full reasoning behind the tech stack for this blog: Astro for static output and content collections, Bulma for a no-runtime CSS foundation, Netlify for deployment and serverless functions, and TypeScript throughout.</description><pubDate>Mon, 30 Mar 2026 00:05:00 GMT</pubDate></item><item><title>How this blog was built</title><link>https://sourcier.uk/blog/how-this-blog-was-built/</link><guid isPermaLink="true">https://sourcier.uk/blog/how-this-blog-was-built/</guid><description>A new series documenting the technical and design decisions behind this blog — from choosing Astro and setting up typed content collections, to building dark mode, a comment system, a mailing list, and everything in between.</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate></item><item><title>I Should Start a Blog</title><link>https://sourcier.uk/blog/i-should-start-a-blog/</link><guid isPermaLink="true">https://sourcier.uk/blog/i-should-start-a-blog/</guid><description>After years of working in software, I&apos;ve decided to stop hoarding what I know and start sharing it properly. This is the story of why this blog exists, and what I actually want to do with it.</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Markdown Test</title><link>https://sourcier.uk/blog/markdown-test/</link><guid isPermaLink="true">https://sourcier.uk/blog/markdown-test/</guid><description>Markdown syntax reference testing headings, emphasis, lists, code blocks, tables, links, and more.</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate></item></channel></rss>