pcbjam/web
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Viktor Vaczi df38ebafb7 feat(deploy/site): serve the apex from the same Pages project, no redirect rule
Vercel was doing the apex->www 308 itself (its "redirect to www" project
setting), so nothing about Cloudflare requires a redirect — the behaviour
just disappears with Vercel. Rather than rebuild it with a zone Redirect
Rule plus a proxied placeholder record, attach pcbjam.com as a SECOND
custom domain on pcbjam-site. Both hosts serve the site and the pages
already emit canonical=www, which is what consolidates them for search.

That drops the riskiest artefact in the migration. Redirect Rules are
zone-scoped and run BEFORE Workers/Pages routing, so a `contains` match
instead of `eq` would 308 app./editor./demo./api. to www — breaking the
product API, not just a marketing page. The sibling hosts are also the
reason this was worth avoiding rather than merely guarding.

APEX_MODE (lib/common.sh) selects the topology, defaulting to `serve`.
08-verify-prod.sh now dispatches through assert_apex: in serve mode it
requires the apex to answer 200 with no hop, to not be a stale Vercel
response, to declare canonical=www, and to expose /api/waitlist. The
`redirect` mode and 07's rules/apex phases are kept for the alternative.

08 also checks the attached domains via wrangler rather than the REST API,
so the whole serve-mode path needs only `wrangler login` — no zone scopes
at all.

Comments that explained themselves via the old redirect are corrected:
astro.config.mjs, web/standalone/src/lib/config.ts and
scripts/deploy/build-demo.mjs. The demo keeps posting to www — not because
the apex redirects, but because a CORS preflight cannot follow one, so
aiming at a host that might ever redirect is a latent breakage.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LAmkjM7okPdScp9XLW1JVr
2026-07-27 14:34:16 +02:00
..
backend comments-ux: figma bubble pins, floating panel, seen/reactions/mentions UI, theme follow (0001 A–E + 0002) 2026-07-24 13:21:22 +02:00
pcbjam-shared@5d35bcd2ad comments-ux: figma bubble pins, floating panel, seen/reactions/mentions UI, theme follow (0001 A–E + 0002) 2026-07-24 13:21:22 +02:00
standalone feat(deploy/site): serve the apex from the same Pages project, no redirect rule 2026-07-27 14:34:16 +02:00
.env.example refactor(web): split into GPL standalone editor + thin reference backend 2026-06-09 12:35:46 +02:00
.gitignore feat(libs): eeschema symbol-chooser footprint selector + preview via publish-time fp-index 2026-07-07 21:09:21 +02:00
package.json chore: add dev:demo script (web) + refresh site lockfile 2026-06-30 09:54:49 +02:00
pnpm-lock.yaml comments-ux: figma bubble pins, floating panel, seen/reactions/mentions UI, theme follow (0001 A–E + 0002) 2026-07-24 13:21:22 +02:00
pnpm-workspace.yaml feat(libs): r2-idb-sync bridge — sync-wire protocol, FE/BE packages, apps/server resolve+origin serving, GPL adapter 2026-06-17 09:59:59 +02:00
README.md feat: GPL backend self-provisions example libs + standalone port override 2026-06-16 16:28:21 +02:00
tsconfig.base.json feat(web): checkpoint web app init 2026-06-02 20:32:19 +02:00
turbo.json e2e/CI: dual-engine suites, per-engine screenshots, SwiftShader retired, prod web suite, CI-coverage gate 2026-07-17 12:21:54 +02:00

PCBJam Web — standalone editor (GPL)

A self-contained, GPL web app that opens KiCad projects in the WASM tools (pcbnew / eeschema / pl_editor / …) — from a local folder, or from any backend that implements the MIT @pcbjam/shared contract. It opens a tool by URL:

/p/<project>/<tool>/<file-path>      e.g. /p/demo/pcbnew/nyak.kicad_pcb

This workspace contains only the generic editor and a thin reference backend. All project-specific concerns (accounts, project management, uploads, auth) live in the separate closed application, which reuses this editor by hosting it standalone and redirecting to it (it must not link the GPL editor).

Layout

web/
├── standalone/      # @pcbjam/standalone — the GPL editor (Vite + React)
├── backend/         # @pcbjam/backend-example — thin reference @pcbjam/shared impl
└── pcbjam-shared/   # @pcbjam/shared — the FE↔BE contract (git submodule, MIT)
  • Editor: Vite + React + TypeScript. Boots a tool directly in the document (no iframe), syncs the project tree into MEMFS, drives File→Open, and runs same-tab collaboration over BroadcastChannel.
  • Example backend: Fastify + ts-rest serving a single project off the local filesystem (PROJECT_DIR). No DB, no auth, no uploads — the minimum the editor needs, and a worked example of the contract. Listens on :3060. On dev/start it self-provisions example libraries — a curated slice of upstream KiCad symbol + footprint libs is cloned + extracted into .libs (served as read-only origins), so a bare clone has libraries to browse with no closed repo present. See backend/src/extract/.

Quick start

cd web
pnpm install
git submodule update --init web/pcbjam-shared   # if not already populated

cp standalone/.env.example standalone/.env
cp backend/.env.example backend/.env            # PROJECT_DIR=../../tests/fixtures/demo

pnpm dev                                         # turbo: backend :3060 + editor :3048

Open http://localhost:3048 — either open a local folder (no backend needed) or open the backend's project. The editor can point at any conforming backend via VITE_API_BASE_URL.

WASM artifacts

The runtime artifacts (<tool>.js/.wasm, wx.js, images.tar.gz, <tool>.html) are build outputs, not committed. They are synced into tests/apps/kicad/ by tests/scripts/setup-kicad-wasm.sh (from repo-root output/).

They must be served same-origin as the app. Under the document's COEP / cross-origin-isolation (set by the Vite dev server), KiCad WASM refuses to load its glue/wasm from a different origin. pnpm dev runs scripts/link-wasm.mjs, which symlinks standalone/public/wasm → tests/apps/kicad; Vite serves them at /wasm. VITE_WASM_ASSET_BASE_URL defaults to /wasm.

  • Point the symlink elsewhere with WASM_SRC_DIR=/path pnpm --filter @pcbjam/standalone link-wasm.
  • If a tool won't load, the target dir is probably empty — run tests/scripts/setup-kicad-wasm.sh to populate tests/apps/kicad/.
  • prod: point VITE_WASM_ASSET_BASE_URL at a URL whose origin also satisfies the same-origin / COEP constraints.

Scripts

Command What
pnpm dev editor + example backend (turbo)
pnpm build build all packages
pnpm typecheck typecheck all packages

Contract (@pcbjam/shared, MIT)

The editor reads from a backend over the shared contract: GET /api/projects, GET /api/projects/:project, GET /api/projects/:project/files, and the streamed GET /api/projects/:project/files/* (raw bytes). Management/write operations and ownership are not part of this contract — they belong to the closed app.