OpenTMS: deployment and tech stack
The whole system runs on one server: in the cloud we run, or in your own infrastructure. Here is what the server needs, how the parts fit together and what they are built with.
Server requirements
The minimum server is enough to try the system or for one small company. The production column is the server our cloud with many companies is planned for.
| What | Minimum | Production |
|---|---|---|
| Processor | 2 vCPU, x86-64 | 8 cores, x86-64 |
| Memory | 4 GB RAM | 64 GB RAM |
| Disk | 40 GB SSD | 2 × 512 GB NVMe, RAID 1 |
| Operating system | Ubuntu 24.04 or 26.04 LTS | Ubuntu 24.04 or 26.04 LTS |
| Software | Docker Engine and Compose v2 | Docker Engine and Compose v2 |
| Network | Public IP, ports 80 and 443 | Public IP, ports 80 and 443, WireGuard |
| Domains | Office, driver and API addresses | Office, driver and API addresses |
| Backups | On the server's disk | Also off-site: S3 storage or SFTP |
The processor must be x86-64 (amd64). 4 GB of memory is enough to build a new version beside the running one, which also needs at least 6 GB of free disk. PostgreSQL's memory settings are computed from the server's RAM.
Architecture
One API, one database and one background worker. Each outside service is reached through its own adapter, and most can be switched off.
Data model
Every row belongs to an account, and the database itself stops anyone from seeing another company's data.
Tech stack
Versions as pinned in the code. No Redis, message broker or search engine: PostgreSQL does those jobs.
Frontend
- React 19.3 · TypeScript 6.0Office and driver apps
- Vite 8.3Build and dev server
- TanStack Query 5.104Server data in the office app
- AG Grid Community 36.2Order grid
- Tailwind CSS 3.4 · Radix UIComponents (shadcn/ui)
- MapLibre GL 6.16Maps
- Dexie 4.4 · Workbox 7.4Driver app works offline (PWA)
- openapi-fetch 0.17API client generated from OpenAPI
Backend
- Python 3.13 · uvOne language for the API, the worker and the CLI
- FastAPI 0.143 · Uvicorn 0.54REST API and the live stream (SSE)
- Pydantic 2.14Validation and settings
- asyncpg 0.32Raw SQL, no ORM
- WeasyPrint 70PDF documents
- structlog 26.1JSON logs
- MCP Python SDK 2.3MCP server for AI assistants
- Anthropic SDK 1.15Claude on Google Vertex AI, EU region
Database
- PostgreSQL 18.6The only data store
- Row-Level SecurityEach company's data separated in the database
- dbmate 2.36 · squawk 2.70Migrations with up and down, linted
- pgBackRest 2.59Encrypted backups and WAL archive
Job queue and caching
- PostgreSQL outboxJobs are written in the same transaction, no Redis or BullMQ
- FOR UPDATE SKIP LOCKEDPython worker, jobs taken in turn per company
- LISTEN / NOTIFYLive changes without a separate broker
- HTTP cache · zstdHashed files cached for a year, API responses no-store
Sign-in and security
- Argon2 · TOTPPasswords and two-factor sign-in
- OpenID ConnectSign in with Google and Microsoft
- OAuthAI assistants signing in to the MCP server
- AES-256-GCMSecrets stored in the database are encrypted
API
- OpenAPI 3.1 · REST /api/v1One API for the apps, integrations and agents
- ScalarPublic API reference at api.opentms.app/docs
- Standard WebhooksSigned webhooks
- oasdiff 1.33Blocks breaking API changes
Hosting
- Docker · Compose v2Three images: backend, edge and database
- Caddy 2.11HTTPS (Let’s Encrypt), the apps and /api
- Ubuntu 24.04 / 26.04 LTSnftables and WireGuard, SSH only through the VPN
- Uptime Kuma 2.5Public status page
Testing and quality
- pytest 9.1 · HypothesisTests against a real PostgreSQL 18
- Vitest 5 · Testing LibraryFrontend tests
- Playwright 1.64The whole system in a browser
- Locust 2.46Load: 3 companies × 50,000 orders
- ruff · mypy · ESLint · gitleaksCode and secret checks before every change
Also fits a carrier with a few trucks
The system goes live in a few days, without a long implementation, training or mandatory modules. You can bring over your existing orders by pasting them from Excel.
- 1 · Create an account and a company
- 2 · Connect your Noium key
- 3 · Invite your colleagues and your first driver
Create an account
Sign up with your work email or a Google or Microsoft account.
Already have an account? Sign in