<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Ship Log — Ayach Youssef</title><description>Engineering notes by Ayach Youssef. Every entry is something shipped, or something learned shipping it.</description><link>https://ayach.is-a.dev/</link><item><title>Learning Go by scratching a real itch: ci-status</title><link>https://ayach.is-a.dev/log/ci-status/</link><guid isPermaLink="true">https://ayach.is-a.dev/log/ci-status/</guid><description>A tiny Go CLI that checks GitHub Actions status across several repos at once — my first project in a new language, and the byte-vs-rune bug it taught me on day one.</description><pubDate>Mon, 14 Sep 2026 00:00:00 GMT</pubDate></item><item><title>Terraform without a cloud account: do-vm-terraform</title><link>https://ayach.is-a.dev/log/do-vm-terraform/</link><guid isPermaLink="true">https://ayach.is-a.dev/log/do-vm-terraform/</guid><description>A DigitalOcean droplet+firewall+DNS module, fully validated and tested against a mocked provider — and the Terraform `set` block bug that cost me an hour.</description><pubDate>Mon, 14 Sep 2026 00:00:00 GMT</pubDate></item><item><title>Building auth from scratch instead of installing it: auth-service</title><link>https://ayach.is-a.dev/log/auth-service/</link><guid isPermaLink="true">https://ayach.is-a.dev/log/auth-service/</guid><description>A standalone JWT auth microservice built against an explicit OWASP checklist — refresh-token rotation with reuse detection, argon2id, and timing-safe login failures, all decisions I can defend one by one.</description><pubDate>Sun, 13 Sep 2026 00:00:00 GMT</pubDate></item><item><title>Building a CI/CD + IaC pipeline from nothing: deploy-pipeline</title><link>https://ayach.is-a.dev/log/deploy-pipeline/</link><guid isPermaLink="true">https://ayach.is-a.dev/log/deploy-pipeline/</guid><description>A minimal link-shortener is the vehicle; the real project is the pipeline around it — GitHub Actions, Ansible-provisioned VPS, and nginx, wired end to end.</description><pubDate>Sun, 13 Sep 2026 00:00:00 GMT</pubDate></item><item><title>Real-time without a framework: live-room</title><link>https://ayach.is-a.dev/log/live-room/</link><guid isPermaLink="true">https://ayach.is-a.dev/log/live-room/</guid><description>A live poll room over WebSockets — vote counts and presence updating instantly for everyone in the room, with no page refresh and no polling.</description><pubDate>Sun, 13 Sep 2026 00:00:00 GMT</pubDate></item><item><title>Provisioning-as-code for monitoring: observability-stack</title><link>https://ayach.is-a.dev/log/observability-stack/</link><guid isPermaLink="true">https://ayach.is-a.dev/log/observability-stack/</guid><description>Prometheus and Grafana monitoring task-api-hardened, with the dashboard itself checked into git instead of clicked together — plus the honest story of adapting scope when a VPS wasn&apos;t there yet.</description><pubDate>Sun, 13 Sep 2026 00:00:00 GMT</pubDate></item><item><title>Extracting a library from my own repetition: strict-env</title><link>https://ayach.is-a.dev/log/strict-env/</link><guid isPermaLink="true">https://ayach.is-a.dev/log/strict-env/</guid><description>Every backend service this sprint hand-rolled the same env-var validation block. strict-env factors it out — zero dependencies, dual ESM/CJS, and reports every config problem at once instead of one restart at a time.</description><pubDate>Sun, 13 Sep 2026 00:00:00 GMT</pubDate></item><item><title>Hardening a toy CRUD API into something production-shaped</title><link>https://ayach.is-a.dev/log/task-api-hardened/</link><guid isPermaLink="true">https://ayach.is-a.dev/log/task-api-hardened/</guid><description>task-api-hardened takes a five-endpoint task list and wraps it in Redis-backed rate limiting, cache invalidation, and structured logging — the unglamorous layer that separates a demo from a service.</description><pubDate>Sun, 13 Sep 2026 00:00:00 GMT</pubDate></item><item><title>The fun slot: termdle</title><link>https://ayach.is-a.dev/log/termdle/</link><guid isPermaLink="true">https://ayach.is-a.dev/log/termdle/</guid><description>A Wordle clone that runs entirely in the terminal — this sprint&apos;s unserious project, and the one classic edge case (duplicate letters) it still had to get right.</description><pubDate>Sun, 13 Sep 2026 00:00:00 GMT</pubDate></item><item><title>Building something that acts without being asked: weather-pulse</title><link>https://ayach.is-a.dev/log/weather-pulse/</link><guid isPermaLink="true">https://ayach.is-a.dev/log/weather-pulse/</guid><description>A cron-scheduled service that snapshots real weather data into Postgres every 15 minutes, rendered through a dashboard with zero client-side JavaScript.</description><pubDate>Sun, 13 Sep 2026 00:00:00 GMT</pubDate></item><item><title>MCP servers in production: giving an AI agent hands, safely</title><link>https://ayach.is-a.dev/log/mcp-servers-in-production/</link><guid isPermaLink="true">https://ayach.is-a.dev/log/mcp-servers-in-production/</guid><description>OneBotAds&apos; chatbot launches real ad campaigns through Model Context Protocol servers spawned per request. Here&apos;s the architecture, why we spawn instead of keeping processes alive, and what I&apos;d tell anyone wiring an LLM to real APIs.</description><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate></item><item><title>From mockup to production in three months: a PFE postmortem</title><link>https://ayach.is-a.dev/log/pfe-postmortem/</link><guid isPermaLink="true">https://ayach.is-a.dev/log/pfe-postmortem/</guid><description>My final-year internship brief was a React mockup with nothing behind it. Three months later it was a live SaaS with six ad-platform integrations. What went right, what bit me, and what I&apos;d do differently.</description><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate></item></channel></rss>