Initial commit
This commit is contained in:
123
README.md
Normal file
123
README.md
Normal file
@@ -0,0 +1,123 @@
|
||||
# KROW Demo
|
||||
|
||||
AI-powered hiring for event and hospitality staffing — a standalone demo build of KROW Forge.
|
||||
|
||||
Runs with no backend, no API keys, and no login. `npm install && npm run dev` and the app is fully
|
||||
populated.
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## Architecture
|
||||
|
||||
Vite + React 18, React Router 6, React Query 5, Tailwind + shadcn/ui, Framer Motion, Recharts.
|
||||
|
||||
```
|
||||
src/
|
||||
api/ data client — entity store, demo dataset, local AI engine
|
||||
assets/ brand asset references
|
||||
components/
|
||||
ui/ 50 shadcn primitives (design system)
|
||||
krow/ domain components
|
||||
talent/ talent-portal components
|
||||
proving/ Proving Ground challenge components
|
||||
hooks/ shared hooks
|
||||
layouts/ Layout — header, nav pill, control bar, mobile sheet
|
||||
lib/ data hooks, score engine, AI workflows, auth context, utils
|
||||
pages/ 18 route components
|
||||
utils/ helpers
|
||||
```
|
||||
|
||||
### The backend seam
|
||||
|
||||
The production app talks to a Base44 backend through `src/api/base44Client.js`. This demo keeps
|
||||
that module path, export name, and full method contract, and swaps only the transport:
|
||||
|
||||
| Contract | Demo implementation |
|
||||
| --- | --- |
|
||||
| `base44.entities.<Name>.list/filter/get/create/update/delete` | `api/store.js` — in-memory records, mirrored to `localStorage` |
|
||||
| `base44.integrations.Core.InvokeLLM` | `api/aiEngine.js` — local, deterministic |
|
||||
| `base44.integrations.Core.UploadFile` | blob URLs, session-scoped |
|
||||
| `base44.auth.*` | seeded employer/admin user, always signed in |
|
||||
|
||||
Because the seam did not move, everything above it — `lib/krowHooks.js`, `lib/krowAi.js`,
|
||||
`lib/provingGround.js`, `lib/krowScore.js`, every page and component — is unchanged from the
|
||||
reference implementation.
|
||||
|
||||
### The AI engine
|
||||
|
||||
Every AI workflow in the app funnels through one call, `InvokeLLM({ prompt, response_json_schema })`.
|
||||
`api/aiEngine.js` reimplements that function locally. It recognizes each workflow by the phrase its
|
||||
prompt opens with, reads the structured fields the prompt already carries (`Years Experience: 6`,
|
||||
`Required Certifications: …`, the talent-pool JSON block), and scores them deterministically.
|
||||
|
||||
Nine workflows are implemented: candidate screening, job-description generation, résumé building,
|
||||
interview questions, interview evaluation, talent matching, Owliver's conversation, Career DNA
|
||||
building, and Proving Ground evaluation.
|
||||
|
||||
Results respond to the data rather than being canned — screening a 7-year native-English candidate
|
||||
and a 1-year candidate against the same posting returns genuinely different scores, breakdowns,
|
||||
strengths and gaps. The same input always returns the same output.
|
||||
|
||||
### Owliver
|
||||
|
||||
Two assistants share one visual language:
|
||||
|
||||
- **`OwliverAssistant`** — the hiring assistant, mounted on **Overview**, **Candidates** and
|
||||
**Analytics** only. Answers from the same React Query caches the pages render from, so what it
|
||||
says and what the dashboard shows can never disagree.
|
||||
- **`OwliverChatBubble`** — the talent-facing profile builder, mounted in the Talent role.
|
||||
|
||||
## Demo data
|
||||
|
||||
Seeded in `src/api/seed.js`: 7 positions (5 open), 22 applicants, 9 AI-scored candidates averaging
|
||||
76, 4 AI interviews, 3 hires, 6 talent-pool profiles, 4 Proving Ground courses, and an activity log.
|
||||
|
||||
Edits persist to `localStorage` — screen candidates, hire someone, create a position, and the
|
||||
numbers move everywhere. To restore the shipped dataset:
|
||||
|
||||
```js
|
||||
// in the browser console
|
||||
localStorage.removeItem('krow_demo_db'); location.reload();
|
||||
```
|
||||
|
||||
Bumping `STORAGE_VERSION` in `src/api/store.js` invalidates saved snapshots automatically, so
|
||||
changing the seed does not require a manual clear.
|
||||
|
||||
## Roles
|
||||
|
||||
The header role switcher moves between three surfaces, persisted in `localStorage`:
|
||||
|
||||
- **Employer** — Overview, Positions, Candidates, Hired History, Talent Pool, Analytics
|
||||
- **Admin** — adds Control Center, KROW Forge, Activity
|
||||
- **Talent** — My Portal, KROW Forge, Opportunities
|
||||
|
||||
## Design system
|
||||
|
||||
Tokens live in `src/index.css` as HSL CSS variables consumed by `tailwind.config.js`.
|
||||
|
||||
| Token | Value |
|
||||
| --- | --- |
|
||||
| Primary — KROW Blue | `#0A39DF` |
|
||||
| Accent — KROW Yellow | `#F9E547` |
|
||||
| Pale Yellow | `#F8E08E` |
|
||||
| Dark Navy | `#333F48` |
|
||||
| Mint | `#D1E0D7` |
|
||||
| Radius | `0.75rem` |
|
||||
| Headings | Sora |
|
||||
| Body | Inter |
|
||||
|
||||
The page background is `bg-[#F8FAFC]` under the `gradient-mesh` utility — four radial gradients in
|
||||
blue, yellow and mint. Surfaces use `glass` and `glass-card` (backdrop blur with saturation).
|
||||
|
||||
## Scripts
|
||||
|
||||
| Command | Purpose |
|
||||
| --- | --- |
|
||||
| `npm run dev` | Dev server (honors `PORT`) |
|
||||
| `npm run build` | Production build |
|
||||
| `npm run preview` | Serve the build |
|
||||
| `npm run lint` | ESLint |
|
||||
| `npm run lint:fix` | ESLint with `--fix` |
|
||||
Reference in New Issue
Block a user