---
log: 012
title: "Le Sextant — the compass gets an engine"
date: 2026-06-05
task: "#14 Build distribution decision SPA (evolves #003)"
tags: [tooling, distribution, ux, economics]
shareable: true
---

## Cap (what & why)
The Decision Compass (#003) scored *fit* to priorities — useful, but it never
answered the money question: over a lifetime, what does each distributor cost to
**port** the back-catalog, **keep** it alive, and **add** new releases — and what's
left after their cut? PLN wanted a simulator, not a scorecard, and DistroKid back in
the running as a real option (not pre-rejected on the no-sub rule).

## Manœuvre (how)
Rebuilt as a slider-driven economic model in `armada/ui` (Vite multi-page: the
take-judge stays at `/`, the simulator at `/sextant.html`), Ship's Bridge tokens
reused as-is. A pure-function model (`model.ts`) expands catalog inputs into dated
releases, then computes PORT/KEEP/ADD/**UPDATE** cost + a decaying-spike revenue curve
per option. Four distributors — RouteNote Free (baseline), RouteNote Premium, CD Baby
(recommended), DistroKid — plus Bandcamp as an independent layer added on top of any
of them. Prefilled with the real catalog (11 singles + 1 album on DSP, 41 SoundCloud
backlog, ~6/yr forward). Hand-rolled SVG break-even chart — no chart dependency. A
**Freedom & control** matrix answers the non-money question: can you remaster, edit,
pull, and stay up — and at what cost?

## Prise (findings / artifacts)
- `armada/ui/src/sextant/{model,data,format,Control,OptionRow,BreakEvenChart,Sextant}.tsx`
  + `sextant.html` entry; `compare.html` (#003) is superseded.
- At the real catalog: **RouteNote Premium goes net-negative** (−$12.7k vs baseline) —
  renewing 53+ releases yearly outcosts the streams. **DistroKid wins on raw net**
  (keeps 100%, $230/decade) but rents the shelf; **CD Baby is recommended** at
  near-identical net because the catalog stays yours. **Bandcamp digital sales are a
  rounding error** (~$132 over 10 yr) — its worth is ownership, not revenue.

- **The remaster question reframes everything.** No DSP distributor swaps audio in
  place — that's a *store* rule, not the distributor's. A remaster = a brand-new
  release (new ISRC, lost date & plays) on CD Baby / RouteNote / TuneCore; DistroKid's
  in-place Audio Swap needs the **Ultimate tier ($89.99/yr)** and only for minor
  tweaks; **Bandcamp replaces the file free, anytime**. For a remaster-heavy salvage
  op, that flips Bandcamp from "nice direct channel" to "master-of-record."
- Adding 2 remasters/yr pushes DistroKid to Ultimate and narrows its net lead over CD
  Baby from ~$1.3k to ~$640 — the UPDATE bucket made a hidden cost visible.

## Sel (the shareable learning)
- The break-even cadence everyone quotes (CD Baby vs DistroKid) **collapses to zero
  once you have a back-catalog to port** — owning-vs-renting stops being a price
  question and becomes a "do they pull your music?" question. The slider makes that
  flip visible; a static table hides it.
- First cut tied Bandcamp to one "Stack" option and priced it per-release-per-month —
  which implied ~1,350 sales/yr across the catalog and made the Stack win by a
  landslide. Wrong on both counts: Bandcamp is **independent** (runs alongside any
  distributor, so it shifts every option equally and decides nothing), and real
  digital sales are **a few a year, total**. Fixing the unit dissolved a fake winner.
- RouteNote Premium (cost) wanted to set the chart's axis and crush the CD-Baby/
  DistroKid crossover. Scaling to the *non-outlier* max + an honest "off scale" flag
  beat both log-scaling and special pleading.
- A superfan replaying a track weekly is **fan noise**, not a phenomenon — it lives
  inside the long-tail floor, not a modelled spike. Said so in the UI; the instrument
  never implies more precision than it has.

## Hameçon (hook)
"I tried to find the break-even between owning and renting my music. Turns out, the
moment you have a back-catalog, the math stops being about money."

## Sillage (what it unlocks)
PLN can run real scenarios (sleeping archive vs touring push) before committing to a
migration; the model's per-option net feeds the release manifeste's ordering.
