# Audit Firm v2 — Full Baseline (Tailwind CDN + HTML + API + Security + System Settings) This baseline is designed to be a **stable v2 foundation** before adding other modules. ## What’s included - FastAPI app with **HTML + API** side-by-side - Tailwind CSS via **CDN** - Modular templates: `app/ui/templates/modules//...` - System Settings module (super-admin UI): - Tenants - Branches - Branch policies (identity, holidays, email policy, storage policy, security policy) - Security (built-in): - Password hashing (bcrypt via passlib) - Session auth (browser UI) + CSRF protection for HTML forms - Secure cookie options (configurable) + security headers + CSP (Tailwind CDN allowed) - RBAC (roles/permissions) with default roles seeded: - System Admin, Firm Admin, Partner, Branch Manager, Staff, Client, Consultant - Login lockout policy (attempts + lockout minutes) enforced - Session expiry policy enforced (minutes) - OTP step (dev mode): OTP code is printed to console (placeholder for SMS/Email provider) - DB: - Common DB via SQLAlchemy (SQLite now; Postgres later) - Tables are created on startup using `metadata.create_all()` to keep install smooth. (Next step: replace with Alembic common + year.) - Tools: - Local Storage Agent generator (`tools/storage_agent/`) ## Quick start (Windows) ```bat python -m venv venv venv\Scripts\activate pip install -r requirements.txt copy .env.example .env uvicorn app.main:app --reload ``` Open: - http://127.0.0.1:8000/health - http://127.0.0.1:8000/login - http://127.0.0.1:8000/system-settings Bootstrap admin (first run): - Uses `BOOTSTRAP_ADMIN_EMAIL` and `BOOTSTRAP_ADMIN_PASSWORD` from `.env` ## OTP (dev placeholder) If OTP is required for your role (see Branch Settings → Security Policy), the app will show an OTP page after password login and print the OTP code in the console logs. ## JWT (API authentication) Endpoints: - POST `/api/auth/token` - POST `/api/auth/refresh` - POST `/api/auth/logout` - GET `/api/auth/me` (debug helper) Notes: - Access token is JWT (HS256) signed using `SECRET_KEY` - Refresh token is opaque and stored hashed (sha256) in DB with rotation ## Template structure refactor Templates are now organized as: - `app/modules/system_settings/templates/...` - `app/modules/core/iam/templates/...` - `app/modules/core/audit/templates/...` - shared base remains at `app/ui/templates/base/layout.html` The Jinja loader resolves from `app/`, so module templates can safely extend: `ui/templates/base/layout.html` ## Alembic added to baseline This baseline now uses **Alembic for the Common DB from the beginning**. ### First-time setup 1. Create virtual environment and install requirements 2. Copy `.env.example` to `.env` 3. Run: `alembic upgrade head` 4. Start app: `uvicorn app.main:app --reload` ### Create a new migration `alembic revision --autogenerate -m "message"` ### Apply migrations `alembic upgrade head` ### Downgrade one step `alembic downgrade -1` ### Windows helper scripts - `scripts\migrate_up.bat` - `scripts\new_migration.bat "message"` ### Important - App startup no longer creates schema automatically. - Schema must be migrated using Alembic first. - This baseline adds **Common DB Alembic only**. - `alembic_year/` for year databases can be added next.