ebafcf19d9a3e40f0832f2bff12968ed1dd24370
The batch history import now also records each quarter's NAV in the fund's valuation history: the old file's HLD rows are matched by issuer and security name against the book as it exists today, matched rows write that quarter's valuations, unmatched rows are counted and reported, and nothing outside the round is created or modified. A manually signed quarter is never overwritten. The single-file wizard automatically takes the same history-only path when the file is older than the fund's newest round. Previously that import would regress position cost basis to the old file's values and resurrect since-exited positions, corrupting the fund's Invested total.
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).approverandcfoalso 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:
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
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
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
Languages
TypeScript
49.6%
Python
48.2%
Makefile
0.9%
Shell
0.4%
JavaScript
0.4%
Other
0.5%