Inventory
Stack
Every tool I use, where it runs and which project it is in. Retired tools stay on the list, struck through: what I stopped using, and why, counts too.
79 tools · 10 layers
Infrastructure
- Raspberry PiThe homelab server, on 24/7
- Docker ComposeEvery service in one file
- PortainerQuick view of containers
- HomepageFront door to the homelab
- CockpitSystem admin from the browser
- KopiaEncrypted, incremental backups
- Backblaze B2The off-site copy
- RenovateUpdates as pull requests
- GiteaPrivate Git for the homelab
- Gitea Actions runnerCI on the desktop when it is on
- SyncthingSyncs notes without a cloud
- VaultwardenSelf-hosted password manager
- Paperless-ngxDocument archive with OCR
- JellyfinMedia server
- CachyOS + HyprlandThe working desktop
Network & access
- Cloudflare TunnelThe only internet exposure, path by path
- TailscalePrivate access to the panels
- Nginx Proxy ManagerReverse proxy with certificates
- Pi-holeHome DNS and ad blocking
- UFWServer firewall
Data
- SQLiteThe default database
- SQLite FTS5 + sqlite-vecHybrid search for the document RAG
- Supabase (PostgreSQL)Inspection data and photos
- ObsidianNotes and tasks
Models
- ClaudePaid models where they earn it
- OllamaFree local models on the GPU
- Qwen3 14BThe local model for personal data
- bge-m3Embeddings for the RAG
- LiteLLMOne gateway: picks the model, caps the spend
- OpenRouterAccess to other providers
- faster-whisperTranscribes voice notes
- edge-ttsVoice for the replies
Agents
- Hermes AgentPersonal assistant over Telegram
- MCPRead-only tools for the agents
- LangGraphThe diagnosis agent’s flow
- paperless-gptTitles and tags documents with a local model
- Claude CodeThe coding partner
Automation
- n8nAutomation flows and webhooks
- HealthchecksAlerts when a job does not run
- systemd timers + cronThe scheduled jobs
- Siri ShortcutsAsking the homelab from the watch
- Telegram Bot APIAlerts and confirmations channel
- Power AutomateAutomations at work
- Power BIOperations reporting
- Instagram Graph APIKeyword auto-replies
Observability
- LangfuseTraces and cost of every model call
- NetdataLive server metrics
- SentryErrors in the inspection app
- Better StackQRFleet logs and uptime
- PostHogConsent-gated analytics
Security
- CrowdSecBlocks misbehaving IPs
- WazuhHome SIEM
- Kali LinuxThe lab’s attacker machine
- MetasploitExploitation in CTFs
- TryHackMeWhere I practise offence
Development
- Next.jsThis site and QRFleet
- ReactInterfaces
- TypeScriptThe site’s language
- Tailwind CSSStyling on custom tokens
- PythonScripts, agents and APIs
- FastAPIQRFleet’s API
- PlaywrightEnd-to-end tests
- ZodData validation
- VercelWhere this site lives
- Git + GitHubPublic and private code
- Neovim (LazyVim)The editor
- tmux + ZellijTerminal sessions
Content
- RemotionVideos made with code
- ResendTransactional email
- ShikiCode highlighting on the blog