amplifier-ipc breaks the monolith apart
payneio/amplifier-ipc
v1 packed the orchestrator, tools, hooks, providers and context manager into a single process. amplifier-ipc rebuilds Amplifier so each of those runs as its own subprocess behind JSON-RPC 2.0 over stdio.
And this isn't a proposal — it already shipped.
In ~10 days and 407 commits, Paul Payne (394 of 407 commits) drove the rewrite. The repo's own cloc comparison: ~55,448 Python+Rust lines down to 15,742 Python — the Rust engine eliminated entirely.
So why break the monolith apart at all?
In the old system every module ran in the same Python process. A buggy tool could corrupt shared state, leak memory, or crash the entire session. A shared virtualenv forced dependency hell, and the whole thing was Python-only.
The fix: stop sharing the process.
Each service is spawned with start_new_session=True for process-group isolation, talking to a central host over JSON-RPC 2.0 via stdio. A crashing tool service no longer takes down the session — the host detects the exit and the rest continues.
Isolation is one payoff. Dependency freedom is the next.
Every service has its own uv-managed virtual environment with dependencies declared in its own pyproject.toml. Service A can use pydantic==2.0 while Service B uses pydantic==1.10. No conflicts, no workarounds.
And the seam that enables this is astonishingly small.
The JSON-RPC newline-delimited framing layer measures 39 lines (the design doc rounds to "40 lines"). Any language that can read stdin and write stdout can be a service — polyglot comes essentially free. (A Python SDK is the only one shipped today.)
That tiny seam is the thing designed to scale.
The repo's microservices design doc turns today's stdio JSON-RPC boundary into tomorrow's boundary: a Dapr-native framework where each behavior runs as an independent container over HTTP/gRPC and pub/sub, with Dapr sidecars for invocation and state.
Design-only for now — no Dockerfiles or Dapr components in the source yet.
The stdio JSON-RPC seam of today is engineered to become the HTTP/gRPC container seam of tomorrow. But the repo names its own catch: the foundation service still co-locates orchestrator+tools+hooks+context in-process to dodge deadlock, spawning costs ~200ms per turn, and the host is still a single 1248-line broker.
The payoff is earned, not oversold.
Repository: payneio/amplifier-ipc @ d82d2d8 (branch main, HEAD 2026-03-30), remote git@github.com:payneio/amplifier-ipc.git
Data as of: 2026-03-30 · Feature status: Active (Dapr/container direction is design-doc only, not implemented)
Commands run:
git log --reverse --format='%ci %h %s' | head -1; git log --oneline | wc -l (first 6205449 2026-03-20; 407 commits)git shortlog -sne --all (Paul Payne 394, Amplifier Implementer 13)wc -l src/amplifier_ipc/protocol/framing.py (39); wc -l src/amplifier_ipc/host/host.py (1295)grep -rn 'start_new_session' src/ (lifecycle.py:56)grep -rn 'jsonrpc' src/amplifier_ipc/protocol/client.pyGaps: Old-repo LOC (33,753 Python + 21,695 Rust → 15,742 Python) and ~200ms per-turn overhead are repo-documented (cloc / design doc), not independently re-measured or benchmarked by the verifier. host.py measures 1295 lines today vs the doc's cited 1248 (minor drift). No Dockerfiles or Dapr components exist in source yet.
Primary contributor: Paul Payne — 394 of 407 commits (~97%).