Tech stack¶
Languages¶
| Part | Language |
|---|---|
| Server and command-line client | Rust (edition 2021) |
| Web interface | HTML, CSS and JavaScript ES modules, with no framework |
| Database schema | SQL (SQLite) |
| Cloudflare front door | JavaScript (Cloudflare Workers) |
| Mail relay | Google Apps Script |
| Scripts | Bash |
| This documentation | Markdown with MkDocs and the Material theme |
Rust libraries (crates/vistilla-api)¶
Versions are as declared in Cargo.toml. The exact versions resolved in
Cargo.lock are in brackets.
| Crate | Version | Used for |
|---|---|---|
| axum | 0.8 (0.8.9), macros |
HTTP routing, extractors, responses. |
| tokio | 1 (1.53.2), full |
Async runtime, tasks, timers, files, processes. |
| tower | 0.5 | Middleware building blocks (ServiceBuilder). |
| tower-http | 0.6 (0.6.11), trace, fs, set-header, cors |
Request tracing, ServeDir for /assets and /docs, cache headers. |
| sqlx | 0.8 (0.8.6), runtime-tokio, sqlite |
Async SQLite with a bundled SQLite. |
| serde / serde_json | 1 | JSON in and out. |
| reqwest | 0.12 (0.12.28), rustls-tls, stream, json, multipart |
Calls to S3, AI providers, Brevo and the mail relay. |
| lettre | 0.11 (0.11.23), tokio1-rustls-tls, smtp-transport, builder |
Sending email over SMTP. |
| argon2 | 0.5 (0.5.3) | Password hashing. |
| chacha20poly1305 | 0.10 (0.10.1) | Encrypting stored AI keys (XChaCha20-Poly1305). |
| sha2, hmac, hex | 0.10 / 0.12 / 0.4 | Token hashing and the S3 SigV4 signature. |
| rand | 0.8 | Secure random ids, tokens and codes (OsRng). |
| base64 | 0.22 | Keys, inline audio for the AI, sealed secrets. |
| url, percent-encoding | 2 | URL parsing and S3 signing. |
bytes, futures, tokio-util (io) |
1 / 0.3 / 0.7 | Streaming request and response bodies. |
| anyhow, thiserror | 1 / 2 | Error handling. |
tracing, tracing-subscriber (env-filter) |
0.1 / 0.3 | Structured logging. |
Rust libraries (crates/vistilla-cli)¶
| Crate | Used for |
|---|---|
clap 4 (derive, env) |
Command-line parsing. |
| reqwest 0.12 | Talking to the server. |
| tokio, serde, serde_json, anyhow | Runtime, JSON, errors. |
Browser features used (no libraries)¶
| Feature | Used for |
|---|---|
getDisplayMedia, getUserMedia, enumerateDevices |
Screen, camera and microphone capture. |
Canvas 2D + captureStream |
Compositing the camera bubble and blur boxes. |
MediaRecorder |
Encoding the recording (WebM VP9/VP8 + Opus, or MP4). |
Web Audio (AudioContext) |
Mixing the microphone and computer sound. |
| Web Workers | Keeping the compositor ticking in background tabs. |
fetch, XMLHttpRequest |
API calls and uploads with progress. |
<video> + WebVTT <track> |
Playback and captions. |
localStorage |
Theme, captions and skip-silence choices, resume position, tour progress. |
| Service Worker + Web App Manifest | Installable app and the offline page. |
External tools and services¶
| Tool / service | Used for |
|---|---|
| ffmpeg / ffprobe | Seek indexing, trimming, silence detection, loudness, audio extraction, MP3 for chat-audio models. |
| Litestream 0.5 | Continuous SQLite replication to the bucket. |
| Docker | Build and runtime images. |
| Render (free web service) | Hosts the container. |
| Backblaze B2 (S3 API) | Stores videos, posters and the database replica. |
| Cloudflare Workers | Public address, reverse proxy, keep-awake ping, and the /_b2/ download proxy in front of Backblaze. |
| Google Apps Script | Free email relay (scripts/mail-relay.gs). |
| Google Gemini, OpenAI, Alibaba Model Studio | Optional transcripts and summaries, with the workspace's own key (or a self-hosted OpenAI-compatible server, for a workspace already set up with one). |
| Anthropic | Optional summaries, only as the operator's server-wide fallback (VISTILLA_SUMMARY_PROVIDER). |
| MinIO | Local S3-compatible store for development (docker-compose.minio.yml). |
| MkDocs + Material for MkDocs | This documentation, built into the Docker image. |