Skip to content

Decide against an extension system; compact per-app runtimes instead - #207

Merged
nyblnet merged 1 commit into
mainfrom
decide-no-extensions
Aug 3, 2026
Merged

Decide against an extension system; compact per-app runtimes instead#207
nyblnet merged 1 commit into
mainfrom
decide-no-extensions

Conversation

@nyblnet

@nyblnet nyblnet commented Aug 2, 2026

Copy link
Copy Markdown
Owner

Records the decision, so the next person to propose an extension tier finds the reasoning instead of rebuilding it.

The load-bearing part is that the multi-app argument reverses. It reads as the strongest case for building one — amortize the machinery over three apps — and measurement says the opposite: bytes multiply rather than amortize, the cheapest host costs more than the entire bento/spaces shell as it stands (10,052 B), and only review effort amortizes. Neither unbuilt app wants one; both solved their heaviest payloads with browser primitives and no dependency.

Second, the economics invert once you follow the bytes into the file. An extension bakes into the deck, so the exporting user pays the dependency and the machinery — worse than merging the dependency into core unchanged — while non-exporters still pay for the host.

Third, three extension mechanisms already ship (plugin/skill, tray bridge, kernel facade) and none of the design work named them.

Confirms rather than supersedes the 2026-07-26 entry: the carrier stays generic because that is good hygiene, not because a plugin system is pending.

Also records what this does not decide — kernelizing packs.ts per app is still wanted by both future apps, and three defects turned up while looking (offline mode does not gate pack fetches although docs/security.md says it does; the shell-block registry is single-slot; an unparseable block is deleted permanently on the next save) — and the conditions that would reopen it.

The proposal keeps coming back, so it needs an entry rather than a memory: a
sealed, separately signed unit that bakes into a file like a language pack, so a
heavy optional feature ships on its own clock. The immediate case was a
PowerPoint exporter with a large vendored dependency; the wider case was that
building it once would serve spaces and dash too.

The multi-app half of that is the part worth writing down, because it reads as
the strongest argument FOR and turns out to be the strongest against. Bytes
multiply rather than amortize -- every app pays host, container and its own
i18n -- and the cheapest host measured costs more than the entire spaces shell
as it stands. Only review effort amortizes, which was never the expensive half.
Meanwhile neither unbuilt app wants one: no extension-shaped feature in either
design, one of them has ruled out shell-block work and forbids carried user code
outright, and both solved their heaviest payloads with CompressionStream and
DOMParser and no dependency at all.

The economics invert once you follow the bytes into the file. An extension bakes
into the DECK, so the exporting user pays the dependency AND the machinery --
worse than merging the dependency into core unchanged -- while everyone else
still pays for the host. Break-even needs under ~13% of users to ever export,
and for a PowerPoint replacement, interop is the adoption path.

And the thing none of the design work noticed: three extension mechanisms
already ship. The plugin/skill channel extends by recipe at zero shell bytes;
the tray bridge extends capability at the host and reaches every file ever
saved, including ones that predate it; the kernel facade shares implementation
with no frozen surface. All three cost zero platform invariants.

Confirms rather than supersedes the 2026-07-26 entry -- the carrier stays
generic because that is good hygiene, not because a plugin system is pending.

Records what this does not decide (kernelizing packs is still wanted, and three
defects found while looking) and what would reopen it.
@nyblnet
nyblnet force-pushed the decide-no-extensions branch from f870c3f to ad00075 Compare August 3, 2026 12:28
@nyblnet
nyblnet merged commit 5eaccf8 into main Aug 3, 2026
1 check passed
@nyblnet
nyblnet deleted the decide-no-extensions branch August 3, 2026 12:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

1 participant