Shared infrastructure, per-project component diagrams, and deployment model for all 10 projects on 2 vCPU / 4 GB RAM.
All 10 projects share a common base β this is the foundation each project runs on top of:
| Layer | Component | Details |
|---|---|---|
| OS | Debian 13 (3.12.x kernel) | OpenClaw lean config applied |
| Runtime | Python 3.11+ | Per-project virtualenv, shared system packages |
| Database | SQLite | One .db file per project in /var/data/ |
| LLM Runtime | Ollama (shared service, port 11434) | One Ollama instance for all projects. llama3.2 2B loaded on demand. |
| Bot/Alerting | Telegram Bot API | One bot token shared across projects. Messages via common sender. |
| Scheduler | systemd timers + cron | Lightweight. No APScheduler daemon (saves RAM). |
| Web server | Flask (per-project) | One Flask app per project, separate ports. Behind reverse proxy. |
| Reverse proxy | nginx | Routes babu.thotas.com/[project]/ to correct port. Single entry point. |
localhost:11434.
Models loaded on first request, kept warm for ~10 min, then unloaded to free RAM.
If WhisperBox needs to run whisper.cpp stand-alone, it pauses Ollama to free ~1.5GB.
server {
listen 80;
server_name babu.thotas.com;
# WatchDog
location /watchdog/ {
proxy_pass http://127.0.0.1:5001/;
proxy_set_header Host $host;
}
# PaperTrail
location /papertrail/ {
proxy_pass http://127.0.0.1:5002/;
proxy_set_header Host $host;
}
# LinkVault
location /linkvault/ {
proxy_pass http://127.0.0.1:5003/;
proxy_set_header Host $host;
}
# PulseRSS
location /pulserss/ {
proxy_pass http://127.0.0.1:5004/;
proxy_set_header Host $host;
}
# HabitForge
location /habitforge/ {
proxy_pass http://127.0.0.1:5005/;
proxy_set_header Host $host;
}
# TinySync
location /tinysync/ {
proxy_pass http://127.0.0.1:5006/;
proxy_set_header Host $host;
}
# PastePit
location /pastepit/ {
proxy_pass http://127.0.0.1:5007/;
proxy_set_header Host $host;
}
# Nomad Board
location /nomad/ {
proxy_pass http://127.0.0.1:5008/;
proxy_set_header Host $host;
}
# WhisperBox
location /whisperbox/ {
proxy_pass http://127.0.0.1:5009/;
proxy_set_header Host $host;
}
# AutoGrok
location /autogrok/ {
proxy_pass http://127.0.0.1:5010/;
proxy_set_header Host $host;
}
}
Each project gets its own sub-path. SSL via Let's Encrypt (certbot). No port forwarding needed beyond 80/443.
ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
β Flask Web App ββββββΆβ SQLite DB β β Telegram Bot β
β Port 5001 β β watchdog.db β β (alert sender) β
ββββββββββ¬ββββββββββ ββββββββββββββββββββ ββββββββββ²ββββββββββ
β β
β check every 5min via systemd timer β push
βΌ β
ββββββββββββββββββββ β
β health_checks βββββββββββββββββββββββββββββββββββββββ
β (Python script) β
β - HTTP ping β
β - SSL check β
β - Latency β
ββββββββββββββββββββ
Storage: /var/data/watchdog.db β sites, check history, alert log
ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
β Flask Web App ββββββΆβ SQLite DB ββββββΆβ Ollama β
β Port 5002 β β papertrail.db β β localhost:11434 β
β /notes, /ask β β notes + vectors β β nomic-embed β
ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
β
ββββββ΄βββββββββββββββββββββββββββββ
β Markdown files in /var/notes/ β
β (one .md per note) β
ββββββββββββββββββββββββββββββββββ
Storage: notes as .md files in /var/notes/, embeddings in SQLite. Ollama for semantic search + QA.
ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
β Flask Web App ββββββΆβ SQLite DB β β Ollama β
β Port 5003 β β linkvault.db β β localhost:11434 β
β /add, /list β β links + metadataβ β llama3.2 (sum) β
ββββββββββ¬ββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
β
ββββββΌβββββββββββββββββββββββββββββ
β Puppeteer/requests β
β - Fetch page title/desc β
β - Store OG image URL β
β - Optional: LLM summary β
βββββββββββββββββββββββββββββββββββ
Storage: /var/data/linkvault.db. Thumbnails/favicon cached locally.
ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
β Flask Web App ββββββΆβ SQLite DB β β Ollama β
β Port 5004 β β arterss.db β β localhost:11434 β
β /feeds, /digestβ β feeds + articlesβ β llama3.2 (sum) β
ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
β β
ββββββ΄βββββββββββββββββββββββββββββββββββββββββββββ΄ββββββ
β Cron job (daily at 7am PT) β
β - fetchparser: parse all feeds β
β - New articles β store in DB β
β - Build digest prompt β Ollama β summarized email β
β - SMTP: send to Thota's inbox β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Storage: /var/data/pulserss.db. Feed URLs stored, articles deduplicated by URL.
ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
β Flask Web App ββββββΆβ SQLite DB β β Whisper.cpp β
β Port 5009 β β whisperbox.db β β (shell call) β
β /upload β β transcripts β β ~700MB RAM β
ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
β
ββββββΌβββββββββββββββββββββββββββββββββββββββββ
β Audio files stored in /var/audio/ β
β (mp3, wav, m4a supported) β
β - Normalize audio β
β - Run whisper.cpp base.en β
β - Store transcript text in DB β
ββββββββββββββββββββββββββββββββββββββββββββββ
Storage: Audio files in /var/audio/ (10GB volume recommended), transcripts in SQLite.
Note: WhisperBox runs as standalone β Ollama is stopped during transcription to free ~1.5GB RAM.
ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
β Flask Web App ββββββΆβ SQLite DB β β Ollama β
β Port 5005 β β habitforge.db β β localhost:11434 β
β /habits, /checkβ β habits + checksβ β llama3.2 (mot.) β
ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
β β
ββββββ΄βββββββββββββββββββββββββββββββββββββββββββββ΄ββββββ
β Cron job (weekly, Sunday 9am PT) β
β - Build streak report β
β - Ollama: generate motivational text β
β - SMTP: send weekly check-in email β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Storage: /var/data/habitforge.db. Streak data and check-in history.
/var/
βββ data/ # All project databases
β βββ watchdog.db
β βββ papertrail.db
β βββ linkvault.db
β βββ pulserss.db
β βββ habitforge.db
β βββ nomadboard.db
β βββ whisperbox.db
βββ notes/ # PaperTrail markdown files
βββ audio/ # WhisperBox uploads (large, separate volume)
βββ uploads/ # PastePit pastes, TinySync files
βββ backups/ # Nightly .tar.gz of /var/data + /var/notes
/etc/
βββ nginx/
β βββ sites-available/vps-projects # nginx config
βββ systemd/system/
βββ watchdog-check.timer
βββ watchdog-check.service
βββ pulserss-digest.timer
βββ pulserss-digest.service
/opt/
βββ ollama/ # Ollama binary + models
βββ models/ # llama3.2 2B + nomic-embed-text
| Order | Project | Why First | Est. Setup Time |
|---|---|---|---|
| 1 | WatchDog | Dead simple, validates VPS setup, Telegram bot reuse | ~1 hour |
| 2 | PastePit | Simplest web app, warm up nginx + Flask stack | ~30 min |
| 3 | HabitForge | Easy Flask + SQLite, good for daily-use testing | ~1 hour |
| 4 | PaperTrail | First AI project β validates Ollama setup | ~2 hours |
| 5 | LinkVault | Good second AI project, tests Puppeteer + LLM | ~2 hours |
| 6 | PulseRSS | RSS parsing + AI digest + email β complex but fits RAM | ~2 hours |
| 7 | Nomad Board | Leaflet.js map β different tech, light RAM | ~1 hour |
| 8 | TinySync | WebDAV + file handling β more storage planning | ~2 hours |
| 9 | WhisperBox | Whisper.cpp standalone β validates audio pipeline | ~2 hours |
| 10 | AutoGrok | Most ambitious β only if all else is stable | ~4+ hours |
| Component | RAM | Notes |
|---|---|---|
| Debian OS + kernel | ~500 MB | Baseline after boot |
| nginx | ~30 MB | Reverse proxy |
| Ollama (idle, no model loaded) | ~100 MB | Model loading adds ~1.5GB |
| WatchDog Flask | ~200 MB | Always-on |
| HabitForge Flask | ~350 MB | Always-on |
| PaperTrail Flask | ~700 MB | Always-on |
| LinkVault Flask | ~600 MB | Always-on |
| PulseRSS Flask | ~400 MB | Cron-triggered only |
| TinySync Flask | ~250 MB | Always-on |
| PastePit Flask | ~150 MB | Always-on |
| Nomad Board Flask | ~300 MB | Always-on |
| WhisperBox Flask | ~700 MB | Standalone when active |
| Total always-on | ~3.6 GB | Getting tight β consider which 3-4 are truly always-on |
| With Ollama + llama3.2 loaded | ~5.1 GB | Exceeds 4GB β need to be strategic |
β οΈ Strategic insight: 10 always-on Flask apps + Ollama exceeds 4GB. Choice: run only 3-4 projects always-on, the rest as cron-triggered or on-demand. Recommended always-on: WatchDog, PaperTrail, HabitForge, LinkVault. Others trigger via systemd timers.