Technical Architecture
Overview
Makenot.work is a monolith: a single deployable unit with clear internal boundaries, no microservices complexity.
Stack
- Language: Rust
- Framework: Axum
- Templates: Askama (compile-time checked)
- Database: PostgreSQL
- File Storage: S3-compatible object storage
- Frontend: HTMX for dynamic interactions
- Search: PostgreSQL full-text search (no Elasticsearch dependency)
Core Components
┌─────────────────────────────────────────────────┐
│ Caddy (HTTPS) │
└─────────────────────┬───────────────────────────┘
│
┌─────────────────────▼───────────────────────────┐
│ Axum Application Server │
│ ┌───────────┐ ┌───────────┐ ┌───────────────┐ │
│ │ Page │ │ API │ │ Auth │ │
│ │ Routes │ │ Routes │ │ Middleware │ │
│ └───────────┘ └───────────┘ └───────────────┘ │
└──────┬──────────────────────────────┬───────────┘
│ │
┌──────▼──────┐ ┌──────▼──────┐
│ PostgreSQL │ │ S3 Storage │
│ (sessions) │ │ (files) │
└─────────────┘ └─────────────┘
Data Flow
- Upload: Client > API > Temp storage > Processing worker > S3 > Database record
- Playback: Client > API > Signed URL generation > Direct S3 stream
- Payment: Client > API > Payment processor webhook > Database > Payout queue
Design Principles
- No vendor lock-in: All components have open-source alternatives
- Horizontal scaling ready, single-server today: The application is written so a load balancer can sit in front of multiple stateless app servers, but production currently runs as a single VPS. The load-balanced topology is on the roadmap, not in production. See Infrastructure & Vendors for the current deployment.
- Data locality: Keep related data together, minimize cross-service calls
- Fail gracefully: If S3 is unavailable, streaming stops but the site stays up for browsing and purchases
See Also
- Infrastructure & Vendors: specific providers we use
- Open Source: License and source availability
- How We Work: creator and fan workflows