Skip to content

About

Top-of-funnel campaign site for Chovy: type the idea, launch it now.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

launch.anapp.now

Top-of-funnel campaign site for Chovy. One job: get a visitor to type an app idea and carry it straight into Chovy without retyping.

Next.js 16, TypeScript, Bun (package manager and runtime). No database: ideas and funnel events are forwarded server-to-server to Chovy's campaign API (chovy-ai repo, /api/campaign/*), which is where the experiment report lives.

Run

bun install
cp .env.example .env      # fill CHOVY_CAMPAIGN_SECRET (same value as Chovy's CAMPAIGN_SECRET)
bun dev

bun run test runs the unit tests (allocation, cookie, validation) with bun test. bun run build type-checks and builds. bun run creatives:placeholders regenerates the stand-in hero images (see below).

How it fits together

visitor ── GET /            proxy.ts assigns hero variant + anonymous session (cookies)
        ── POST /api/campaign/start   idea → validated → POST {CHOVY}/api/campaign/contexts (Bearer secret)
                                      ← { handoff_url: https://chovy.com/start?c=<token> }
        ── navigate handoff_url       Chovy sets its own cookie, opens sign-up, prefills the intake
        ── POST /api/campaign/events  first-party funnel events → POST {CHOVY}/api/campaign/events

The idea travels only in the two JSON POST bodies. It is never in a URL, a cookie, a log line, or an analytics payload (the event schema has no field for it and unknown properties are dropped).

Experiment

Four mutually exclusive hero variants, assigned once per visitor by src/proxy.ts and kept in the lan_variant cookie for 90 days:

variant creative
hero_control typography + input only
hero_fish_builder creative-a-fish-builder.png
hero_phone_rocket creative-b-phone-rocket.png
hero_fish_no_code creative-c-fish-no-code.png

Allocation is HERO_ALLOCATION (weights, read per request, so a Railway variable change is enough). Changing EXPERIMENT_ID reassigns everyone. ?hero=<variant> forces a variant for QA and persists it.

Only the assigned creative is rendered, so only one image loads. The current image files are labelled stand-ins; drop the supplied artwork over them (public/marketing/launch-anapp-now/README.md).

Events

campaign_landing_view, experiment_assigned, creative_impression, hero_input_focus, idea_input_started, idea_submitted, handoff_started, handoff_completed, handoff_failed, cta_click, section_view. Chovy adds handoff_opened, signup_completed, plan_generated, project_started on its side, keyed by the same anonymous session, and reports everything at https://chovy.com/campaign/report?key=<CAMPAIGN_SECRET> (JSON twin at /api/campaign/report).

Deploy

dev2 builds .nixpacks/Dockerfile (a hand-written oven/bun image running the Next standalone server with bun server.js) on every merge to main; health check /healthz. Variables: see .env.example. Point launch.anapp.now at the service's domain and set SITE_ORIGIN=https://launch.anapp.now. The apex anapp.now should 301 to the campaign host.

About

Top-of-funnel campaign site for Chovy: type the idea, launch it now.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages