Homepage polish + realistic extract-time benchmark#360
Conversation
Fixes from the homepage review: - Hero: add the large Palamedes logo medallion above the headline. - Section 04 (Scope): rewrite from architecture jargon (transform, ferrocat, "locale negotiation", "compile-time authoring") into plain developer language. The scope diagram now contrasts what Palamedes owns (write messages, extract & update, catalog, runtime lookup — same on every framework) against what your framework owns (routing, locale detection, rendering, hosting — different per stack), with the payoff line: switch frameworks and only the bottom row changes. - CodeShowcase: fix broken tab highlight. Base UI (RC) emits aria-selected, not data-selected, so the data-[selected] utilities never matched. Switch to aria-selected + a bronze top rule so the active tab is unmistakable. - TerminalCascade: stop the size jump (report bars are now always reserved and fade in) and give the three panels equal width with a clean gap (was a negative-margin overlap plus a right indent that made the lower two narrower). - Nav: widen the header link padding for proper rhythm. - Add WorkflowFlow (Write -> Extract -> Translate -> Render) above the code showcase to explain the pipeline visually. - LocaleBookingCards: render the three locales across the full width instead of a narrow left column. - BenchmarkChart: drop the in-bar ratio annotation, round the median timings to whole ms, align the axis labels under the bars, and round the axis maximum up to a clean value with headroom (0-1200 ms) so the longest bar never ends hard on the frame. Show one representative corpus chart on home and proof — the three-size comparison didn't add insight. Benchmark + proof: - Add a realistic profile (400 files, 10,000 messages) to the e2e workflow harness, include it in the default run, and re-run: Palamedes 12.66x faster than Lingui on the 10k corpus. Home, ProofStrip, prose, compare, proof, and the linked methodology docs all quote the fresh numbers; drift guard extended to cover the realistic section. - Matrix: subdomain demos are live (verified reachable, all 15 return 200 and render their locale) so promote them from provisioning to live links; TLD stays provisioning (domains still unresolved). Update the stale reachability note in demo-deployments.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
d02d505 to
63979c7
Compare
Greptile SummaryThis PR delivers two related improvements: a visual polish pass on the marketing homepage (logo, tab highlight fix, WorkflowFlow diagram, scope section rewrite, layout tweaks) and a rebuilt "realistic" benchmark corpus that models a production app's actual i18n density (1,500 files, ~400k lines, only ~half carrying i18n markers) rather than the previous all-i18n dense fixture.
Confidence Score: 4/5Safe to merge — all data flows are internally consistent, the drift guard covers the new corpus section, and the UI changes are presentational. The site/app/data/bench.ts — the unused Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart LR
subgraph Corpus["Realistic Corpus Generation"]
direction TB
A["750 marked .ts files\n8 msgs each, ~374 lines\n(with non-i18n filler)"]
B["750 unmarked .ts/.tsx files\n0 msgs, ~160 lines\n(pure filler)"]
end
subgraph Benchmark["Benchmark Run (run.mjs)"]
direction TB
C["3 tools extract messages"]
D["parsePoMsgids\n(po.mjs — multiline aware)"]
E["Semantic validation\n6,000 active msgs per tool"]
F["7 timed runs\nmedian recorded"]
C --> D --> E --> F
end
subgraph Site["Site / Drift Guard"]
direction TB
G["bench.ts\n(BENCH_REALISTIC)"]
H["BenchmarkChart\n(adaptive ticks)"]
I["verify-site-bench-data.mjs\n(compares bench.ts ↔ latest.md)"]
G --> H
G --> I
end
Corpus --> Benchmark
F --> |"latest.json / latest.md"| Site
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart LR
subgraph Corpus["Realistic Corpus Generation"]
direction TB
A["750 marked .ts files\n8 msgs each, ~374 lines\n(with non-i18n filler)"]
B["750 unmarked .ts/.tsx files\n0 msgs, ~160 lines\n(pure filler)"]
end
subgraph Benchmark["Benchmark Run (run.mjs)"]
direction TB
C["3 tools extract messages"]
D["parsePoMsgids\n(po.mjs — multiline aware)"]
E["Semantic validation\n6,000 active msgs per tool"]
F["7 timed runs\nmedian recorded"]
C --> D --> E --> F
end
subgraph Site["Site / Drift Guard"]
direction TB
G["bench.ts\n(BENCH_REALISTIC)"]
H["BenchmarkChart\n(adaptive ticks)"]
I["verify-site-bench-data.mjs\n(compares bench.ts ↔ latest.md)"]
G --> H
G --> I
end
Corpus --> Benchmark
F --> |"latest.json / latest.md"| Site
|
The e2e-workflow "realistic" corpus was an all-i18n fixture: every file
was dense with messages. Real apps aren't like that — the extractor
spends most of its time scanning ordinary, non-i18n source. Rebuild the
corpus to match a production web app measured from its Lingui include
roots, with figures rounded so they read as a shape, not false precision:
- 1,500 files, of which 750 carry i18n markers and 750 have none but
still get scanned.
- ~400,000 source lines, ~3% of them i18n. Files are padded with
deterministic non-i18n filler to the line budgets.
- 6,000 messages (plain + ~15% {name} variables) spread thinly across
the marked files.
This makes the timed workload reflect real parse volume rather than a
best-case dense fixture. Fresh numbers on that corpus: Palamedes 174 ms
vs Lingui 2254 ms (12.99x) and i18next-parser 1562 ms (9.00x).
Also:
- Read multiline PO msgids correctly (new src/po.mjs, from PR #358). The
old single-line reader treated wrapped msgids — which the extractor
emits for longer messages — as empty, which is what made
variables/plurals appear to "drop". The native extractor was correct;
the benchmark reader was not.
- Home/proof/compare/prose and the methodology docs quote the new
numbers; drift guard still green.
- BenchmarkChart: adaptive tick step so a larger range stays at ~8-10
gridlines instead of 20+.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
63979c7 to
a47adca
Compare
|
Pushed a fix + addressed the review feedback:
Kept both rather than removing — they're the checked-in reference for the smaller corpora and are guarded against drift. 🤖 Addressed by Claude Code |
Two related pieces of work on the marketing site and the e2e-workflow benchmark.
1. Homepage polish (
065946d)A review pass over the new homepage layout:
aria-selected, notdata-selected, so thedata-[selected]utilities on the Write/Extract/Translate tabs never matched — the active tab was indistinguishable. Switched toaria-selected+ a bronze top rule.transform,ferrocat, "locale negotiation") into plain developer language, with a scope diagram contrasting what Palamedes owns (same on every framework) vs what your framework owns (different per stack), and the payoff line "switch frameworks, and only the bottom row changes."provisioningto live links; TLD staysprovisioning(domains still unresolved). Stale reachability note indocs/demo-deployments.mdcorrected.2. Realistic extract-time benchmark (
d02d505)The e2e-workflow
realisticcorpus was an all-i18n fixture — every file dense with messages. Real apps aren't like that: the extractor spends most of its time scanning ordinary, non-i18n source. Rebuilt to model a production web app's Lingui include roots (figures rounded so they read as a shape, not false precision):{name}variables) spread thinly across the marked files.This makes the timed workload reflect real parse volume rather than a best-case dense fixture. Fresh numbers: Palamedes 174 ms vs Lingui 2254 ms (12.99×) and i18next-parser 1562 ms (9.00×). Home, proof, compare, prose and the methodology docs quote the new numbers; the drift guard (
verify-site-bench-data) stays green. The chart gained an adaptive tick step so a larger range stays at ~8-10 gridlines.Note on the PO reader / #355 / #358
While building the corpus I mis-diagnosed a "dropped messages" symptom as an extractor bug (#355). It was actually the benchmark's PO reader: the native extractor emits valid multiline PO msgids for longer messages, and the old single-line reader treated them as empty. This PR includes the multiline-reader fix (
benchmarks/e2e-workflow/src/po.mjs), identical to the now-merged #358 — it should reconcile cleanly on merge. The native extractor was correct.Validation
pnpm --dir site typecheck— cleannode scripts/verify-site-bench-data.mjs— bench.ts matches the checked-in reportoxlinton changed files — clean🤖 Generated with Claude Code