A workspace for building small, focused, mostly-static tools that work alongside SPARC'd — each one tuned end-to-end for a single feature.
A shared landing page ties them together at the deploy root. The uploader and tagger share a connection gate and a saved-login session, so you authenticate once and move between them; the explorer has its own sign-in.
apps/sparcd-explorer— a marimo notebook that signs in to the SPARC'd MinIO backend, loads a collection's Camtrap-DP CSVs, and renders a Field Notebook view: a hex-binned map, a species dashboard, stat cards, and drill-in tabs for images, detections, and locations. Query filters apply on Search; display options tune presentation live. Exports to a static Pyodide bundle that runs entirely in the browser (see Static deploy).apps/sparcd-uploader— a static, browser-based tool for preparing and uploading camera-trap image batches. Drop a folder; it scans JPEGs and MP4 videos, runs EXIF, SHA-256, and thumbnails in Web Workers, validates the batch, then writes the canonical Camtrap-DP layout through thes3-safeboundary. Dry-run by default.apps/sparcd-tagger— a static, browser-based tagging interface for camera-trap images. It reads the same buckets, renders an upload's images from presigned URLs, and writes back the canonical Camtrap-DP metadata the other readers already consume.apps/sparcd-home— the shared landing page and app switcher served at the deploy root.
Each app's README.md (and plan.md where present) carries its full
design and phase breakdown.
- Alongside SPARC'd. SPARC'd is the system of record; the tools here read from it and add focused views on top.
- One tool, one job. Each app in
apps/solves a single concrete user problem (a specific report, a specific view, a specific export). When a new need shows up, we add a new app. - Static where possible. Prefer designs that can ship as a static bundle (Pyodide / WASM, prebuilt data files, signed S3 URLs). Each tool stays cheap to host, easy to share, and free of server-side state.
- Bring your own S3. The browser tools have no backend and no server-side
secret. Users supply an S3-compatible endpoint and credentials; IAM/provider
policy and bucket CORS are the real access gates. Writes go through
@sparcd/s3-safe, an append-only boundary with no delete or copy API and a single reviewed, ETag-gated conditional-replace path (replaceIfUnchanged). - Optimize per feature. With a narrow scope per app, we pick the best primitives for that job — data model, layout, interactions — without compromise for anything else.
apps/
sparcd-home/ # shared landing page + app switcher (static HTML)
sparcd-explorer/ # marimo notebooks for data exploration (Python, uv)
sparcd-uploader/ # batch prep + upload, BYO-S3 (TS, Vite)
sparcd-tagger/ # tagging interface, BYO-S3 (TS, Vite)
packages/
auth-ui/ # shared connection gate + saved-login session
camtrap/ # Camtrap-DP data contract (readers, merge, time-shift)
s3-safe/ # S3 client boundary (append-only + reviewed replace)
types/ # shared TypeScript types
- Node ≥ 20 + pnpm 10 — workspace + task runner
- Turborepo — pipeline orchestration across apps/packages
- uv — Python env/deps for any Python-based app (e.g. marimo)
pnpm install # installs turbo and JS workspaces
pnpm --filter sparcd-uploader dev # Vite dev server (uploader)
pnpm --filter sparcd-tagger dev # Vite dev server (tagger)
pnpm --filter @sparcd/sparcd-explorer install:py # uv sync for the marimo app
pnpm dev --filter @sparcd/sparcd-explorer # marimo edit --watchOr run every app's dev task at once:
pnpm devThe Vite apps prefill the S3 endpoint from a gitignored
apps/<name>/.env (VITE_SPARCD_S3_ENDPOINT). Credentials are never
prefilled — they are entered at runtime.
mkdir apps/<name>- Add a
package.jsonwithname,private: true, and at leastdev/buildscripts. Python apps wrapuv run …in their npm scripts. pnpm installto pick it up via the workspace.- Tasks defined in
turbo.json(dev,build,lint,start,check,test) will run across whichever apps implement them.
.github/workflows/pages.yml builds the landing page and each web tool and
publishes them via GitHub Pages on every push that touches an app, a shared
package, or the workflow itself. The
landing page sits at the root, with each tool under its own path
(/explorer, /uploader, /tagger). Live at:
https://culverlab.github.io/sparcd-exploration/
The deployed pages run entirely in the visitor's browser — the explorer runs Python via Pyodide, and the Vite tools talk to S3 directly. SPARC'd credentials are entered in the connection gate; there is no server-side secret. The S3/MinIO endpoint must permit CORS from the Pages origin for data fetches and uploads to succeed.
- Each app's
README.md(andplan.mdwhere present) — that tool's design, data contracts, and status docs/design-system-field-notebook.md— the shared visual design systemdocs/archive/— superseded proposals and point-in-time reports, kept as decision history; nothing there describes the current system