Evolve Lamma
A self-hosted gamma.app replacement that takes a DeckSpec JSON file and renders it, byte-for-byte deterministically, into presenter-ready HTML, PDF, and PPTX, with a hard gate…
- 52/52
- tests passing at last recorded session (M0 to M20 milestone series complete)
- 7 of 7
- acceptance tests from the adapter spec passing (P1-P7 parity, D1-D9 differentiation)
- 2
- runtime dependencies
- Cloudflare Access (Google Worksp…
- Node.js (ESM), node:test
- Only two runtime dependencies to…
- playwright-core for PDF renderin…
- pptxgenjs for PPTX export
Evolve Lamma holds live data, so this shows the verified technology stack by layer rather than a screenshot. Hosts, ports and topology are deliberately absent.
Problem
Gamma.app decks silently drop speaker notes on export and offer no guarantee that generated slide text matches what was actually written, both direct problems for anyone using AI-assisted deck generation for real client-facing or teaching material. There was also no way to enforce a house style rule (no em/en dashes) as a hard constraint rather than a hope, and no way to prove, after the fact, that a deck's content hadn't drifted from its source during rendering. Confirming any of this about gamma.app meant actually testing it rather than assuming: four real Gamma runs were captured and spent real Gamma credits specifically to find out what the tool does and does not preserve on export, and the speaker-notes drop was one of the concrete findings from that capture, not a guess going in. A subscription tool that silently changes wording, drops notes, or renders text as a flattened image is also a compliance risk for decks used in real estate or teaching contexts, where an em dash slipping into copy or a card's wording drifting from what was actually approved is a real, not cosmetic, problem.
What was built
A command-line tool and small local editor that takes a DeckSpec JSON file, a spec-first format defined in a companion prototype repo, and renders it into a self-contained HTML deck (with a built-in presenter view), a PDF, and a PPTX with working speaker notes. A serve command runs a local editor for click-to-edit authoring with shareable links, and a generate/expand command optionally drafts or expands deck content through a local, keyless Claude CLI call that a user reviews as a diff before accepting, never silently applied. Beyond the core render path, the tool grew an import command for pulling existing Markdown or PPTX content into DeckSpec form, an imagery command that fills in card imagery through Higgsfield's API against a stored credential, a template and icon system, and card types for tables, charts, and big-number callouts, plus 4K video backgrounds for cards and a video sign-in page for the deck-editor front end. The whole platform, spanning M0 through M20 of the project's own milestone series, shipped and passed its full test suite before any of that later feature work was layered on top, so the extras built on a renderer whose core fidelity guarantee was already proven rather than being added speculatively alongside it. Compliance-sensitive decks use a preserve-mode copy path specifically so regulated or approved wording is carried through unchanged rather than passed through any expansion or rewriting step.
Technical approach
The project treats content fidelity as a hard invariant rather than a best-effort goal: the renderer's report explicitly proves zero missing and zero added text against the source spec on every run, and the style-policy gate (dash detection) fails the render with the exact card and text snippet responsible rather than logging a warning. Determinism is enforced at the architecture level: identical spec and brand inputs must produce byte-identical output, which rules out any nondeterministic rendering step and forced font/asset embedding to be data URIs baked in at render time rather than resolved dynamically at view time. The dependency budget (two runtime dependencies, confirm with the owner before adding a third) pushed real engineering tradeoffs: PDF generation reuses an already-cached Chromium via playwright-core rather than a heavier PDF library, and the project explicitly never triggers a Playwright browser download as a side effect, since that would be an unbounded runtime dependency in practice even if not in package.json. Brand tokens (colors, typefaces) are verified against each brand's live CSS rather than assumed or hardcoded from memory, and hexes are marked provisional in the brand config files until that verification happens, a small but load-bearing discipline against silently 'correcting' values that turn out to be wrong. The AI-assisted expand step is architecturally isolated from the render path: it is opt-in, it never runs during tests, and its output is diffable per card, keeping the verbatim-by-construction guarantee intact even when AI is used to help draft content, because expansion happens before rendering and is reviewed, not injected during it. Deployment runs the app as a always-on local service reached through a Cloudflare Access-gated tunnel, with public share links (/d/<slug>) explicitly carved out as the one route allowed to bypass that gate.
Creative approach
Craft
The differentiation from gamma.app is stated as a list of concrete, testable claims rather than a vibe: verbatim by construction, speaker notes first-class, style policy as a hard gate, real brand tokens, text stays text (never baked into an image), locked cards, deterministic output, fully offline artifacts. Each claim in that list corresponds to an actual acceptance test, not marketing copy. Brand fidelity is treated the same way visually: colors and typefaces for each brand (Studio's exact accent, the gold and cyan tones used elsewhere, the specific typefaces per brand) are pulled from each brand's live site CSS rather than eyeballed or reconstructed from memory, and any hex not yet checked against the live source is explicitly marked provisional in the brand config rather than presented as confirmed. The in-artifact presenter mode ships four distinct viewing states, present, overview, notes, and fullscreen, built directly into the rendered HTML rather than requiring a separate viewer application, so a presenter-ready deck is presenter-ready without any additional tooling once it's rendered.
Reframe
The non-obvious product insight is that a deck tool used for real client and teaching material needs proof, not trust: a report attached to every render stating exactly what changed (or didn't) turns 'I think it's accurate' into a checkable claim. Locking cards and reporting drift rather than silently re-rendering on every spec change is the same insight applied to iterative editing: the tool never assumes a stale render is wrong, it assumes the human should decide. The same discipline governs where AI is allowed to touch the pipeline at all: v0 shipped with no AI calls anywhere in the render path and none permitted in tests, and even once an expand step was added, it lives strictly upstream of rendering as an opt-in, diffable draft the human reviews before it becomes spec content, never a live rewrite happening during render. That boundary is what lets the verbatim-by-construction guarantee and AI-assisted drafting coexist without contradicting each other: the renderer's contract is with the spec, not with whatever produced it.
Process and what failed
The project has an explicit lineage: four real Gamma runs were captured and studied in a prototype repo first (costing real Gamma credits) specifically to reverse-engineer what gamma.app actually does and does not preserve, which is where the speaker-notes-drop finding and the P1-P7/D1-D9 acceptance criteria came from, rather than guessing at requirements. The prototype repo's DeckSpec schema was explicitly frozen before the app repo began, keeping recipe experimentation separated from production renderer code. Brand hex values were marked provisional and only promoted to confirmed once checked against a brand's live CSS, an explicit refusal to let a plausible-looking guess pass as verified.
Outcome
Deployed and reachable at an internal, auth-gated domain, backed by a launchd service and included in the standing backup rotation, with a first backup snapshot already taken rather than just configured. All 52 tracked tests and all 7 adapter-spec acceptance tests were passing as of the last recorded session, covering render fidelity, PDF/PPTX export, the local editor, and brand token verification. Access control sits in front of the whole app via Cloudflare Access restricted to the owner's Workspace domain, with a deliberate, narrow carve-out: share links under a public-deck path stay reachable without login so a rendered deck can be sent to someone outside the org, while the editor and every other route stay gated. At the time of the last recorded session there was one live demo deck reachable through that share-link path and no broader usage data yet; Google OAuth sign-in for the editor itself remained an open, optional item left to the owner's call rather than shipped.