In production.

Four projects I built, deployed, and still run myself. Everything else lives on GitHub.

gongfucha.app

A tea brewing companion. Pick a tea to get a timer and brewing guide, or describe one you don't recognise and it's identified from a library of 84. I built the RAG retrieval directly on Qdrant and local embeddings instead of using LangChain, because I wanted full control over chunking and scoring without a framework in the way. It's a PWA, so it works offline at the tea table.

RAG Qdrant Next.js PWA

selkokielelle.fi

A translator that rewrites everyday Finnish into Easy Finnish (selkokieli), the simplified register used by roughly 750,000 people in Finland with language processing difficulties. It runs as a web app and as a Chrome extension. I built the backend with FastAPI to keep it a thin, predictable wrapper around the LLM call, and I host it on my own VPS so I'm responsible for latency, cost, and uptime.

FastAPI LLM Chrome Extension Self-hosted

n8n automation stack

The server that runs my automations and background jobs. It's the plumbing behind the other projects. Self-hosted n8n on a Hetzner VPS, orchestrated by Coolify with Traefik routing and Cloudflare in front. I went self-hosted instead of a managed platform so I could own the secrets, the workflow history, and the cost ceiling. Ops is part of the job, not something I outsource.

n8n Self-hosted VPS Docker

tajuste.com

A black-and-white photography portfolio that lays itself out. You drop in photos and the page composes them for you. Under the hood is a TypeScript layout engine that reads each image's aspect ratio and places it into one of a few composition blocks (hero, pair, asymmetric, chapter break). I chose a typed engine over a CMS grid so the editorial rhythm is deterministic.

TypeScript Layout engine