Requirements & sizing
Requirements
Section titled “Requirements”- Docker and Docker Compose, the normal way to run RedScribe (Installation Methods 1–3).
- For local development without Docker (Method 4): Python 3 (for a
virtualenv) and a local Postgres, or just the
dbservice from Docker Compose. - Node.js/npm, only needed if you have to rebuild the frontend asset bundles (Tiptap editor, password-strength meter, Tailwind CSS) after touching their sources. It’s not a runtime dependency of the deployed app and isn’t used in the Docker image at all. See Frontend asset builds.
- For Method 1 (Tailscale): a host already joined to a Tailscale tailnet with MagicDNS + HTTPS certs enabled.
Sizing
Section titled “Sizing”RedScribe is sized by concurrently active users, not total registered accounts, since almost every request is a fast, DB-backed read/write. The one thing that blocks a full gunicorn worker for its duration is report export (WeasyPrint PDF / DOCX assembly).
- Recommended matches gunicorn’s
(2 × cores) + 1worker formula (see CPU / worker count) and the defaultmax_concurrent_report_jobslimiter. - Minimum is the same tier a size down. It boots and holds up, just without headroom to spare.
These are estimates from the app’s own concurrency model rather than a load test, so watch real report-export duration on your largest engagement before committing to a tier.
| Tier | Concurrently active · registered accounts | vCPU (min → rec.) | RAM (min → rec.) | Gunicorn workers (rec.) | Disk | Report job slots |
|---|---|---|---|---|---|---|
| Solo | 1 user | 1 | 1 → 2 GB | 3 | 10 GB+ | 1 |
| Pilot | ≤5 · ≤10 | 1 → 2 | 2 → 4 GB | 5 | 20 GB | 2 (default) |
| Small firm | 10–15 · 10–30 | 2 → 4 | 4 → 8 GB | 9 | 40–50 GB | 2 (default) |
| Mid-size firm | 25–40 · 30–80 | 4 → 8 | 8 → 16 GB | 17 | 100 GB+ | 3–4 |
| Larger firm | 50+ · 80–150+ | 8 → 16 | 16 → 32 GB | 33 | 200 GB+ | 4–6, with caution |
RedScribe runs fine on a 1 vCPU / 1 GB box for a single person kicking the tires, below even the Solo row above, but that’s a floor to try it out on, not a comfortable size once a second person or a report export joins in.
What shifts these numbers
Section titled “What shifts these numbers”- RAM before CPU. WeasyPrint’s rendering engine spikes hardest on image-heavy reports, so bias a tier’s RAM up before its vCPU if findings carry a lot of screenshots.
- Shared host. These figures assume
web+ Postgres on one box, as shipped. Splitting the database onto its own host frees up headroom on both sides independently. - Disk growth is driven by encrypted evidence blobs and backup retention, not schema size.
- Per-engagement ceiling. At most two people ever contend for one engagement’s data, by design, so total accounts and concurrent load scale independently of write-conflict risk.