# PROJECT KNOWLEDGE BASE **Generated:** 2026-02-19 **Commit:** a4cff98 **Branch:** (current) ## OVERVIEW Homelab topology visualizer - React + Express full-stack app displaying infrastructure as interactive graph (network → hosts → containers → volumes). ## STRUCTURE ``` ./ ├── server/ # Express API backend │ └── routes/ # API endpoints (discover, config, stats, files) ├── src/ # React frontend │ ├── components/ # UI components (Header, LeftPanel, RightPanel, Graph) │ ├── services/ # Discovery logic │ ├── store/ # Zustand state │ ├── types/ # TypeScript definitions │ └── utils/ # Utilities ├── docker/ # Nginx + Dockerfile ├── dist/ # Built frontend (committed - non-standard) └── index.html # Frontend entry ``` ## WHERE TO LOOK | Task | Location | Notes | |------|----------|-------| | Add API endpoint | server/routes/*.ts | Modular route files | | Add UI component | src/components/*.tsx | React components | | State management | src/store/topologyStore.ts | Zustand store | | Discovery logic | src/services/discovery.ts | Data transformation | | SSH discovery | src/services/sshDiscovery.ts | SSH connectivity | ## CODE MAP | Symbol | Type | Location | Role | |--------|------|----------|------| | App | component | src/App.tsx | Main orchestrator | | TopologyGraph | component | src/components/Graph/TopologyGraph.tsx | Graph rendering | | useTopologyStore | hook | src/store/topologyStore.ts | Global state | | discoverRouter | router | server/routes/discover.ts | /api/discover | ## CONVENTIONS (THIS PROJECT) - **TypeScript**: Strict mode enabled, ESNext modules - **Path alias**: `@/*` maps to `src/*` - **Frontend**: React 18 + Vite + Tailwind CSS + Zustand - **Backend**: Express 5 + TypeScript (tsx runtime) - **Graph**: @xyflow/react (React Flow) + dagre layout - **Build**: `tsc -b && vite build` - **Lint**: `eslint .` (flat config) - **Run dev**: `npm run dev` (frontend), `npm run server` (backend) ## ANTI-PATTERNS (THIS PROJECT) - **DO NOT commit dist/**: Build artifacts in `dist/` are committed - should be in .gitignore - **DO NOT skip tsc**: Build script runs `tsc -b` before vite - don't remove - **DO NOT use localStorage for SSH credentials**: Security risk (documented in .sisyphus/plans) ## UNIQUE STYLES - Dual runtime: frontend (Vite) + backend (tsx server/index.ts) - Fallback to simulated data if API unavailable - Polling-based live updates (configurable interval) - Graph auto-layout with dagre ## COMMANDS ```bash npm run dev # Frontend dev server (localhost:3000) npm run server # Backend API server (localhost:3001) npm run build # TypeScript + Vite build npm run lint # ESLint check npm run discover # Run SSH discovery standalone ``` ## NOTES - Frontend expects API at `http://localhost:3001` (configurable via VITE_API_URL) - API routes mounted under `/api/*` - CORS configured for `http://localhost:3000` only - SSH discovery uses ssh2 library - requires network access to hosts