<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: winnie sanders</title>
    <description>The latest articles on DEV Community by winnie sanders (@mind_buger_e485cb34a93d41).</description>
    <link>https://dev.to/mind_buger_e485cb34a93d41</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3909118%2F4b0c3524-bf1c-4e36-b989-d25e8386d1b7.png</url>
      <title>DEV Community: winnie sanders</title>
      <link>https://dev.to/mind_buger_e485cb34a93d41</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mind_buger_e485cb34a93d41"/>
    <language>en</language>
    <item>
      <title>When your bash scripts outgrow bash (but you don't want a platform)</title>
      <dc:creator>winnie sanders</dc:creator>
      <pubDate>Wed, 24 Jun 2026 22:20:04 +0000</pubDate>
      <link>https://dev.to/mind_buger_e485cb34a93d41/when-your-bash-scripts-outgrow-bash-but-you-dont-want-a-platform-k51</link>
      <guid>https://dev.to/mind_buger_e485cb34a93d41/when-your-bash-scripts-outgrow-bash-but-you-dont-want-a-platform-k51</guid>
      <description>&lt;p&gt;Every team has &lt;em&gt;the script&lt;/em&gt;. It started as five lines that built and deployed a service. Two years later it's 300 lines of bash with &lt;code&gt;set -euo pipefail&lt;/code&gt;, a dozen &lt;code&gt;if [ -z "$VAR" ]&lt;/code&gt; guards, retry loops someone copy-pasted from Stack Overflow, and a comment that just says &lt;code&gt;# don't touch this&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You've outgrown bash. But you don't want to stand up Argo, or wire your runbook into Jenkins, or learn a YAML-of-YAML DSL just to run a few ordered shell commands with variables and error handling.&lt;/p&gt;

&lt;p&gt;That gap — between &lt;em&gt;a script&lt;/em&gt; and &lt;em&gt;a platform&lt;/em&gt; — is where &lt;a href="https://orchstep.dev" rel="noopener noreferrer"&gt;OrchStep&lt;/a&gt; lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it actually is
&lt;/h2&gt;

&lt;p&gt;OrchStep is a &lt;strong&gt;YAML-first workflow orchestration engine&lt;/strong&gt; that ships as a single binary. No server, no control plane, no signup. You describe a workflow in &lt;code&gt;orchstep.yml&lt;/code&gt; and run it from the terminal (or inside the CI you already have).&lt;/p&gt;

&lt;p&gt;A few principles worth knowing up front, because they shape everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No platform required.&lt;/strong&gt; It's a CLI binary, not a SaaS. It runs inside your existing CI/CD instead of replacing it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shell-first.&lt;/strong&gt; OrchStep doesn't reimplement &lt;code&gt;terraform&lt;/code&gt;, &lt;code&gt;kubectl&lt;/code&gt;, &lt;code&gt;aws&lt;/code&gt;, or &lt;code&gt;docker&lt;/code&gt; — it &lt;em&gt;delegates&lt;/em&gt; to them. Your steps are the commands you already run; OrchStep gives them structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built for the terminal.&lt;/strong&gt; Keyboard-driven, scriptable, &lt;code&gt;--format json&lt;/code&gt; on every command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's honestly &lt;em&gt;not&lt;/em&gt; for everyone: if &lt;code&gt;make&lt;/code&gt; covers you, use &lt;code&gt;make&lt;/code&gt;; if you genuinely need a scheduler, a queue, and multi-tenant RBAC, you need a platform. OrchStep is for the large middle — "I've outgrown bash but a platform is overkill."&lt;/p&gt;

&lt;h2&gt;
  
  
  Two minutes to your first workflow
&lt;/h2&gt;

&lt;p&gt;Install it however you like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://orchstep.dev/install.sh | sh
&lt;span class="c"&gt;# or: brew install orchstep/tap/orchstep&lt;/span&gt;
&lt;span class="c"&gt;# or: npm i -g orchstep   /   pip install orchstep&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then scaffold a starter — it writes a complete, runnable file, not a stub:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;orchstep init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmmodtd14k140ide7552f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmmodtd14k140ide7552f.png" alt="orchstep init scaffolds a commented, runnable workflow" width="798" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The whole shape of a workflow is small enough to read in one breath:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hello&lt;/span&gt;
&lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;greet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;say-hello&lt;/span&gt;
        &lt;span class="na"&gt;func&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shell&lt;/span&gt;
        &lt;span class="na"&gt;do&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo "Hello from OrchStep!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;orchstep run greet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The generated file lints clean and runs green immediately — no fiddling:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5r6qibqhpn8waqhw4b5l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5r6qibqhpn8waqhw4b5l.png" alt="orchstep lint and run against the generated file" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that makes it feel like a tool, not a config file
&lt;/h2&gt;

&lt;p&gt;Don't remember the task name? Press a key, not your memory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;orchstep menu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get a keyboard-driven picker with single-keystroke hotkeys and fuzzy search — and, importantly, it &lt;strong&gt;refuses to hang in a pipeline&lt;/strong&gt; (run it in CI and it exits cleanly instead of waiting for a TTY).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiysu37jvk40ds4zfl119.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiysu37jvk40ds4zfl119.gif" alt="orchstep menu — interactive task picker with fuzzy search" width="800" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get over a shell script
&lt;/h2&gt;

&lt;p&gt;The same commands you already run, but now with structure that used to be your problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ordered steps&lt;/strong&gt; with named outputs you can reference downstream&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Variables with real scoping&lt;/strong&gt; instead of a wall of &lt;code&gt;export&lt;/code&gt;s&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditionals and loops&lt;/strong&gt; that read like intent, not &lt;code&gt;case&lt;/code&gt;/&lt;code&gt;while&lt;/code&gt; gymnastics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retries, timeouts, and try/catch/finally&lt;/strong&gt; as syntax, not hand-rolled&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environments&lt;/strong&gt; so one workflow targets dev/staging/prod without copy-paste&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A dry-run&lt;/strong&gt; that shows you the resolved plan &lt;em&gt;before&lt;/em&gt; anything executes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We'll dig into each of those across this series. None of it requires giving up the shell — it just stops you from rebuilding the same plumbing in every script.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this series is going
&lt;/h2&gt;

&lt;p&gt;This is part 1 of a hands-on developer series. Next up:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Workflows that read like intent&lt;/strong&gt; — tasks, steps, functions, variables, and outputs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One workflow, every environment&lt;/strong&gt; — env groups, dotenv, and a coverage matrix that catches missing vars before you deploy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;See what will happen before it does&lt;/strong&gt; — dry-run, lint, and the optional local dashboard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capture an agent's work, replay it for free&lt;/strong&gt; — using OrchStep with AI agents&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you want to skim ahead, the &lt;a href="https://orchstep.dev/getting-started/introduction" rel="noopener noreferrer"&gt;Introduction&lt;/a&gt; and &lt;a href="https://orchstep.dev/getting-started/quick-start" rel="noopener noreferrer"&gt;Quick Start&lt;/a&gt; cover the basics, and there's a &lt;a href="https://youtu.be/f8p4Gz6XUo8" rel="noopener noreferrer"&gt;90-second tour of the CLI&lt;/a&gt; if you'd rather watch than read.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Got a gnarly bash script you'd retire if this looked good? Drop it in the comments — I'll show what it looks like as an OrchStep workflow.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cl</category>
      <category>automation</category>
      <category>cicd</category>
    </item>
    <item>
      <title>I developed a tool named orchstep CLI for our beloved developers to manage workflow, cicd, automation, and I made a claude skill for it, now it helps me to capture repeated tasks and turn it to a workflow so that it help reduce my token usage up to 90%</title>
      <dc:creator>winnie sanders</dc:creator>
      <pubDate>Wed, 24 Jun 2026 15:27:52 +0000</pubDate>
      <link>https://dev.to/mind_buger_e485cb34a93d41/i-developed-a-tool-named-orchstep-cli-for-our-beloved-developers-to-manage-workflow-cicd-4m2p</link>
      <guid>https://dev.to/mind_buger_e485cb34a93d41/i-developed-a-tool-named-orchstep-cli-for-our-beloved-developers-to-manage-workflow-cicd-4m2p</guid>
      <description></description>
      <category>automation</category>
      <category>claude</category>
      <category>cli</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
