<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Squibble Blog — English</title><description>Engineering write-ups about the systems actually running at Squibble — architecture, infrastructure, and the decisions behind them.</description><link>https://www.squibble.ch</link><language>en-US</language><item><title>357 Seconds per Push, and the Tests Were Not the Problem</title><link>https://www.squibble.ch/en/blog/2026-08/push-gate-bind-mount</link><guid isPermaLink="true">https://www.squibble.ch/en/blog/2026-08/push-gate-bind-mount</guid><description>Our pre-push gate took almost six minutes. The container read the repository through a bind mount, and that alone accounted for 324 of the 357 seconds.</description><pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate><category>docker</category><category>developer-experience</category><category>performance</category><category>testing</category><category>macos</category></item><item><title>CI/CD Analytics: Where Pipeline Time Really Goes</title><link>https://www.squibble.ch/en/blog/2026-08/cicd-analytics</link><guid isPermaLink="true">https://www.squibble.ch/en/blog/2026-08/cicd-analytics</guid><description>A slow or failed pipeline is only a symptom. Workbench connects wasted runner time, job trends, and pipeline waterfalls in one investigation—from the aggregate signal to the exact merge request attempt.</description><pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate><category>gitlab</category><category>ci-cd</category><category>analytics</category><category>developer-experience</category><category>reliability</category></item><item><title>Never Release to Test: Why we had to shift CI and AI agent governance left</title><link>https://www.squibble.ch/en/blog/2026-08/never-release-to-test</link><guid isPermaLink="true">https://www.squibble.ch/en/blog/2026-08/never-release-to-test</guid><description>16,300 CI minutes in a single week, 18.9% complete waste, and 22 release attempts for a single app: Why releases were abused as test environments, how AI agents silently ignore uninitialised standards, and how a three-tiered filter solved the problem.</description><pubDate>Tue, 18 Aug 2026 00:00:00 GMT</pubDate><category>ci-cd</category><category>gitlab</category><category>ai</category><category>architecture</category><category>monorepo</category></item><item><title>Boards: a kanban that doesn&apos;t know where its cards are</title><link>https://www.squibble.ch/en/blog/2026-08/workbench-boards</link><guid isPermaLink="true">https://www.squibble.ch/en/blog/2026-08/workbench-boards</guid><description>Every board eventually fails the same way — it remembers which column a card is in, and from then on that memory has to be maintained. Workbench never records it: columns are rules, evaluated on read.</description><pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate><category>gitlab</category><category>rails</category><category>react</category><category>postgresql</category><category>architecture</category></item><item><title>Special vdev: 113 TB hanging on two files</title><link>https://www.squibble.ch/en/blog/2026-08/special-vdev</link><guid isPermaLink="true">https://www.squibble.ch/en/blog/2026-08/special-vdev</guid><description>The special vdev of a 113 TB pool sat on two qcow2 files — both on the same consumer SSD, with 11% of its endurance left. Moving it meant operating on a live mirror with no room to be wrong. And it surfaced two checks that had been pointed at the wrong thing the whole time.</description><pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate><category>zfs</category><category>proxmox</category><category>ansible</category><category>storage</category><category>operations</category></item><item><title>Workbench: a delivery index that is allowed to be wrong</title><link>https://www.squibble.ch/en/blog/2026-08/workbench</link><guid isPermaLink="true">https://www.squibble.ch/en/blog/2026-08/workbench</guid><description>We built a multi-tenant view across several GitLab instances without becoming a second source of truth. The design rule that made it work: the local database is disposable, and reconciliation — not webhooks — is what makes it correct.</description><pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate><category>gitlab</category><category>rails</category><category>multi-tenancy</category><category>postgresql</category><category>architecture</category></item><item><title>Env Manager: a secrets store that cannot read its own secrets</title><link>https://www.squibble.ch/en/blog/2026-07/env-manager</link><guid isPermaLink="true">https://www.squibble.ch/en/blog/2026-07/env-manager</guid><description>A security review pointed out that our secrets manager trusted its own administrators. The fix was zero-knowledge end-to-end encryption — and the honest part of the design is the list of three places where the server still sees plaintext, and why we accepted each one.</description><pubDate>Sun, 05 Jul 2026 00:00:00 GMT</pubDate><category>secrets</category><category>cryptography</category><category>gitlab</category><category>rails</category><category>architecture</category></item><item><title>Observability: the read model that acts</title><link>https://www.squibble.ch/en/blog/2026-06/observability</link><guid isPermaLink="true">https://www.squibble.ch/en/blog/2026-06/observability</guid><description>Workbench could drop its database and rebuild it. This one polls Graylog and files GitLab issues — and a side effect has no upstream. Why dry-run became a database column, why the dashboard has no delete button, and why the safety guard sits at the HTTP boundary rather than in configuration.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><category>observability</category><category>graylog</category><category>gitlab</category><category>rails</category><category>architecture</category></item></channel></rss>