Owning what
happens after deploy.
A portfolio is a small system. Running it myself makes its boundaries, dependencies, and failure modes part of the work.
A deliberately small system.
The frontend is served on Cloudflare Pages. FastAPI runs on my personal laptop-VPS, reached through a Cloudflare tunnel. PostgreSQL provides persistent storage, and the included Docker configuration defines a pgvector-enabled database with a persistent volume.
The static frontend and the backend have separate lifecycles. The architecture stays readable here even when the live services are unavailable.
Observe something meaningful.
The backend tracks request timings, request rate, process uptime, and active AI calls. Health checks also inspect database connectivity, pending contact messages, and the AI-document count.
A process uptime value describes the current process lifetime. It is not a historical availability percentage. Likewise, an unavailable measurement should stay unavailable, rather than being replaced with an impressive-looking number.
Keep failures contained.
The portfolio’s core content is prerendered and remains readable without a running backend. Optional services load separately. If the AI provider is unavailable, visitors can still read the projects. If contact submission fails, the form keeps its contents and offers direct email.
Contact messages are accepted only after the API confirms they were queued. Database persistence and delivery to an inbox are different steps, and the interface treats them that way.
The responsibility is the interesting part.
Managing a personal VPS brings application code and operational constraints together: keeping the host reachable, watching dependencies, preserving data, and understanding what happens when a service stops.
Separating the static site, persistent data, and external AI service makes those responsibilities easier to reason about. The infrastructure deserves the same engineering attention as the application.
Explore the portfolio APILet’s build
something that works.
Have an AI problem, a backend challenge, or a team I should meet? I’d like to hear about it.
Based in Kathmandu. Open to a good conversation.