# KROW Workforce Control Tower A standalone frontend application. There is no backend, no external API and no login: the app opens directly into the Control Tower UI, locally and when deployed, and keeps working with no network at all. ``` Frontend → local data / React state / localStorage → KROW UI ``` ## Running it ```bash npm install npm run dev # http://localhost:5174 npm run build # static bundle in dist/ npm run preview # serve the production build locally ``` Deployment is a static-file deploy: serve `dist/` with any web server, with a SPA fallback so deep links (`/Events`, `/Schedule`, …) resolve to `index.html`. The included `Dockerfile` + `nginx.conf` do exactly that. ## Where the data lives Everything the UI reads and writes goes through one object — `krow`, exported from [`src/api/client.js`](src/api/client.js): | Area | Local implementation | | --- | --- | | `krow.entities.*` | [`src/api/local/store.js`](src/api/local/store.js) — collections held in memory and mirrored into `localStorage` | | Starting data | [`src/api/local/seedData.js`](src/api/local/seedData.js) — the bundled demo dataset, copied in on first read | | Data model | [`src/api/local/schemas.json`](src/api/local/schemas.json) — entity schemas, loaded on demand for `.schema()` | | `krow.auth` | [`src/api/local/auth.js`](src/api/local/auth.js) — a single local operator profile; no sign-in | | `krow.integrations.Core` | [`src/api/local/integrations.js`](src/api/local/integrations.js) — uploads become local data/object URLs; email/SMS are recorded locally | | `krow.agents` | [`src/api/local/agents.js`](src/api/local/agents.js) — assistant threads stored locally, answered by [`src/lib/owliver/owliverEngine.js`](src/lib/owliver/owliverEngine.js) | Edits persist per browser. `krow.resetLocalData()` (from the console, or any code) clears local data and restores the bundled demo dataset. Collections with no seed data start empty, which is the empty state the pages already render — so adding an entity needs no wiring, only a key in `seedData.js` if it should start with rows. ## Layout ``` src/ api/ the local client (client.js) and its implementation (local/) pages/ one file per route, auto-registered via pages.config.js components/ feature components and the ui/ primitives lib/ shared helpers, the Owliver engine and page registry Layout.jsx the Control Tower shell: header, sidebar, Owliver ```