We all "love" microservices, allegedly. But you know what isn’t fun? Realizing you need to bump a dependency, run a build, or git pull across 15 different repositories at the same time.
You usually have two options (if you don’t want to use AI agents):
The "Tab Hoarder" Strategy Manually open 15 terminal tabs, cd into each one, run the command, and pray you didn’t miss one. 1.
The "Unix Wizard" Strategy You try to construct a one-liner that iterates over directories. You start typing:
find . -maxdepth 1 -type d -exec sh -c 'cd "{}" && git pull' \;
It works, but it’s painfully slow because it runs serially (one at a time). So you switch to xargs to run it in parallel:
ls -d */ | xargs -P 4 -I {} bash -c "cd {} && pnpm update"
Now you have a prob…
We all "love" microservices, allegedly. But you know what isn’t fun? Realizing you need to bump a dependency, run a build, or git pull across 15 different repositories at the same time.
You usually have two options (if you don’t want to use AI agents):
The "Tab Hoarder" Strategy Manually open 15 terminal tabs, cd into each one, run the command, and pray you didn’t miss one. 1.
The "Unix Wizard" Strategy You try to construct a one-liner that iterates over directories. You start typing:
find . -maxdepth 1 -type d -exec sh -c 'cd "{}" && git pull' \;
It works, but it’s painfully slow because it runs serially (one at a time). So you switch to xargs to run it in parallel:
ls -d */ | xargs -P 4 -I {} bash -c "cd {} && pnpm update"
Now you have a problem. xargs (by default) breaks on directory names with spaces. To fix it, you need to add -print0 to find and -0 to xargs, and suddenly your "quick one-liner" is 80 characters long and unreadable.
Enter in-cli 🚀 https://github.com/inevolin/in-cli
Usage:
in [OPTIONS] [DIRECTORIES...] [--] COMMAND...
I got tired of typing those boilerplate loops. I wanted a tool that does one thing well: runs a command in every directory, fast. So I built in-cli. It’s a zero-dependency CLI (pure bash) that acts as a force multiplier for your shell.
How it actually works
Instead of wrestling with pipes and flags, you just tell it what to do.
Scenario 1: The Morning Routine You get to work and need to update all 20 repos in your ~/work folder.
# Updates every repo in ~/work/ directory
in ~/work/* git pull
Scenario 2: The "Critical Fix" Deployment You need to trigger a build script across all your services right now.
# Run 'make build' in parallel across all subdirectories
in -P 8 ~/work/* make build
Scenario 3: Dependency Hell Need to update lodash in every service because of a CVE?
in ~/work/* 'pnpm update lodash && git commit -am "updating lodash" && git push'
You’ll find +50 other real-world scenarios in the EXAMPLES.md file.
Why use this?
Stop wasting time on tooling boilerplate
If you’re managing a monorepo or a folder full of microservices, stop writing throwaway scripts to manage them.
Check it out on GitHub, and let me know if it saves you a few keystrokes (and your sanity).
Enjoy!