Infrastructure / Personal VPSOngoing

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.

LinuxCloudflareFastAPIPostgreSQLDocker

Built by me.
Run by me.

The work doesn’t end at git push.
A look inside the infrastructure I operate.

Architecture view · live metrics unavailable
From a question to an answerPortfolio assistant · illustrative flow
02 / 04

The place where the pieces meet.

FastAPI serves the portfolio, handles contact submissions, and prepares context for the AI assistant. Request middleware records timings, while health endpoints expose service and database checks.

Personal server. Real responsibilities.

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 API

Let’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.