# 00 — Codebase Discovery > **Step 0 output for `/document`.** Read by Step 1 (per-module docs) to drive > processing order, by Step 2 (component assembly) to seed groupings, and by > Step 3 (system synthesis) for the tech-stack table. > > **Scope** (chosen at the autodev gate, 2026-05-10): > - `src/` — Azaion UI (React 19 SPA, the live front-end of the suite). > - `mission-planner/` — embedded React 18 + MUI sub-project (port-source for > `src/features/flights/`). Documented as a separate component group. > - `_docs/` already contained user-curated reference content > (`legacy/wpf-era.md`, `ui_design/`, `_autodev_state.md`); the document > skill writes alongside, not over. > > **Out of scope**: `node_modules/`, `dist/`, `bun.lock`, `package-lock.json`, > `.git/`, `.cursor/`, `_docs/` (read-only inputs), `.idea/`, `.claude/`, > `.superpowers/`, `mission-planner/public/` static assets. --- ## 1. Workspace at a glance ``` suite/ui/ ← Cursor workspace root ├── src/ ← Azaion UI (React 19, the live SPA) ├── mission-planner/ ← embedded port-source (React 18 + MUI) ├── _docs/ ← user-curated + autodev artifacts │ ├── legacy/wpf-era.md read-only reference (WPF predecessor) │ ├── ui_design/ read-only reference (HTML wireframes) │ ├── _autodev_state.md autodev state pointer │ └── 02_document/ ← this folder (autodev outputs) ├── .cursor/ skills/rules/agents ├── .woodpecker/build-arm.yml CI: arm64 Docker build → Harbor ├── Dockerfile multi-stage: bun build → nginx static ├── nginx.conf /api/* reverse proxy → suite services ├── index.html SPA shell (mounts /src/main.tsx) ├── package.json react 19, bun 1.3.11, vite 6, tw 4 ├── tsconfig.json strict ESM, `@/*` → `src/*` ├── vite.config.ts react + tailwind plugin, /api proxy ├── README.md repo overview + maturation plan └── .gitignore node_modules, .env.*, playwright-report/ ``` `src/` and `mission-planner/` are **disjoint** — no file in one imports from the other. The Vite alias `@ → src` is defined only in the workspace `vite.config.ts`; `mission-planner/vite.config.ts` has no aliases. Each has its own `package.json`, `tsconfig`, `index.html`, and entry point. The production bundle (`Dockerfile`) builds **only the workspace**, not `mission-planner/`. `mission-planner/` ships a (mostly) functional flight-mission UI that the `src/features/flights/*` files are mechanically translating into the new SPA. Per the workspace `README.md`, `mission-planner/` is **not** part of the deployed product. ## 2. Tech stack ### 2a. Workspace `src/` (Azaion UI) | Concern | Choice | Source | |----------------|-------------------------------------|--------------------------| | Language | TypeScript 5.7 (`strict: true`) | `tsconfig.json` | | UI framework | React 19 (`react-dom/client`) | `package.json` | | Bundler | Vite 6 | `package.json`, `vite.config.ts` | | Pkg manager | Bun 1.3.11 (declared via `packageManager`) | `package.json` | | Styling | Tailwind CSS 4 (`@tailwindcss/vite`) + custom `az-*` tokens in `src/index.css` | `package.json`, `vite.config.ts` | | Routing | `react-router-dom` 7 | `src/App.tsx` | | i18n | `i18next` + `react-i18next` (UA / EN) | `src/i18n/i18n.ts` | | Map | `leaflet` 1.9 + `react-leaflet` 5 + `leaflet-draw` + `leaflet-polylinedecorator` | `package.json`, `src/features/flights/*` | | Charts | `chart.js` 4 + `react-chartjs-2` | `package.json` | | DnD | `@hello-pangea/dnd` 18 | `package.json` | | File upload | `react-dropzone` | `package.json` | | Icon set | `react-icons` | `package.json` | | HTTP transport | native `fetch` (custom thin wrapper) | `src/api/client.ts` | | Realtime | native `EventSource` (SSE) | `src/api/sse.ts` | | State mgmt | React Context only — `AuthContext`, `FlightContext`. **No** Redux / Zustand / TanStack Query. | `src/auth/`, `src/components/FlightContext.tsx` | | Tests | **none** (no test framework configured) | (verified via Glob) | | Build target | static bundle → nginx (multi-stage Dockerfile) | `Dockerfile`, `nginx.conf` | | Runtime | nginx in container, ARM64 image | `.woodpecker/build-arm.yml` | ### 2b. `mission-planner/` (port-source) | Concern | Choice | Source | |----------------|------------------------------------------|------------------------------| | Language | TypeScript 5.7 (`strict: true`) | `mission-planner/tsconfig.app.json` | | UI framework | React 18 | `mission-planner/package.json` | | Bundler | Vite 6 | `mission-planner/vite.config.ts` | | Pkg manager | npm (lockfile not committed) | (no `bun.lock` in `mission-planner/`) | | UI library | MUI 5 (`@mui/material` + `@mui/icons-material` + `@emotion/*`) | `mission-planner/package.json` | | Map | `leaflet` 1.9 + `react-leaflet` 4.2 + `leaflet-draw` + `leaflet-polylinedecorator` | `mission-planner/package.json` | | Charts | `chart.js` 4 + `react-chartjs-2` | `mission-planner/package.json` | | DnD | `@hello-pangea/dnd` 16 | `mission-planner/package.json` | | Flags | `react-world-flags` | `mission-planner/package.json` | | Tests | Jest implied (`@testing-library/jest-dom` import in `setupTests.ts`, `describe/it/expect` in `src/test/jsonImport.test.ts`) but **no** Jest dep nor config in `package.json` — test currently cannot run as-is. | `mission-planner/package.json`, `src/setupTests.ts`, `src/test/jsonImport.test.ts` | | Env config | `.env.example` declares `VITE_SATELLITE_TILE_URL` | `mission-planner/.env.example` | | Build target | not built or shipped by the suite | (Dockerfile copies only workspace `src/`) | ## 3. Configuration & infrastructure files | Path | Role | |-------------------------------------|----------------------------------------------------------------------| | `package.json` (workspace) | scripts: `dev`, `build` (`tsc -b && vite build`), `preview`. No `test`. | | `tsconfig.json` | `strict: true`, `noUnusedLocals/Parameters: false` (lax), `paths: {"@/*": ["./src/*"]}`. | | `vite.config.ts` | `@vitejs/plugin-react` + `@tailwindcss/vite`. Dev proxy `/api → http://localhost:8080`. | | `index.html` | `
` + `