How Kepler became a surface, not a fork
Kepler is Amplifier's native desktop GUI: a Tauri Rust shell, a React/TypeScript frontend, and a Python sidecar. To move fast, it rebuilt the platform's own machinery internally instead of reusing it.
It worked — but only by becoming a duplicate of the platform. That is the tension this deck resolves.
provider_registry.pysettings.py under ~/.kepler/amplifier_hooks.pyThis isn't asserted — DISTRO_INTEGRATION_DESIGN.md states it verbatim: Kepler has "its own provider management, its own session creation pipeline, its own configuration namespace (~/.kepler/)."
Three copies of platform machinery, documented before a line was changed.
The design named the cost directly: duplicated infrastructure and divergence risk. Because provider registry, session lifecycle, and config were rebuilt in Kepler instead of reused from distro, upstream work — handoff injection, preflight, streaming — had to be re-implemented or was simply left behind.
The code kept diverging. The fix had to make Kepler stop being its own platform.
amplifier-distro is the platform layer that already powers distro's Slack, Voice, and Web Chat surfaces. Kepler declared it as a git submodule yet delegated almost nothing to it.
The target was in the repo the whole time. The refactor just had to lean on it.
github.com/ramparte/amplifier-distro.gitOne idea, applied five times: delegate to distro rather than duplicate. Documented in an approved design and executed phase by phase.
With each subsystem delegated, the old copies had nothing left to do.
Delegation turned the old machinery into dead weight. Grepping the sidecar found no remaining provider_registry or settings imports — so the modules could simply be deleted.
Nothing consumed them anymore. That made subtraction the payoff.
One cleanup commit removed 606 lines of dead code — amplifier_hooks.py shrank from 647 to 41 lines. A follow-up added 104 new tests (211 passing total). Kepler is now a surface, not a fork.
Architecturally equal to distro's Slack, Voice, and Web Chat — it consumes the platform.
Stop rebuilding the platform. Consume it. When a surface delegates instead of duplicating, every upstream improvement arrives for free — and the duplicated machinery becomes deletable dead weight.
23 files changed, net-subtractive where it counted — the win was what got removed.
Data as of: repository state through 2026-03-24 (latest commit cb00138).
Feature status: Active / DONE — refactor merged across commits 4eae89d..9288bb9.
Primary source: local checkout of ramparte/amplifier-distro-kepler; amplifier-distro consumed as submodule (github.com/ramparte/amplifier-distro.git).
Commands run:
git show 7543dee --stat ; echo $((647-41)) → 606 lines removed (647 → 41)git show --stat 9288bb9 → 104 new tests, 211 total (104 new + 107 pre-existing)for f in ...; do git show 9288bb9:sidecar/tests/$f.py | grep -c 'def test_'; done → 31+33+13+8+19 = 104git show 9f99f03^:sidecar-shared/{provider_registry,settings,events}.py | wc -l → 138, 222, 68grep -rn 'provider_registry' sidecar/ ; grep -rn 'from settings import' sidecar/ → 0 matchessed -n '1,60p' docs/DISTRO_INTEGRATION_DESIGN.md → duplicated-infrastructure problem statement + surface framinggrep -n 'Phase' docs/IMPLEMENTATION_TASKS.md ; git log --oneline 4eae89d..9288bb9 → 5-phase plancat .gitmodules → amplifier-distro submodule declarationPrimary contributor: Sam Schillace (author of all 11 refactor-arc commits), co-authored by Amplifier per commit trailers.
Gaps: wc -l of the post-commit amplifier_hooks.py blob reports 38 (a trailing-newline/counting artifact); the headline 606 = author-stated 647 − 41, internally consistent. Design-doc line estimates (129/204/542) differ from the authoritative deletion-commit blob measurements (138/222/647) used here. "211 passing" is per commit body plus an independent def test_ grep count; tests were not re-executed this session.