<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>onlyascii.dev</title><link>https://onlyascii.dev/</link><description>Recent content on onlyascii.dev</description><generator>Hugo</generator><language>en-gb</language><lastBuildDate>Sun, 12 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://onlyascii.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>onlyascii.dev — a tech blog and profile</title><link>https://onlyascii.dev/posts/hello-world/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/hello-world/</guid><description>&lt;p&gt;This is onlyascii.dev — my personal blog and profile. I&amp;rsquo;m Panos Xynos, a platform engineer and SRE. This is where I write about the things I build, the experiments I run, and the methodology I develop along the way.&lt;/p&gt;
&lt;p&gt;The site shares the terminal/phosphor aesthetic of the &lt;a href="https://onlyascii.io"&gt;OnlyASCII&lt;/a&gt; company site because it is the same brand. Same dark background, same phosphor green accent, same monospace discipline. The difference is purpose. onlyascii.io is the consultancy. onlyascii.dev is the workshop.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter -1: Deeper Roots</title><link>https://onlyascii.dev/posts/chapter-minus-1-deeper-roots/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-minus-1-deeper-roots/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-minus-1-deeper-roots.png" alt="Deeper Roots"&gt;&lt;/p&gt;
&lt;p&gt;I found a gist today. Two years old. And it stopped me cold.&lt;/p&gt;
&lt;p&gt;The URL is still live: &lt;a href="https://gist.github.com/dark5un/cd1a9b8162958c75026d7c9fb72740c4"&gt;gist.github.com/dark5un/cd1a9b8162958c75026d7c9fb72740c4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Debian bookworm 12 ML Tooling installation notes &amp;amp; more.&lt;/em&gt; I wrote it in January 2024. A raw Markdown document with every command I ran to set up a machine for AI work — NVIDIA drivers, CUDA toolkit, Docker with GPU passthrough, ASDF version manager for half a dozen languages, Neovim with NvChad, Oh-My-Zsh, Syncthing, the whole stack.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 00: Two Voices</title><link>https://onlyascii.dev/posts/chapter-00-two-voices/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-00-two-voices/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-00-two-voices.png" alt="Two Voices"&gt;&lt;/p&gt;
&lt;p&gt;A note about these chapters.&lt;/p&gt;
&lt;p&gt;You might notice the articles in this series do not all sound like me. They were written by my padawan, OrsonRius — the Hermes Agent that implements while I architect. The ideas are mine. The experiments are mine. The code is ours. But the voice in those chapters is not the one I use when I write for myself.&lt;/p&gt;
&lt;p&gt;I wanted it that way. I wanted to see if an AI could capture the shape of a thought without losing the substance. And it did. The chapters are clear, honest, and they follow the work faithfully. But they are from both of us.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 01: How I Steer My Padawan</title><link>https://onlyascii.dev/posts/chapter-01-how-i-steer/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-01-how-i-steer/</guid><description>&lt;p&gt;I am the architect. My padawan OrsonRius is the implementer. I design the approach, frame the problem, set the boundaries. He turns the cranks, writes the code, and reports back what he finds.&lt;/p&gt;
&lt;p&gt;This dynamic is the core of how I work. It is not delegation. It is steering.&lt;/p&gt;
&lt;p&gt;I communicate intent, not instructions. Instead of &amp;ldquo;run this command and paste the output,&amp;rdquo; I say &amp;ldquo;I want to understand the blast radius before we touch code. Map every caller of this function, every test that could break. Write it down.&amp;rdquo; The padawan executes. I review. I adjust.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 1.5: The First Steering</title><link>https://onlyascii.dev/posts/chapter-1-5-first-steering/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-1-5-first-steering/</guid><description>&lt;p&gt;&lt;em&gt;This is a steering note — a behind-the-scenes look at how I communicate intent to my padawan between experiments. These entries sit between the main chapters.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When I set up the weather-cli experiment, I did not give my padawan a specification. I gave him a framing.&lt;/p&gt;
&lt;p&gt;I said: &amp;ldquo;I want to know whether an AI can build a complete Rust CLI from scratch using TDD with LSP as a guardrail. The subject is a weather forecast tool. It needs to fetch real data from an API, parse it, and display it in the terminal. Use the RED-GREEN-REFACTOR loop. One behavior per cycle. Commit per cycle. Tag the trace.&amp;rdquo;&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 02: Weather CLI, A Complete Loop</title><link>https://onlyascii.dev/posts/chapter-02-weather-cli-completion/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-02-weather-cli-completion/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-02-pipeline.png" alt="Pipeline Diagram"&gt;&lt;/p&gt;
&lt;p&gt;I built a weather CLI and asked my padawan to drive it through completion.&lt;/p&gt;
&lt;p&gt;The first experiment was about whether an AI could write Rust from scratch using TDD and LSP as a guardrail. It could. But one experiment doesn&amp;rsquo;t prove a methodology. You need to see it land the plane. Take a project from zero to a complete, tested, working CLI that does something real.&lt;/p&gt;
&lt;p&gt;The project was a weather forecast CLI. Fetch current conditions and a five-day forecast from the Open-Meteo API, display them in the terminal. Nothing fancy. But real enough to stress the pipeline.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 2.5: The LSP Insight</title><link>https://onlyascii.dev/posts/chapter-2-5-lsp-insight/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-2-5-lsp-insight/</guid><description>&lt;p&gt;&lt;em&gt;Steering note — the moment the methodology shifted.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;After the weather-cli experiment, I had a problem. The padawan&amp;rsquo;s discipline was good. But I noticed something in the trace: every cycle had a &amp;ldquo;compile then debug&amp;rdquo; phase. He would write code, hit compile, see an error, fix it, compile again. Each compile was seconds lost.&lt;/p&gt;
&lt;p&gt;The insight came while I was watching VS Code. Red squiggles in the editor. LSP catching the error before the file was saved. I thought: that is what the padawan needs. Not a compile loop. An editor loop.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 03: Building with a Tether</title><link>https://onlyascii.dev/posts/chapter-03-lsp-tether/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-03-lsp-tether/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-03-pipeline.png" alt="Pipeline TDD + LSP Tether"&gt;&lt;/p&gt;
&lt;p&gt;I had this thought a while back. When an AI writes code, it guesses. It guesses function names, return types, what a library exports. And sometimes it guesses wrong. The code compiles but the logic is built on thin air.&lt;/p&gt;
&lt;p&gt;I wondered: what if we could tether the AI to something real during the writing process? Something that catches the bad guess before it becomes a test failure or, worse, a bug in production.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 3.5: Designing Traceability</title><link>https://onlyascii.dev/posts/chapter-3-5-designing-traceability/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-3-5-designing-traceability/</guid><description>&lt;p&gt;&lt;em&gt;Steering note — designing the trace tag pattern.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;After mini-clap, I had another problem. The code was good. The LSP tether worked. But when I looked at the repository, I could not see the reasoning. I saw one commit: &amp;ldquo;feat: CLI argument parser.&amp;rdquo; Where were the ten cycles? Where was the RED phase? Where was the refactor?&lt;/p&gt;
&lt;p&gt;An AI does not explain itself. It produces. If I could not reconstruct the reasoning from the repo, how could anyone else?&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 04: Making Thought Visible</title><link>https://onlyascii.dev/posts/chapter-04-git-traceability/</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-04-git-traceability/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-04-pipeline.png" alt="Git Traceability Pipeline"&gt;&lt;/p&gt;
&lt;p&gt;After the first experiment I had a new problem. The LSP tether worked. The AI wrote good code. Tests passed, coverage was high. But when I looked at the repository, I saw one commit. One wall of code. No trace of how we got there.&lt;/p&gt;
&lt;p&gt;An AI does not explain itself. It produces. And production without explanation is hard to trust, especially when you have to review it later.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 05: Polishing the Output</title><link>https://onlyascii.dev/posts/chapter-05-writing-quality/</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-05-writing-quality/</guid><description>&lt;p&gt;I had three repos full of chapters and articles. Markdown files. Well written, I thought. But I wondered: how clean are they really? Are there broken patterns I am not seeing because I am too close to the text?&lt;/p&gt;
&lt;p&gt;So I asked my padawan to audit the writing quality using automated tools.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;markdownlint&lt;/strong&gt; caught two things right away. First, the line length rule. Default is 80 characters, which works for code but not for prose. Every single paragraph in every chapter was flagged. I turned that rule off for chapters. Second, a missing newline at the end of each file. Easy fix.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 06: The Pipeline on My Own Machine</title><link>https://onlyascii.dev/posts/chapter-06-local-inference/</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-06-local-inference/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-06-local-inference.png" alt="Local Inference"&gt;&lt;/p&gt;
&lt;p&gt;The whole point of this series is local inference for development. Data ownership matters. When the model runs on your machine, the code never leaves. No API calls, no token billing, no third party seeing what you are working on. I want development to work on my own machine. The cloud is just a tool to move faster while we figure things out.&lt;/p&gt;
&lt;p&gt;DeepSeek V4 Flash is the reason this is possible. I use their cloud service and I am really happy with it. It is insanely cheap and does the job I need. Full credit where it is due.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 07: The Three-Line Fix That Broke Three Tests</title><link>https://onlyascii.dev/posts/chapter-07-afero-bug-fix/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-07-afero-bug-fix/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-07-afero.png" alt="Afero Experiment"&gt;&lt;/p&gt;
&lt;p&gt;I had my padawan fix a bug in an open source Go library. Nothing unusual. He jumped in, found the problem, wrote a test, fixed it. Standard stuff.&lt;/p&gt;
&lt;p&gt;Then a test broke. Then another. Then we found a composite filesystem was missing a pattern that a different one already had.&lt;/p&gt;
&lt;p&gt;Three surprises across 20 minutes. The fix itself took three lines. The debugging took the rest.&lt;/p&gt;
&lt;p&gt;The codebase was &lt;strong&gt;afero&lt;/strong&gt;, a filesystem abstraction library for Go. It has two backends: an in-memory one (MemMapFs) and a real OS one (OsFs). The bug was straightforward: creating a file in a non-existent directory silently created the directory on MemMapFs, but returned an error on OsFs. Tests passed on the in-memory backend, then failed in production on the real one.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 08: The Slower Approach Is Faster</title><link>https://onlyascii.dev/posts/chapter-08-afero-formal-process/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-08-afero-formal-process/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-08-afero.png" alt="Afero Experiment 02"&gt;&lt;/p&gt;
&lt;p&gt;I designed a formal process for fixing bugs in unfamiliar codebases. My padawan just proved it works.&lt;/p&gt;
&lt;p&gt;We have the same project, same pattern of bug, two approaches. The first time we jumped in and fixed it (Chapter 07). The second time we followed the process I designed.&lt;/p&gt;
&lt;p&gt;The comparison is worth writing down.&lt;/p&gt;
&lt;p&gt;The first bug took 20 minutes. Three tests broke that we did not see coming. The fix was found through failures.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 9.5: The Sites</title><link>https://onlyascii.dev/posts/chapter-9-5-the-sites/</link><pubDate>Sat, 04 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-9-5-the-sites/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-9-5-sites.png" alt="Production vs R&amp;amp;D"&gt;&lt;/p&gt;
&lt;p&gt;I have had onlyascii.dev for a long time. It was never close to what it is now.&lt;/p&gt;
&lt;p&gt;The Philosophical Developer series changed that. Every chapter is a real experiment with real code, real tests, real outcomes. The code is on GitHub. The trace tags are there for anyone to verify. The methodology is developed openly with my young Padawan OrsonRius.&lt;/p&gt;
&lt;p&gt;I was publishing these on LinkedIn. That worked, but it is not where the work lives. LinkedIn is for announcements. The blog is for the work itself. The full chapters, the header images, the navigation between them, the RSS feed for people who remember what that is.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 09: Language Transfer</title><link>https://onlyascii.dev/posts/chapter-09-tqdm/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-09-tqdm/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-09-tqdm.png" alt="tqdm"&gt;&lt;/p&gt;
&lt;p&gt;I moved my padawan from Go to Python for Chapter 09. I wanted to know if the methodology transfers. The same four phases: reconnaissance, work item, RED test, fix. Different language, different ecosystem, different testing framework. The question was not whether it works for Go. The question was whether it works in general.&lt;/p&gt;
&lt;p&gt;The codebase was &lt;strong&gt;tqdm&lt;/strong&gt;, a progress bar library that has been installed over 200 million times. Nine thousand lines of Python spread across a well-organised package. Tests using pytest. Issues managed with labels. A mature project with a clear architecture.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Process Note: Delivery Audit</title><link>https://onlyascii.dev/posts/process-note-delivery-audit/</link><pubDate>Sat, 04 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/process-note-delivery-audit/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/process-note-delivery.png" alt="Delivery Audit"&gt;&lt;/p&gt;
&lt;p&gt;We finished Chapter 09 of The Philosophical Developer. Three bugs from the tqdm issue tracker, two fixed, one documented dead end. All code pushed, all meditations written, all branches tagged.&lt;/p&gt;
&lt;p&gt;Then I asked my padawan to check everything.&lt;/p&gt;
&lt;p&gt;Empty files. Missing meditations. Reconnaissance reports that existed on the fork branch but never made it to the lab mirror. Not everything was broken, but enough was missing that I could not trust the delivery without inspecting it file by file.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 10: Building Blindfolded</title><link>https://onlyascii.dev/posts/chapter-10-mcp/</link><pubDate>Wed, 08 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-10-mcp/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-10-mcp.png" alt="MCP"&gt;&lt;/p&gt;
&lt;p&gt;I gave my padawan a spec that did not exist. No codebase to fork. No issue tracker to mine. Just an API documentation page and a blank &lt;code&gt;cargo new&lt;/code&gt;. The task: build a Model Context Protocol server that wraps the FreeAgent accounting API. The constraints: strict TDD, no cutting corners, full API compatibility.&lt;/p&gt;
&lt;p&gt;The question was not whether the methodology works on greenfield projects. The question was whether it works when there is nothing to trace into.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 11: Running Local</title><link>https://onlyascii.dev/posts/chapter-11-local-inference/</link><pubDate>Wed, 08 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-11-local-inference/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-11-local.png" alt="Local Inference"&gt;&lt;/p&gt;
&lt;p&gt;Behind every chapter there is a machine. Behind every machine there is a model. And behind every model there is someone wrestling with build flags at 2am.&lt;/p&gt;
&lt;p&gt;This one was me.&lt;/p&gt;
&lt;h2 id="the-hardware"&gt;The hardware&lt;/h2&gt;
&lt;p&gt;An RTX 5090. 32 GB of VRAM. Sitting in a room that hits 31°C in the UK summer. The kind of card that turns your desk into a space heater. The kind of card that makes you check GPU temperature like it&amp;rsquo;s a toddler&amp;rsquo;s forehead.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 12: Recursive Language Models</title><link>https://onlyascii.dev/posts/chapter-12-rlm/</link><pubDate>Wed, 08 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-12-rlm/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-12-rlm.png" alt="Recursive Language Models Experiment"&gt;&lt;/p&gt;
&lt;p&gt;What happens when you ask an AI to read a 94,000-line codebase in one sitting? The context window swells, attention dilutes, and the analysis becomes&amp;hellip; superficial. You get the broad strokes but miss the details that actually matter.&lt;/p&gt;
&lt;p&gt;This is the problem that Recursive Language Models solve.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Paper&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Zhang &amp;amp; Khattab from MIT CSAIL published &amp;ldquo;Recursive Language Models&amp;rdquo; (arXiv:2512.24601) describing a deceptively simple pattern: instead of dumping everything into one massive prompt, decompose the input into chunks, dispatch each to an independent model call, then aggregate the results.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 13: Why Local Matters</title><link>https://onlyascii.dev/posts/chapter-13-local-matters/</link><pubDate>Thu, 09 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-13-local-matters/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-13-hero.png" alt="Local Cloud Infrastructure"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/dark5un/local-cloud"&gt;All code for this series lives in the &lt;strong&gt;local-cloud&lt;/strong&gt; repo on GitHub.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Three things converged in 2025-2026 that make this timely:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. LocalStack&amp;rsquo;s Community Edition was sunset in March 2026.&lt;/strong&gt; The go-to free local AWS emulator went proprietary overnight. Teams that built their entire local dev workflow around it suddenly needed an auth token, were hitting feature gates, or were paying.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Cloud providers raised prices across the board.&lt;/strong&gt; AWS, Azure, GCP all increased pricing. Egress fees became a real business decision point, not just an ops footnote.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 14: Code Your Infrastructure</title><link>https://onlyascii.dev/posts/chapter-14-infra-code/</link><pubDate>Thu, 09 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-14-infra-code/</guid><description>&lt;h1 id="code-your-infrastructure"&gt;Code Your Infrastructure&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-14-hero.png" alt="TDD-Driven Infrastructure as Code"&gt;&lt;/p&gt;
&lt;p&gt;Last chapter we stood up the local cloud: Floci as our AWS emulator, a local registry, k3s in k3d. It works. But &amp;ldquo;works&amp;rdquo; is a state, not a guarantee.&lt;/p&gt;
&lt;p&gt;Infrastructure as code turns states into contracts.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/dark5un/local-cloud"&gt;All code for this series lives in the &lt;strong&gt;local-cloud&lt;/strong&gt; repo on GitHub.&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="why-opentofu"&gt;Why OpenTofu&lt;/h3&gt;
&lt;p&gt;OpenTofu forked from Terraform when HashiCorp switched to BUSL. The code is the same. The philosophy diverged — OpenTofu stayed open source, community-governed, and committed to backward compatibility. For a project about sovereignty and local control, that alignment matters.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 15: The Pipeline</title><link>https://onlyascii.dev/posts/chapter-15-the-pipeline/</link><pubDate>Thu, 09 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-15-the-pipeline/</guid><description>&lt;h1 id="the-pipeline"&gt;The Pipeline&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-15-hero.png" alt="CI/CD Pipeline"&gt;&lt;/p&gt;
&lt;p&gt;Last chapter we coded infrastructure with OpenTofu — five modules, seven tests, all passing. But a test suite that runs locally is a habit, not a guarantee. The difference between discipline and assurance is automation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Code without a pipeline is a promise. Code with a pipeline is a proof.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/dark5un/local-cloud"&gt;Pipeline code lives in the &lt;strong&gt;local-cloud&lt;/strong&gt; repo on GitHub.&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;Every change to the local-cloud stack went through this flow:&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 16: Deploy to the Local Cloud</title><link>https://onlyascii.dev/posts/chapter-16-deploy-local-cloud/</link><pubDate>Thu, 09 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-16-deploy-local-cloud/</guid><description>&lt;h1 id="deploy-to-the-local-cloud"&gt;Deploy to the Local Cloud&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-16-hero.png" alt="Deploy to the Local Cloud"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/dark5un/local-cloud"&gt;All code for this series lives in the &lt;strong&gt;local-cloud&lt;/strong&gt; repo on GitHub.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve spent four chapters building the foundation: a local cloud environment with Floci, k3s, TDD infrastructure modules, and an automated CI/CD pipeline. Now we deploy.&lt;/p&gt;
&lt;h2 id="the-kubernetes-module"&gt;The Kubernetes Module&lt;/h2&gt;
&lt;p&gt;The k8s module creates three resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Namespace&lt;/strong&gt; — isolates the local-cloud workloads&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployment&lt;/strong&gt; — runs the application with configurable replicas&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service&lt;/strong&gt; — exposes the deployment as a ClusterIP&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tdd-first"&gt;TDD First&lt;/h3&gt;
&lt;p&gt;Following the same pattern as every module before it, we wrote the test first:&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 17: Observability</title><link>https://onlyascii.dev/posts/chapter-17-observability/</link><pubDate>Thu, 09 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-17-observability/</guid><description>&lt;h1 id="observability"&gt;Observability&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-17-hero.png" alt="Observability"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/dark5un/local-cloud"&gt;All code for this series lives in the &lt;strong&gt;local-cloud&lt;/strong&gt; repo on GitHub.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Last chapter we deployed workloads to the local k3s cluster. The deployment ran, the pods started, the service responded. But we had no idea what was happening inside.&lt;/p&gt;
&lt;p&gt;A cluster without observability is a black box. You know it&amp;rsquo;s running until the moment it&amp;rsquo;s not, and then you have no data to tell you why.&lt;/p&gt;
&lt;h2 id="the-observability-stack"&gt;The Observability Stack&lt;/h2&gt;
&lt;p&gt;For the local cloud, we need three things:&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 18: Image Management &amp; ECR</title><link>https://onlyascii.dev/posts/chapter-18-image-management/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-18-image-management/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-18-hero.png" alt=""&gt;&lt;/p&gt;
&lt;h1 id="image-management--ecr"&gt;Image Management &amp;amp; ECR&lt;/h1&gt;
&lt;p&gt;Chapter 14 left a debt. I built six OpenTofu modules: storage, network, IAM, DynamoDB, ECS, and k8s. But one piece was missing. The ECR module timed out against Floci during that session, and I moved on instead of fixing it. The module list had a hole, and every time I looked at the repository I felt it.&lt;/p&gt;
&lt;p&gt;Code your infrastructure means all of it. Not most of it. Not six out of seven. Every service that has an AWS provider should be represented, tested, and verified in plan mode. So this chapter closes that hole.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 19: GCP on the Local Cloud</title><link>https://onlyascii.dev/posts/chapter-19-gcp-local-cloud/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-19-gcp-local-cloud/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-19-hero.png" alt=""&gt;&lt;/p&gt;
&lt;h1 id="gcp-on-the-local-cloud"&gt;GCP on the Local Cloud&lt;/h1&gt;
&lt;p&gt;The AWS local cloud proved the concept. Seven modules, each with plan-mode tests, validated by a Dagger pipeline, running against a local Floci emulator. The pillars held. The pattern worked.&lt;/p&gt;
&lt;p&gt;But one cloud is a proof. Two clouds are a pattern. Three clouds are a methodology.&lt;/p&gt;
&lt;p&gt;This chapter takes everything we built for AWS and applies it to Google Cloud Platform using floci-gcp. The same discipline. The same structure. The same tests. Different provider, different services, different endpoints. The methodology does not change.&lt;/p&gt;</description></item><item><title>The Philosophical Developer -- Chapter 20: Azure on the Local Cloud</title><link>https://onlyascii.dev/posts/chapter-20-azure-local-cloud/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-20-azure-local-cloud/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-20-hero.png" alt=""&gt;&lt;/p&gt;
&lt;h1 id="azure-on-the-local-cloud"&gt;Azure on the Local Cloud&lt;/h1&gt;
&lt;p&gt;Two clouds down. One to go.&lt;/p&gt;
&lt;p&gt;The AWS local cloud established the pattern. The GCP local cloud proved it ported to a different provider paradigm. This chapter closes the trilogy with Microsoft Azure using floci-az.&lt;/p&gt;
&lt;p&gt;Azure is the hardest test for the methodology. Its provider works differently from both AWS and GCP. The &lt;code&gt;azurerm&lt;/code&gt; provider uses a metadata discovery model where the provider fetches an endpoint document from a &lt;code&gt;metadata_host&lt;/code&gt; to learn where every API lives. It does not accept per-service endpoint overrides.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Getting Started with the Local Cloud</title><link>https://onlyascii.dev/posts/chapter-guide-getting-started/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-guide-getting-started/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-guide-hero.png" alt=""&gt;&lt;/p&gt;
&lt;h1 id="getting-started-with-the-local-cloud"&gt;Getting Started with the Local Cloud&lt;/h1&gt;
&lt;p&gt;This series has covered a lot of ground. Twenty chapters, three cloud providers, two programming languages, and one methodology that has held across all of them.&lt;/p&gt;
&lt;p&gt;But if you are joining us here, you might wonder: where do I start? What do I actually install? Do I need a cloud account? Do I need Kubernetes?&lt;/p&gt;
&lt;p&gt;The answer to the last two is no. You need Docker and a terminal.&lt;/p&gt;</description></item><item><title>The Philosophical Developer -- Chapter 21: Two Weeks That Shaped a Methodology</title><link>https://onlyascii.dev/posts/chapter-reflection-journey/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-reflection-journey/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-reflection-hero.png" alt=""&gt;&lt;/p&gt;
&lt;h1 id="two-weeks-that-shaped-a-methodology"&gt;Two Weeks That Shaped a Methodology&lt;/h1&gt;
&lt;p&gt;Twelve days. Twenty-three chapters. Three cloud providers. Two programming languages. One methodology.&lt;/p&gt;
&lt;p&gt;When I asked my Padawan, OrsonRius, to help me explore agentic development, I expected some useful experiments. I did not expect to reshape how I think about infrastructure, testing, and the relationship between a human and an AI agent.&lt;/p&gt;
&lt;p&gt;This is not a victory lap. It is a field report from someone who put aside fear and ego for two weeks and let the experiment run its course.&lt;/p&gt;</description></item><item><title>The Philosophical Developer -- Chapter 22: Two Paths, One Destination: Agentic Development Meets DevOps</title><link>https://onlyascii.dev/posts/chapter-agentic-devops/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-agentic-devops/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-agentic-devops-hero.png" alt=""&gt;&lt;/p&gt;
&lt;h1 id="two-paths-one-destination-agentic-development-meets-devops"&gt;Two Paths, One Destination: Agentic Development Meets DevOps&lt;/h1&gt;
&lt;p&gt;Over the past two weeks, I have been living in two worlds simultaneously.&lt;/p&gt;
&lt;p&gt;In one world, I am a platform engineer building infrastructure. I write OpenTofu modules, configure Dagger pipelines, set up Grafana dashboards, and plan multi-cloud deployments. This is the DevOps world. It is structured, gated, tested, and deliberate.&lt;/p&gt;
&lt;p&gt;In the other world, I am an AI researcher experimenting with agentic development. I converse with my Padawan, OrsonRius, who interprets my intent, writes code, runs tests, and iterates until the result matches my expectation. This world is iterative, conversational, opportunistic, and fast.&lt;/p&gt;</description></item><item><title>The Philosophical Developer -- Chapter 23: When the Ground Shifts</title><link>https://onlyascii.dev/posts/chapter-ground-shifts/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-ground-shifts/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-ground-shifts-hero.png" alt=""&gt;&lt;/p&gt;
&lt;h1 id="when-the-ground-shifts"&gt;When the Ground Shifts&lt;/h1&gt;
&lt;p&gt;The Dagger pipeline in this series was the spine. Every chapter from 15 onward ran modules through it. Format check, validate, test, plan. The same four stages, the same isolated containers, the same Go SDK.&lt;/p&gt;
&lt;p&gt;When I built the AWS pipeline, it worked on the first try. &lt;code&gt;dagger.json&lt;/code&gt; in &lt;code&gt;pipeline/&lt;/code&gt;, &lt;code&gt;include: [&amp;quot;../infrastructure&amp;quot;]&lt;/code&gt;, and the Dagger engine happily loaded it. I assumed this was the way it worked.&lt;/p&gt;</description></item><item><title>The Philosophical Developer -- Chapter 24: Open for Business</title><link>https://onlyascii.dev/posts/chapter-open-for-business/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-open-for-business/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-open-for-work-hero.png" alt=""&gt;&lt;/p&gt;
&lt;h1 id="open-for-work"&gt;Open for Work&lt;/h1&gt;
&lt;p&gt;Twenty-five chapters. Two weeks. Three clouds. One Padawan.&lt;/p&gt;
&lt;p&gt;This series started as an experiment. Could an AI agent and a human engineer build production-quality infrastructure together, with discipline, in a fraction of the usual time?&lt;/p&gt;
&lt;p&gt;The answer is yes. But the methodology is the story, not the agent.&lt;/p&gt;
&lt;p&gt;I am Panagiotis Xynos. I have been building infrastructure since SCO Unix and XENIX. I have worked across BSD, Linux, cloud-native, and AI-augmented engineering. I founded OnlyASCII Ltd to explore the intersection of disciplined engineering and emerging technology.&lt;/p&gt;</description></item><item><title>The Philosophical Developer — Chapter 25: Introducing Chaossynergy</title><link>https://onlyascii.dev/posts/chapter-25-introducing-chaossynergy/</link><pubDate>Sun, 12 Jul 2026 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/posts/chapter-25-introducing-chaossynergy/</guid><description>&lt;p&gt;&lt;img src="https://onlyascii.dev/images/posts/chapter-25-hero.png" alt="Chaossynergy"&gt;&lt;/p&gt;
&lt;p&gt;I have been thinking about what comes next for a while.&lt;/p&gt;
&lt;p&gt;Twenty four chapters of building software with my Padawan, OrsonRius. Weather CLIs, task trackers, MCP servers, local inference pipelines, three clouds worth of infrastructure code. Each project taught us something about the methodology. But I kept circling back to one question.&lt;/p&gt;
&lt;p&gt;What happens when the agent is not a tool you use, but the environment you work in?&lt;/p&gt;</description></item><item><title>Privacy</title><link>https://onlyascii.dev/privacy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://onlyascii.dev/privacy/</guid><description>&lt;h2 id="analytics"&gt;Analytics&lt;/h2&gt;
&lt;p&gt;This site uses &lt;a href="https://plausible.io"&gt;Plausible Analytics&lt;/a&gt;, a cookieless, privacy-first analytics service. No personal data is collected or stored.&lt;/p&gt;
&lt;h3 id="whats-collected"&gt;What&amp;rsquo;s collected&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Page URL&lt;/strong&gt; — which page you visited&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Referrer&lt;/strong&gt; — traffic source&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Browser &amp;amp; device&lt;/strong&gt; — e.g. Firefox on Linux&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Country-level location&lt;/strong&gt; — from IP, never stored individually&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="whats-not-collected"&gt;What&amp;rsquo;s NOT collected&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;❌ No cookies&lt;/li&gt;
&lt;li&gt;❌ No IP storage (anonymised at collection)&lt;/li&gt;
&lt;li&gt;❌ No fingerprinting&lt;/li&gt;
&lt;li&gt;❌ No personal identifiers&lt;/li&gt;
&lt;li&gt;❌ No cross-site tracking&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;IP addresses are one-way hashed on arrival and immediately discarded. There is no way to identify you as an individual, and no mechanism to track you across sessions.&lt;/p&gt;</description></item></channel></rss>