Development
How it has been built
The project is young — its visible history is a handful of commits over a few days in September 2026 — and it has been built with AI coding agents as a deliberate part of the workflow. AGENTS.md and CLAUDE.md carry the repository's standing instructions, and docs/ holds implementation plans that are updated as phases land rather than written once and abandoned.
The habit that does the most work is the validation loop. Each substantial change is expected to pass:
node --experimental-strip-types --test tests/*.test.mjs
pnpm exec tsc --noEmit
pnpm exec eslint .
pnpm build- 1
Unit tests
node --test tests/*.test.mjsProperty normalisation, Parquet and SGEO decoding, camera sync, loading progress and project lists.
- 2
Type check
tsc --noEmitModules drifting from each other and from the shapes Speckle's APIs return.
- 3
Lint
eslint .React and Next.js rule violations.
- 4
Production build
pnpm buildFailures that only appear in the webpack build that ships.
Live validation
Whether the format was really understood: a real project, model and version, recorded in docs/ with what was observed.
Tests run on Node's built-in test runner with type stripping, so they import the TypeScript modules directly with no build step or test framework. They cover the parts where being quietly wrong is most expensive: property normalisation, the Parquet and SGEO decoders, camera synchronisation, viewer loading progress, and project list handling.
Alongside that, the docs record live validation against real models, naming the project, model and version used, and what was actually observed. A green test suite says the decoder does what its author expected; only real geometry says the format was understood correctly.
Running it locally
Clone signs in through an OAuth application registered on a Speckle server, so it needs that application's credentials before it can do anything.
Copy .env.example to .env.local and fill in SPECKLE_APP_ID and SPECKLE_APP_SECRET from an application you have registered on your Speckle server. Set NEXT_PUBLIC_BASE_URL to http://localhost:3000 and register http://localhost:3000/api/speckle-connect as the application's redirect URL.
- Application ID
SPECKLE_APP_ID - Application secret
SPECKLE_APP_SECRETSecret: it stays in .env.local and out of version control.
- Redirect URL
http://localhost:3000/api/speckle-connectNEXT_PUBLIC_BASE_URL=http://localhost:3000Both sides must name the same origin.
- Server the application lives on
SERVER_URLOptional. Defaults to https://app.speckle.systems.
Then:
pnpm install
pnpm devRestart the dev server after changing environment variables. Keep .env.local out of version control. If you develop against a self-hosted server rather than app.speckle.systems, read Server addresses first: one endpoint is still hard-coded.