Codemany, explained
Your Mac is idle.
Your CI costs $200+ a month.
Run it on your Mac.
The problem today
- CI minutes are billed. GitHub-hosted runners are billed per minute, and GitHub rounds each job up to a whole minute.
- macOS minutes cost more. GitHub's published per-minute price for a macOS runner is higher than for a Linux runner, and iOS and macOS apps need macOS runners.
- Meanwhile, your own Mac sits idle. The Mac on your desk, or a spare Mac mini, already has your Xcode and your tools.
- Do-it-yourself runners are fiddly. A self-hosted runner has to be registered with a token, and a long-lived one leaks state between jobs: dirty work directories, stale caches, half-killed simulators. Runners die, and nobody notices until jobs sit in
queued. The Mac goes to sleep mid-job and GitHub marks the job lost. A running job cannot be paused, so updates have to wait for jobs, and there is no single place to see which runners are busy, idle or dead.
What Codemany is
Codemany is a Mac app that runs your GitHub Actions jobs on your own Mac. It keeps a pool of self-hosted runners sized to your Mac: every job gets a fresh, single-use runner, and the runner is recycled after the job. GitHub still schedules the jobs and shows the logs.
- Download Codemany and drag it to Applications. It is signed and notarized by Apple.
- Connect GitHub: GitHub CLI or a token.
- Pick repos.
- Change one line in a workflow:
runs-on: [self-hosted, codemany]. From then on your Mac keeps running jobs.
What you get in the app
- Workflows, runs, jobs and steps, the way GitHub models them, with live step logs for jobs on your Mac.
- Overview: jobs running, jobs waiting (oldest first), jobs done, and how many runners your Mac holds.
- Savings: roughly what the jobs on your Mac would have cost on GitHub-hosted runners (see Saving money).
- Menu bar status, a desktop widget that shows whether your Mac is kept awake, and a LAN dashboard at
http://codemany.local:8825that any browser on your network can open. The app shows a QR code ("View on phone") to open it on a phone. - Integrations for what jobs need: start Docker or keep it running, install Colima, install allowlisted Homebrew packages (CocoaPods, fastlane, gh, xcbeautify and a few more), and pre-warm the tool cache.
Use cases
- iOS and macOS apps. Builds and tests with your own Xcode and simulators. Ask for a version with
runs-on: [self-hosted, codemany, xcode-26.0]. - Swift packages and any test suite your Mac can run: Go, Node and Python downloads from
actions/setup-*are cached between jobs, and the pre-warm fetches the versions your workflows ask for. - Docker builds on jobs that ask for
docker, with Docker Desktop or Colima. - Many parallel jobs. A matrix or a monorepo's jobs spread over all the runners your Mac holds.
- Indie developers and side projects who already own a Mac, and small teams with a spare Mac or Mac mini.
Who it is not for
- Jobs that need Windows or an x86 machine: Codemany's runners are macOS on Apple silicon (labels
macOSandARM64). - Running untrusted code. A self-hosted runner is not a sandbox: jobs run as your macOS user. Public repos, where anyone can open a pull request from a fork, need the opt-in and care described below.
- Spreading one queue over several Macs: each Mac runs its own runners, and a subscription includes 2 machines; each extra one is $10/month.
Each problem, and how Codemany fixes it
| Problem | Fix |
|---|---|
| Paying for CI minutes on hosted runners | Jobs run on your Mac for a flat $20/month, 2 machines included |
| Registration tokens | One-time setup; Codemany mints a just-in-time runner for every job |
| State leaking between jobs | A fresh runner per job; its directory is wiped after |
| Runners dying unnoticed | Crashed runners back off and are recycled; offline runners are replaced |
| The Mac sleeping mid-job | Keep-awake while jobs run, warnings, and a record of lost jobs |
| Updates interrupting jobs | Updates wait for running jobs |
| No way to see what runs | Workflows, runs, jobs and live step logs in the app, the menu bar, a widget and the LAN dashboard |
| Too many or too few runners | Runner count sized to your Mac's memory, disk and cores |
Security and privacy, briefly
- A self-hosted runner is not a sandbox. Only run workflows you would run in your own terminal. Jobs run as your macOS user; a dedicated Mac or macOS user limits what a job can reach.
- Public repos are opt-in, per repo. Codemany also refuses one whose fork pull-request approval setting is too weak or whose workflows use risky triggers, and re-checks every 30 minutes.
- What leaves your Mac: API calls to GitHub, made directly with your token; to us, your GitHub id, login and email when you start a trial or subscribe, a hashed device id, your Mac's name and a daily license check; to Stripe, your payment details. Your GitHub token stays in Codemany's Keychain vault on your Mac. Anonymous usage stats (counts and sizes, never names, code or tokens) go to PostHog unless you turn them off in Settings › General.
- The LAN dashboard is read-only from other devices unless you set an admin token.
More: the security model, Is it safe? and the Privacy Policy. Next: how it works, or install Codemany.