# Ten31Portal Internal system of record for Ten31 entities, holdings, positions, and quarterly valuation sign-off. ## Accounts and access Two kinds of accounts: - **Internal staff** (`approver`, `cfo`, `fund_admin`, `viewer`) — the full back-office app (entities, holdings, valuations, import, audit). `approver` and `cfo` also get the admin screens below. - **External accounts** (`investor`, `fund_administrator`) — a separate, entity-scoped portal. An external account only sees the entities granted to it. - **Investor** — sees, per fund, their latest capital-account value and history, plus documents shared to the fund or addressed privately to them (e.g. their K-1). - **Fund administrator** — sees assigned entities and can upload documents for them (shared or addressed to a specific investor). Admin screens (Users / Documents / Capital Accounts, visible to `approver` and `cfo`) let you create an account with a username and password, check off which entities it can view, upload documents, and enter each investor's capital-account figures. Login accepts a username **or** an email. The first admin is created from the CLI: ```bash ten31portal-cli create-user --name "You" --username admin --role cfo --password '...' # --email is optional; external accounts are normally created from the Users screen. ``` ## Prerequisites - Python 3.11+ - Node.js 20+ ## Backend ```bash cd backend python -m venv .venv source .venv/bin/activate pip install -e . uvicorn ten31portal.main:app --reload --port 8000 ``` Health check: `GET http://localhost:8000/api/health` ## Frontend ```bash cd frontend npm install npm run dev ``` Opens at `http://localhost:5173`. Proxies `/api` to the backend on port 8000. ## Project structure ``` ten31portal/ backend/ ten31portal/ # FastAPI application main.py # App object and health endpoint config.py # Env-based configuration pyproject.toml frontend/ src/ App.tsx # Main component main.tsx # Entry point vite.config.ts deploy/ # StartOS packaging (Issue 17) SPEC.md # v1 issue specs ```