Engineering tooling

Foreman

My own orchestrator for my work at the company. It runs Claude Code workers and reviewers on my GitHub issues and the team's PRs, and reports only to me over Telegram.

Why

Leading development is mostly waiting and checking

Foreman does the waiting and the first pass, so I only decide.

Big picture

Inputs, one loop, outputs

TelegramI chat with a front desk and a general chat
GitHubReady issues, mentions, teammates' PRs, closed issues
Clock60-second tick and daily schedules
↓
foreman loopChecks memory, disk, and load, then starts a fresh claude -p per job in its own git worktree
↓
GitHubBranches, PRs, status labels, reviews, follow-up issues
TelegramReports per topic and short notes to forward
Model

Workspace → project → task

WorkspaceOne product area of the company. One Telegram group with topics: task, pr, todo, review, General.
ProjectOne repo plus one JSON file: models, rules, acceptance criteria, task types, base branch. Read every tick, no restart.
TaskOne GitHub issue. Its status is a label.

Project files stay outside the foreman repo, so company repo names and rules never end up in it.

Tasks

From issue to merged PR

ready→in-progress→in-review→done
in-review→changes-requested→in-progress· after 3 rounds →blocked
Reviews

Foreman reviews the team's work for me

Re-reviewEvery 5 min. A teammate answered a review? Check which points are addressed.
Branch guardEvery 10 min. Each PR to the guarded branch is checked once for bugs, security, and rule breaks.
Delivery checkEvery 30 min. An issue I wrote was closed: is every point really there?
Mention reviewSomeone mentioned me: read-only review plus a draft reply.
Follow-ups

Nothing gets lost in a comment

Chat

Threads are sessions

New messageNew thread, new Claude session.
ReplyContinues that thread's session.
In parallelThreads run side by side; one thread runs its messages in order.
Memory guardA new chat waits while less than half of the RAM is free.

Every answer ends with its session id. Past 120k tokens, a session hands over a summary.

Daily

Schedules

JobWhenOutput
Tasksevery 60 sPRs, status labels
Daily briefonce a dayPRs ready to merge, items waiting for me
Stale scanset hoursFixes my stuck PRs, digests the rest
Re-review · guard · delivery5 · 10 · 30 minReviews and follow-up issues
Safety

Guardrails

Runtime

Three launchd services on one Mac

foremanThe scheduler loop
foreman-uiRead-only status page on localhost, a PWA that refreshes every 5 s
foreman-tunnelCloudflare tunnel with Cloudflare Access in front (only me)

Built with Bun and TypeScript, gh, and claude -p. No database: state is JSON files.

Summary
I decide.

Foreman does the first pass.

Workers write the code, reviewers check it and the team's PRs, follow-ups become issues, and Telegram carries it all to me.