# lowell
The web frontend for [jacquard](../README.md) — named for the Massachusetts
mill town that ran rows of power looms on one river; jacquard is the loom
mechanism, lowell is the mill you walk into to operate one.
Talks to [`jac-serve`](../crates/jac-serve) over HTTP. Not part of the Cargo
workspace (`Cargo.toml`'s `members = ["crates/*", "xtask"]` never reaches
here) — a separate toolchain for a separate layer.
## Run it
```bash
# from the repo root, in one terminal:
cargo run -p jac-serve -- --seed-demo
# in another:
cd web
npm install
npm run dev
```
Then open `http://localhost:3000`. `next.config.ts` proxies `/api/*` to
`jac-serve` (default `http://localhost:8787`; override with `JAC_SERVE_URL`,
see `.env.example`).
## Layout
- `app/jacquard.css` — the design system: forked from the phantom-thread
marketing site's textile theme (`../../rust-blog/app/phantom-thread/`),
renamed to a `jac-` token/class namespace, with an indigo accent and a
punched-card motif in place of the running stitch.
- `app/new/wizard.tsx` — "Warping the loom", the init wizard.
- `lib/api.ts` / `lib/types.ts` — the typed client over `jac-serve`'s JSON
contract.
- `components/voice-statement-input.tsx` — attestation defaults to speaking
the statement (Web Speech API, transcript only — no engine changes), with
a "Type it instead" fallback for browsers without speech recognition.
## Scripts
`npm run dev` / `build` / `start` / `lint` / `typecheck`.