Your work stays on your machine.
The dashboard runs locally. The bundled demo needs no agent API key, and outside resources are blocked in previews.
An open-source SEO growth tool
Compare three ways to make your product easier to find and understand. Review landing pages, content ideas, onboarding and launch messages, then choose what to test next.
Local-first · Built for small teams · No Docker required
Evidence you can open
One demo proposal removes the primary heading. The real check catches it. Its change record and logs stay visible; selection stays disabled. The other two candidates remain reviewable.
A quick look
This continuous recording uses an isolated Chrome profile to show the public GrowthLab site, its real browser evidence and the bundled SEO growth demo. It is a visual walkthrough, not a growth result.
A clear SEO growth loop
Start with a search or conversion question. GrowthLab keeps the idea, the page options and the checks together so the next step is clear.
Bring the product page you want to improve and set the boundaries for the experiment.
Try different headlines, sections, calls to action, or content ideas in separate safe copies.
Open each page, see the changes, and run the checks that matter to your product.
Pick the option you want to test, export it, or leave the original product exactly as it is.
From idea to visible page
The preview shows the page each option creates. Scripts and outside resources are blocked so you can inspect the result safely on your own machine.
Actual desktop view of a verified archived candidate source document.
These are manual documentation captures. New local battle archives also attempt verified desktop and phone PNGs from the sealed preview and record observed local Chromium checks for viewport coverage, overflow, visible copy and optional timing hints; full visual regression/accessibility evaluation remains pending. Preview limits →
Your product. Your boundaries.
The dashboard runs locally. The bundled demo needs no agent API key, and outside resources are blocked in previews.
Each experiment has an explicit goal and allowed area. The original product stays safe while options are being explored.
The current demo records ideas and checks, not ranking or conversion results. Reports keep that distinction visible.
Built in the open
Approximate overall completion
Subjective estimate against the full specification
Latest verification
Validation runs locally.
Cloud automation is off.
Targeted evidence-model and storage suites: 8 tests per binary in each suite; all passed with zero failures. The preceding full serial suite on the parent source passed 970 tests per binary (968 passed, two inherited ignored); current checks cover bounded metadata, credential redaction, claim links and atomic persistence refusal.
174 tests; zero failures or skips. Growth Battle rubric details expose the API evaluator together with the transparent calculation, evidence dimensions, recommendations, limitations and provenance; evidence cards also show type, confidence, linked support and challenge claims in six locales.
Formatting, Clippy, UI types, styles and builds; full serial Rust suite passed
Real CLI/HTTP execution, desktop/phone captures, observed local Chromium render checks and static-render rubric, verified PNG endpoint checks, SEO and accessibility rubric records, page-quality hints and standalone local audit on owned fixtures
Deterministic archived-HTML checks cover language, landmarks, heading hierarchy, image alternatives, named controls and form labels; provenance stays ESTIMATED and does not claim WCAG or assistive-technology conformance
Local Chromium smoke records desktop/phone DOM, load and first-paint timing hints in comparison rows and reports; no Lighthouse, Core Web Vitals, accessibility, visual-regression or field-performance claim
Chrome exercised the shared language picker for Spanish and Arabic; the GrowthLab home shell refreshed its copy, Arabic set dir=rtl, desktop scroll width matched the viewport and the tab recorded no warning or error logs
Chrome switched the measurement panel to Spanish and Arabic; translated headings, source states and controls rendered, Arabic set dir=rtl, viewport width stayed fitted and no browser warnings or errors were recorded
Chrome opened the anchored settings surface and a selected workspace contract, switched the theme to dark and restored the system preference; the read-only contract and permission modes stayed localized within the RTL viewport and browser logs remained empty
Bounded UTF-8 CSV import smoke passed locally; means, sample sizes, optional date range, baseline differences, exploratory 95% intervals and MEASURED limits are emitted without network access
Local Chrome smoke uploaded a synthetic CSV; the dashboard rendered MEASURED means, sample sizes, baseline differences, date range, 95% intervals and limits with no console warnings or errors
Rust and TypeScript calculations matched on repeated synthetic samples; mean and difference intervals are omitted below n=2 and documented as descriptive normal approximations
Read-only API and Chrome smoke expose all ten initial roles with focused questions, outputs and guardrails; no provider or analytics request is made
Fresh locked macOS arm64 build; real CLI import, delivery and HTTP demo; embedded UI verified
20 battle tests on both binaries; exact candidate finalization and local conflict preservation
Cloud workflows are disabled; validation runs locally
CLI and HTTP tests cover refusal without the explicit flag, protected-path refusal before commit, and a local-only initial snapshot with no remote
CLI, API and dashboard paths enforce HTTPS-only read-only retrieval, same-origin robots checks, no redirects or credentials and bounded UTF-8 HTML
CLI, API and workspace dashboard execute and persist deterministic role contracts with bounded answers; runs remain UNTESTED and make no provider or product-file request
Local Rust and browser CSV summaries group by metric, distribution or channel and variant; comparisons stay within each distribution and remain MEASURED from user-supplied rows
Local API and browser panel enumerate one available no-network CSV source plus six planned opt-in boundaries; planned entries remain UNTESTED and no provider credentials or events are accessed
CLI, API and Home UI clone only after an explicit new destination is supplied; existing contracts are preserved, missing contracts are committed locally, and no push or provider request occurs
Chrome smoke created the deterministic starter map and rendered the shared goal with positioning, conversion and onboarding branches; cards remain UNTESTED until a battle and local evidence exist
Rust battle preparation, comparison rows and report tests confirm persisted hypothesis IDs remain linked from the map through frozen battle variants and exported JSON, Markdown and HTML
Workspace dashboard groups persisted hypotheses by role in accessible branches; stable hypothesis IDs remain linked into prepared battle variants
Local macOS arm64 archive build includes LICENSE, NOTICE.md, demo and six checked-in dependency notices; an offline verifier passed checksum, traversal/link checks, structure and real version/build-channel execution
Chrome exercised Spanish and Arabic on a real recorded battle; inspection tabs, decision labels and report actions translated, Arabic set dir=rtl, viewport width stayed fitted and no browser warnings or errors were recorded
Local x86_64-unknown-linux-musl release archive built from the exact alpha.20 tag with cargo-zigbuild and Zig; current-main rebuild produced SHA-256 9b34c05918f22f662bb58153e97d04f4bc7d70f530276deb4cc1af01052f3f63, and the offline verifier passed SHA-256, traversal/link safety, required notices and archive structure. The tagged asset is attached to alpha.20 and runtime was honestly skipped on macOS arm64
Local x86_64-apple-darwin release archive built from the exact alpha.20 tag with Cargo; offline verifier passed SHA-256, traversal/link safety, required notices and archive structure, the asset is attached to alpha.20, and its version command passed under Rosetta on macOS arm64; native x86_64 hardware remains untested
Local aarch64-unknown-linux-musl release archive built from the exact alpha.20 tag with cargo-zigbuild and Zig; offline verifier passed SHA-256, traversal/link safety, required notices and archive structure, the asset is attached to alpha.20, and runtime was honestly skipped on macOS arm64
LocalCsvAdapter implements the shared read-only request/report contract; focused Rust measurement and API tests passed and no provider request is made
Focused API and configuration tests prove validated local writes, stale-file refusal, atomic replacement and refusal after hypotheses or active battles; UI exposes localized save/cancel controls without automatic commits or remotes
Six locale catalogs cover static-preview evidence, render metadata and rubric detail labels; Chrome verified the edit control is enabled before hypotheses and disabled with an explicit Arabic lock explanation after the starter map is created
GrowthDashboard action and status labels for the experiment tree, battle execution, candidate inspection and selected delivery now use localized message keys; six catalogs define the shared keys, Chrome verified Spanish and Arabic controls, and the 174-test UI suite passes
The six locale catalogs now cover dashboard busy states, home onboarding, public page and repository audit controls, playbook controls and execution status feedback; i18n, style, type, build and 174 UI tests pass, and Chrome verified the Spanish home flow with no browser warnings or errors
Role names, hypothesis editor labels, execution choices, check metadata and delivery notices now use the six locale catalogs; i18n, style, type, build and 174 UI tests pass, and Chrome verified Spanish role labels and footer copy
The ten role playbooks now map titles, focus, summaries, questions, outputs, guardrails and saved-run follow-up text through locale catalogs; i18n, style, type, build and 174 UI tests pass, and Chrome verified Spanish playbook content
Five SEO, quality, accessibility, static-render and browser-timing rubric labels, dimensions and static guidance now resolve through all six locale catalogs; i18n, style, type, production build and 174 UI tests pass, and Chrome verified Spanish battle and public-URL audit guidance.
Known evaluator-generated rubric evidence sentences now map counts, HTML states, viewport checks and timing tokens through all six locale catalogs; unrecognized evaluator text and user-authored run content keep their recorded language and provenance.
Chrome AX and DOM inspection on a recorded battle found 23 named interactive controls, one h1 with no skipped heading level, no duplicate IDs, no images missing alt text and no horizontal overflow; this remains a local structure smoke, not WCAG or assistive-technology certification.
CLI --include-visuals and API includeVisuals=true explicitly embed verified archived desktop/phone PNGs; default reports omit captures, Rust report tests cover opt-in encoding and the 4 MiB bound, and the screenshot-required bundled demo asserts both default omission and six opt-in captures without provider requests. Embedded captures remain render artifacts, not visual-regression, accessibility, performance or growth results.
The real bundled demo's three sealed variants match six checked-in SHA-256 PNG baselines at 1280x900 desktop and 390x844 phone; archive dimensions, digests and the no-provider boundary are verified locally. This is a pinned local renderer smoke, not cross-browser parity or assistive-technology conformance.
The real bundled demo's three sealed preview documents match six additional checked-in SHA-256 PNG baselines in Firefox 139.0.4 at 1280x900 desktop and 390x844 phone; viewport dimensions, overflow, named controls, heading-level continuity and the no-provider boundary are verified locally. Safari, other browser versions and assistive-technology conformance remain unverified.
A real recorded bundled battle rendered in local Chromium; 19 DOM and AX interactive controls were named, one h1 had no skipped level, IDs/images/forms and overflow passed, and 30 Tab events reached visible focus stops without invoking a provider. The optional --output JSON handoff records all role/name pairs and providerInvoked=false. This remains a local structure and keyboard smoke, not screen-reader, cross-browser or WCAG evidence.
The current source built x86_64-pc-windows-gnu with cargo-zigbuild and Zig; current-main packaging produced SHA-256 745d90bb9d51d70c535abd0e600421a95c39d81ac3bf0bc39834b3eff3d2eba7 and the offline archive verifier passed checksum, traversal/link and notice checks. The exact alpha.20 tag ZIP is attached to the public release; Windows runtime, MSVC packaging and signing remain unverified.
The read-only scripts/test-release-assets.py check downloads all ten alpha.20 archive/checksum pairs (five cargo-dist installer names plus five historical versioned names), matches GitHub asset digests and sidecars, and passes root-layout or bin-layout archive safety/notices verification; macOS arm64 runtime passes locally, macOS x86_64 passes under Rosetta, and Linux and Windows runtimes are skipped on the macOS host.
cargo-dist generated the alpha.20 shell and PowerShell installer templates locally; sh -n and the PowerShell parser accepted both scripts. A separate local SHA-256 preflight matched the macOS arm64 archive and sidecar before the shell installer fetched that archive through a disposable HTTP server, installed growthlab and orx into an isolated prefix, and reported version 0.1.0-alpha.20 without editing the test profile. The scripts and cargo-dist-compatible archives are attached to the public release; other target installer/runtime execution remains unavailable.
The cargo-dist matrix now includes the published x86_64-pc-windows-gnu archive and leaves MSVC out until a Windows SDK runner can validate it. Regenerated PowerShell and shell templates select the GNU asset; mapping assertions, shell syntax, PowerShell parsing, public ten-pair SHA-256 verification and an isolated macOS shell-install smoke passed.
scripts/test-installer-templates.py --check-shell is versioned and checks that the generated shell template selects the published macOS arm64, macOS x86_64, Linux musl arm64, Linux musl x86_64 and Windows GNU archives; the PowerShell template selects the Windows GNU asset, with shell syntax and PowerShell parsing passing without network, upload or provider access.
The public home and documentation pages expose one canonical URL each, Open Graph and Twitter cards, and truthful SoftwareApplication structured data. Static robots.txt, sitemap.xml and llms.txt are present, list only the two indexable pages, and state the product's SEO focus and evidence limits without analytics or growth claims.
The real GrowthLab CLI audited site/index.html locally: the explainable SEO page-hygiene rubric scored 100/100, all four images had useful alt descriptions, and no recommendation remained. The separate quality score stayed 28/30 and the accessibility structure score 100/100; both remain estimates rather than performance or WCAG certification.
GitHub About metadata, the README opening, and the live Pages title, description and hero were verified to use consistent SEO growth tool positioning. This is messaging and discovery evidence, not ranking or conversion proof.
scripts/test-growth-native-fixture.py used a disposable fake Claude CLI with no provider credentials; the current binary created three isolated worktrees, accepted valid implementation JSON, ran observed checks and sealed three UNTESTED runs while the product HEAD, files and remotes stayed unchanged. This verifies the local harness boundary, not a real provider response.
The current source x86_64-apple-darwin release suite ran under Rosetta on macOS arm64: 964 passed, zero failed and two inherited ignored tests. The confinement profile now permits only the Apple Rosetta runtime directory read-only; this does not prove native Intel hardware or the separately attached alpha.20 archive beyond its version smoke.
A local cargo-zigbuild attempt stopped in ring's C build because assert.h and a Windows SDK are unavailable on the macOS host; no MSVC artifact was produced or published.
Five cargo-dist archive/checksum pairs were generated with the configured .tar.gz Unix format, root-level growthlab/orx binaries and six attribution/dependency notices; a deterministic Windows GNU ZIP was built with Zig. All ten public archive/checksum pairs passed the read-only verifier. Linux and Windows runtime, MSVC packaging and signing remain unverified.
Replay proposals: SIMULATED. Executed checks: OBSERVED. Growth outcomes: UNTESTED.
Published prerelease
Start with something you can inspect
The source alpha includes a fictional product and three clear page ideas. It makes real changes locally, keeps the original safe, and leaves the decision with you.