<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Shell on ferkakta.dev</title><link>https://ferkakta.dev/tags/shell/</link><description>Recent content in Shell on ferkakta.dev</description><generator>Hugo</generator><language>en-US</language><copyright>Copyright fizz.</copyright><lastBuildDate>Tue, 03 Mar 2026 09:00:00 -0600</lastBuildDate><atom:link href="https://ferkakta.dev/tags/shell/index.xml" rel="self" type="application/rss+xml"/><item><title>From eight manual steps to one command</title><link>https://ferkakta.dev/eight-manual-steps-to-one-command/</link><pubDate>Tue, 03 Mar 2026 09:00:00 -0600</pubDate><guid>https://ferkakta.dev/eight-manual-steps-to-one-command/</guid><description>&lt;p&gt;I provisioned two tenants by hand before I decided that nobody should ever provision a tenant by hand.&lt;/p&gt;
&lt;p&gt;The provisioning flow for our multi-tenant SaaS platform was 8 steps across 4 tools — a Python CLI, a shell script with 5 flags per invocation, a GitHub Actions workflow, and two Kubernetes job manifests requiring injected DB connection strings. Each step had different inputs, different env files, and subtly different flag names for the same concept. The two &lt;code&gt;populate&lt;/code&gt; runs used &lt;code&gt;--appname apiserver&lt;/code&gt; and &lt;code&gt;--appname tenant_auth_service&lt;/code&gt; — note the underscore in one and not the other. That naming inconsistency is a guaranteed typo on a Friday afternoon. Each flag is a chance to silently write 24 SSM parameters to the wrong path.&lt;/p&gt;</description></item></channel></rss>