Development notes

Built in shifts with four AI agents

A personal portfolio and platform site built from scratch on AWS, with AI coding agents as the primary development tool throughout. Claude Code (Γ—2), ChatGPT Codex, and Google Gemini take shifts on the same production server β€” alternating to keep momentum when one hits a usage cap.

What this site is

A personal portfolio and professional showcase site, built from scratch on AWS infrastructure with AI coding agents as the primary development tool throughout. It started as a travel map and has grown into a multi-page platform spanning GPS tracking, job hunting, AI tooling, hardware, gaming, smart home, and more.

The backend is a single Flask app (22,000+ lines) behind Caddy, backed by SQLite. Auth uses HttpOnly session cookies (bcrypt, 30-day expiry) with three user roles. All AI calls route through OpenRouter; the server also hosts an Anthropic Claude CLI, a ChatGPT Codex CLI, and a Moveworks natural-language agent. Across all agents, β€” tokens processed and β€” commits made building this site. See the

What was built

AI & Intelligence
Intelligent features
  • Multi-model chatbot β€” floating assistant on every page; streaming SSE, 7+ OpenRouter models, RAG knowledge base (PDF/DOCX/TXT ingestion)
  • Document Intelligence (IDP) β€” extracts structured data from PDFs and images via vision models; confidence scores, templates, JSON/CSV export
  • Moveworks agent β€” plain-English queries across 6 integrations: server health, access logs, job hunt data, GitHub, notifications, Google Calendar
  • Granola meeting backup β€” daily MCP sync of meeting transcripts and speaker-parsed summaries to SQLite
  • Daily AI content β€” fresh Claude-generated piece each morning (fact series, thought experiments, etymology), cached until Sydney midnight
Job Hunt
ATS & career tools
  • Full pipeline tracker β€” kanban board + sortable table; real company logos, drag-and-drop status, Sydney timestamps, per-listing refresh
  • AI daily shortlist β€” 5 Codex-generated role suggestions each morning; URL-validated and archive-probed before save, expired listings detected
  • Salary intelligence β€” stated salary (from listing text) separated from AI-estimated market rates via Glassdoor/Codex; two distinct columns
  • Interview hub β€” cover letters, STAR stories, application questions, plus tax comparison and cost-of-living analysis (AU vs SG)
  • Company tracker β€” Codex-suggested and manual target companies with careers URLs, investigation notes, and last-checked dates
Travel & GPS
Location & maps
  • Interactive world map β€” D3 Natural Earth, 4-tier visit frequency, city dot markers, hover tooltips; Claude-generated country fun facts (cached)
  • Live GPS tracking β€” OwnTracks MQTT β†’ Mosquitto β†’ Leaflet; heatmap layer, animated Narrative playback, date-range filter, per-person colour coding
  • Travel wishlist β€” gold star markers with Nominatim geocoding; full CRUD API backed by S3
  • Tokaido planning β€” Tokyoβ†’Kyoto walk documentation with planned vs actual vs buffered itinerary and per-stage GPS coordinates
Infrastructure & Security
AWS & hardening
  • Multi-user auth β€” bcrypt session cookies (HttpOnly, 30-day), 3 roles, Google OAuth, per-user page permissions, Caddy forward-auth, impersonation
  • Personal VPN β€” ephemeral EC2/Tailscale exit nodes in 7 regions; pre-baked AMIs; D3 world map interface
  • Live Android emulator β€” on-demand EC2/KVM, MJPEG video + Opus audio, adb touch/swipe input, EBS state preserved
  • Security hardening β€” weekly nuclei scans, full HTTP security header suite, CSP with browser report logging, AI visual page health monitor
Developer Tooling
Build & ops tools
  • Agents console β€” side-by-side Claude + Codex relay; streaming output, file uploads, paste-image support, usage summary cards
  • Actions API + Swagger UI β€” per-user tokens, 8 auth methods, interactive curl examples; machine-readable access to site data
  • Site-wide search β€” SQLite FTS5, Cmd+K overlay, highlighted excerpts, auto-reindex on every git commit
  • Status & monitoring β€” 90-day uptime, GA4 analytics, AI services token tracking, automated pen-test reports, Page Health Monitor
Hardware
ESP32 firmware projects
  • XiaoZhi AI voice assistant β€” custom Bitcraft ESP32-S3 firmware with OTA updates, streaming audio, sync video playback (audio-clocked), live telemetry dashboard
  • Watchy smartwatch β€” Chronos firmware OTA server for SQFMI Watchy v3 ESP32-S3; WiFi credentials generator; parked pending first compile
Content & Utilities
Personal tools & data
  • Private podcast β€” multi-channel secret-URL RSS, drag-drop admin, XHR upload progress
  • Steam gaming β€” live Steam Web API data, server-side proxied and cached
  • Cryptocurrency miner β€” XMRig/Kryptex worker with live hashrate charts, admin Start/Stop, throttle controls
  • Smart Home Radar β€” Tuya Zigbee device catalog with per-user wishlist and dismiss states
  • Google integrations β€” Calendar (read/write via OAuth) and Photos (day-based browsing via OAuth)
  • Gym timetable β€” live class schedule scraper with booking links and timetable filters
Multi-agent Workflow
How the site is built
  • Four agents in shifts β€” Claude Code (Γ—2 accounts), Codex CLI, Gemini CLI each take shifts when others hit usage limits; all share the same server, repo, and deploy flow
  • Attribution tracking β€” every commit carries a Co-Authored-By trailer; the AI Agents tab shows a live Claude/Codex/Gemini breakdown by page area
  • Handover system β€” each agent writes structured handover notes and memory files; any agent can pick up where the last left off
  • CI/CD β€” GitHub Actions auto-deploys on push; post-commit search re-index; Flask restarts via systemd on every deploy

The stack

Technologies were chosen for being lightweight, proven, and appropriate to the scale β€” no unnecessary frameworks, no over-engineering.

Mapping
D3.js v7 + TopoJSON
Interactive SVG world map with zoom, pan, hover tooltips, and dynamic country colouring
Backend API
Python + Flask
Single-file REST API handling auth, data, and AI integrations; runs as a systemd service on port 5001
Authentication
bcrypt + HttpOnly cookies
Passwords hashed with bcrypt (12 rounds); sessions use HttpOnly cookies (ds_session, 30-day expiry). Three roles: admin, readonly_admin, standard.
Web Server
Caddy v2
Serves static files, reverse-proxies Flask, enforces forward-auth on protected routes, manages CSP headers
SSL
Let's Encrypt via Caddy
Zero-config TLS β€” Caddy obtains and renews certificates automatically with no manual intervention
Frontend
Vanilla HTML/CSS/JS
No frontend framework β€” intentionally minimal, fast, and maintainable. Strict CSP with no inline scripts.

Hosted on AWS

The site runs on a single AWS Lightsail instance, consolidated alongside a Foundry VTT game server. The migration from EC2 was planned and executed entirely by Claude.

Platform AWS Lightsail β€” Ubuntu 22.04 LTS
Web server Caddy v2 β€” static files + reverse proxy to Flask on port 5001
TLS / HTTPS Let's Encrypt via Caddy β€” zero-config, auto-renewing certificates
API process systemd service β€” Flask starts on boot, restarts on failure
Data storage SQLite β€” users, sessions, permissions, job hunt, starboard, OwnTracks in users.db; monitor in monitor.db; search index in search.db
Security fail2ban β€” SSH brute-force protection; key-auth only, no password login
CI/CD GitHub Actions β€” every push to main SSHes in, runs git pull, and restarts the Flask service via a dedicated ED25519 deploy key
Domain www.danscodellaro.com β€” DNS pointed to Lightsail static IP