← Design notebook

BUILT BY AUTONOMOUS SYSTEMS · WORK IN PROGRESS

The Gyropup website

The landing page and existing playground, progress, and build portal are one static website, in this repository. Cloudflare Pages serves the same dist/ bundle that the local preview serves. There is no separate website repository, server process, or new downloads product. Existing build/report file links continue to expose the committed design artifacts alongside their context.

Local development

Use Node 22 (see .nvmrc):

nvm use
npm ci
npm run dev

Open the printed URL (default http://127.0.0.1:8644). If that port is taken, use PORT=8764 npm run dev. After editing sources, run npm run build and refresh. The preview serves the latest bundle without restarting. The original cad-agent site --serve remains available for CAD-specific work; it redirects its root to the engineering notebook. npm run dev is the full public-site preview, including the landing page.

npm run build packages the landing page, existing designer modules, committed CAD/physics artifacts, catalog, design sources and engineering documents. It renders Markdown and decisions to the design notebook. It does not build CAD, run solvers, copy local credentials, include vendor source downloads, or copy RL training data. Source/evidence files must be tracked in git to be published. The existing build page's directory queries receive generated static indexes.

Continuous publishing

The Cloudflare Pages project gyropup is connected directly to Valpatel/gyropup. Production branch: main. Build command: npm ci && npm run build. Output directory: dist. Node: 22.

A reviewed merge/push to main builds and deploys production automatically. Feature branches receive preview deployments. This path uses Cloudflare's GitHub integration and does not depend on a developer's local OAuth token.

For an explicitly requested immediate publication from a reviewed source commit:

nvm use
npx wrangler whoami
npm run deploy

npm run deploy builds the current checkout and uploads it to production. Commit and push the source first. /version.json records the source revision so a published artifact can be matched to GitHub. wrangler.toml declares the output folder; keep it aligned with the dashboard configuration.

Cloudflare OAuth should be refreshed with npx wrangler whoami before treating an expired token as a blocker. Pages deployment permission does not imply DNS edit permission. For the custom domain, Pages must register gyropup.com and the zone needs a proxied CNAME @ → gyropup.pages.dev. A Pages domain reporting CNAME record not set needs that DNS record; repeating a Pages deployment will not fix DNS. No credentials belong in git, logs, or progress reports.

Keep the playground current

exports/sim/ is a committed browser snapshot. Its README records provenance and limitations; the initial public snapshot is from October 25–26, 2026, and predates some current hardware revisions. The UI must not present it as validation of the latest hardware. The browser plays prerecorded physics or interactive poses; it does not connect to or control a physical robot.

When a hardware change is ready, regenerate its browser meshes and matching physics replays with the repository's simulation tools, validate them, and commit the snapshot with the related design change. Update docs/progress.json alongside new reports. Cloudflare then publishes that same reviewed evidence. Generated files must come from the matching source revision, never hand-edited metrics.

Web validation

With the local preview running and Chrome installed:

npm run test:web
SITE_URL=https://gyropup.com npm run test:web

The browser harness checks common phone sizes from 320 to 480 CSS pixels in portrait and landscape, tablet and desktop layouts; navigation, overflow, the simulator drawer, replay, pose, firing and turret; required network assets, downloads, document anchors and genuine 404s. It writes screenshots and the result matrix to ignored test-results/. This is viewport/touch emulation, not a claim to have tested every physical phone or Safari version.

Public launch and brand evidence

gyropup.com became active with a valid Cloudflare-managed certificate on 2026-10-28. The proxied apex CNAME points to gyropup.pages.dev. DNS propagation can leave a local resolver with a negative cache briefly after creation; verify against a public resolver and validate normal TLS rather than redeploying.

The landing page presents a 50-pound-class robot family as the ambition. Current CAD uses37.5kg (see decision D71); do not turn the brand ambition into a verified product specification. Tritium is a design requirement (D19). The Tritium, Graphlings, and GraphDone cards describe the integration roadmap, not a running connected robot. GraphDone coordinates development work, not onboard control.

web/playground.png is a browser capture of the committed target-practice snapshot, taken2026-10-28. Regenerate it from the simulator when that snapshot changes; do not use a screenshot of an obsolete landing page as the video poster.

Markdown for agents

Every production build generates /index.md, /llms.txt, and a .md counterpart for each public HTML page. HTML includes a rel="alternate" link with type="text/markdown". Use /designer/sim.md, /designer/progress.md, /designer/build.md, and /site/index.md as entry points. Original CAD, JSON, media, and document downloads keep their URLs.

tools/site-markdown.mjs converts published HTML. Progress and Build reuse their trusted browser renderers against only the published bundle, so Markdown contains current report and parts data instead of empty client-rendered placeholders. A missing data snapshot fails the build. No separately maintained copy is needed. npm run test:markdown checks content parity, tables, MIME, downloads, and404s; SITE_URL=https://gyropup.com npm run test:markdown checks hosted routes too.

This uses explicit static routes on the existing Cloudflare Pages plan. It does not negotiate Accept: text/markdown on the HTML URL. Cloudflare's native Markdown for Agents feature requires an eligible plan and Zone Settings Edit permission. Do not silently purchase a plan or expand a DNS token to enable it.

Continuous simulator experience

Ordinary replay/activity changes preserve the renderer, world, character, and conversation. Targets and robot poses blend into the next activity, including recording loops; the previous activity stays visible during loading. Late requests cannot replace a newer selection. Hardware previews and replay props are reused, and the turret re-racks its existing targets in place.

On2026-10-28, stage greetings were found to call talk.say directly, bypassing the conversation's reaction cooldown. Use talk.announce for background stage chatter and honor talk.isBusy() for expressions. Never interrupt a pending answer, listening, or an answer still being presented. A stage change must not recreate the talk panel, history, voice, or character.

Phone sliders previously inherited #panel label { display:flex }, squeezing the label/value/track onto one line. Keep .hud-slider a grid with its track below the label, a contrasting track, and a touch-sized thumb. Pooled inactive target geometry must be hidden after its transition and excluded from raycasts.

Run SITE_URL=http://127.0.0.1:8764 npm run test:sim after the build; set PLAYWRIGHT_BROWSER=webkit for WebKit. This checks an in-flight mocked reply across stage changes, conversation and scene identity, loop blending, stale fetches, cached models, target re-racking, and phone slider layouts. The mock verifies browser continuity without claiming a production AI backend is online.