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.

  1. Download Codemany and drag it to Applications. It is signed and notarized by Apple.
  2. Connect GitHub: GitHub CLI or a token.
  3. Pick repos.
  4. 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:8825 that 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 macOS and ARM64).
  • 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

ProblemFix
Paying for CI minutes on hosted runnersJobs run on your Mac for a flat $20/month, 2 machines included
Registration tokensOne-time setup; Codemany mints a just-in-time runner for every job
State leaking between jobsA fresh runner per job; its directory is wiped after
Runners dying unnoticedCrashed runners back off and are recycled; offline runners are replaced
The Mac sleeping mid-jobKeep-awake while jobs run, warnings, and a record of lost jobs
Updates interrupting jobsUpdates wait for running jobs
No way to see what runsWorkflows, runs, jobs and live step logs in the app, the menu bar, a widget and the LAN dashboard
Too many or too few runnersRunner 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.