The Geist->Zen rename reached the stylesheets and stopped there. Four layers were still handing users another vendor's face. frontend/public still carried Inter.woff2/woff, the real upstream binaries signed RSMS, and fonts.scss declared three static Inter weights on top of the variable face; one variable file spans 100-900, so those three collapse into it. The Zen pair here named only Hanzo in its copyright, which OFL does not allow for a cut of Geist — @hanzo/font's identity check reads family, vendor tag and both notices out of the name table and refuses to publish a face that fails, so the bytes now come from there. common/tailwind/dist/tailwind.css is a build artifact. .gitignore names it, `insightscli doctor` deletes it, nothing imports it (the app imports the source tailwind.css), and a single upstream merge dragged it in. Its --default-font-family still said MatterSQ, two renames behind the config it is supposed to come from. Untracked rather than hand-edited. @hanzo/quill's tokens set --font-sans behind [data-quill], a later declaration than base.scss's :root, so every component inside a quill subtree resolved to the token's own Inter stack instead of the app's. The token now leads with Zen, and each package's own build regenerates its dist. The preload lookup in build.mjs matched /Inter(-hash)?\.woff2/ and throws when it resolves empty, so it had to move with the file. It was also warming the second family in --font-sans rather than the first. Two smaller ones: the region picker fetched Inter from fonts.googleapis.com on an unauthenticated page, and quill's storybook depended on @fontsource-variable/inter, which declares the family "Inter Variable" — a name no stack in this repo asks for, so it downloaded and painted nothing.
Hedgebox dummy app
This app represents our Hedgebox product simulation for demo data purposes.
Background
We've had a demo data generator simulating a product called Hedgebox (like Dropbox for mascots) for a while now. It creates realistic event data with user profiles, behaviors, timezones, even includes features like a Marius Tech Tips sponsorship landing page and an A/B test on the signup flow.
However, the generator hasn't been able to create session recording data, as that's a hard nut to crack store. Session recordings need an actual app with actual user interactions to capture. Hedgebox never had one - until now.
This dummy app brings Hedgebox to life as a working Next.js app that can be used to generate real session recordings for demos and testing.
What's Inside
A fully functional (fake) demo app with:
- Login/signup flows
- File management interface
- Pricing page
- Marius Tech Tips landing page
- Insights integration for tracking and session recording
Setup
- Install dependencies:
npm install
- Set up Insights environment variables:
The app automatically fetches the Insights API key from your local database at build/dev time. You can configure the database connection and team ID using these environment variables:
NEXT_PUBLIC_INSIGHTS_HOST # Insights host (default: http://localhost:8010)
NEXT_PUBLIC_INSIGHTS_KEY # Insights API key, fetched automatically on `npm run dev`
DEMO_TEAM_ID # Team ID to fetch token from (default: latest team)
Note: The API key is automatically fetched and written to .env.local when you run npm run dev or npm run build. The script will skip fetching if .env.local already exists (to avoid unnecessary database queries on every run).
To manually fetch the key or force a re-fetch, run:
# Fetch if .env.local doesn't exist or doesn't have key NEXT_PUBLIC_INSIGHTS_KEY
npm run fetch-insights-key
# Force re-fetch even if NEXT_PUBLIC_INSIGHTS_KEY set in .env.local
FORCE_FETCH_KEY=1 npm run fetch-insights-key
Alternatively, you can manually create a .env.local file with the NEXT_* vars above.
- Run the development server:
npm run dev
The app will be available at http://localhost:3000.
Generating session recordings
The app is instrumented as long as npm run dev has NEXT_PUBLIC_INSIGHTS_KEY set. Just interact normally and recordings will be captured in your Insights instance.