>_ stefano@bono:~$
home

Hi, I'm Stefano

Tech Lead // Indie Maker

12+ years turning ideas into production software. Tech Lead by day, indie maker by night. I build products from the first line of code to the infrastructure that keeps them running.

#12+ yrs in production #self-hosted k3s on Hetzner #3 shipped indie products
zsh — 80x18
visitor@steebono:~$ whoami
stefano-bono

visitor@steebono:~$ cat about/profile.json
Tech Lead, 12y exp. Lives in Italy, works in Switzerland
Currently shipping: Dosly, Yelly, h00k.dev

visitor@steebono:~$ kubectl get nodes -o wide
NAME            ROLE      STATUS
k3s-cp-fsn1     control   Ready
k3s-cp-nbg1     control   Ready
k3s-cp-hel1     control   Ready
k3s-agent-app   app       Ready
k3s-agent-db    database  Ready

visitor@steebono:~$ echo $STATUS
"available for interesting problems"
01 — projects

What I'm building.

Real products with real users, not portfolio demos — built, deployed and operated solo.

LIVE 01 / Mobile

Dosly

Medication reminders and a health journal for people on a treatment plan — and for the people looking after them.

.NETExpoReact NativeSignalRPostgreSQLDocker500+ Users
Open Dosly ↗
IN_REVIEW 02 / Mobile

Yelly

Interactive bedtime stories for kids, generated on the fly, with sync, gamification and a realtime backend behind it.

.NETExpoReact NativeSignalRPostgreSQLDockerOpenAI
Open Yelly ↗
SHIPPED 03 / Open source

AirPlay Receiver

An open-source implementation of the AirPlay 2 protocol — audio and screen mirroring from Apple devices, reverse-engineered and documented from scratch.

C# / .NETC++Protocol245 StarsOpen Source
View on GitHub ↗
02 — infrastructure

How it's hosted.

I don't just ship apps — I own the infrastructure underneath them. Running my own cluster means I control uptime, roll out changes on my own schedule, and always know exactly what's running where, instead of trusting a dashboard. Everything below is the real shape of it: a self-hosted k3s cluster on Hetzner, spread across three EU regions, with automated builds and a deploy pipeline that pings me on Telegram with Deploy / Skip before any change reaches production.

cluster-topology.yaml VPN-ONLY MANAGEMENT · SIMULATED
Animated logical topology of a self-hosted k3s cluster Cloudflare feeds a load balancer and Traefik, which routes traffic to an application node. Control-plane nodes coordinate workloads. An application node communicates with a data node that represents stateful workloads. Three control-plane nodes are arranged vertically. A standalone CD server outside k3s reaches the private Kubernetes API over the same VPN using least-privilege RBAC; CI runs on GitHub. Applications communicate with external services. Animated lines represent illustrative traffic, not live measurements. PRIVATE VPN · ADMIN / K8S API ACCESS ONLY K3S CLUSTER · PRIVATE NODES CONTROL PLANE · 3 NODES WORKER NODES STANDALONE SERVER · NOT IN K3S Cloudflare DNS · WAF · proxy Load balancer public HTTPS entry Traefik ingress · workloads CP 1 k3s · control CP 2 k3s · control CP 3 k3s · control Application node application workloads Data node stateful workloads CD runner deploy only · VPN External services identity · metrics · APIs
$ ./deploy.sh
git push main branch Build & push GitHub → GHCR Approval gate Telegram bot Deploy self-hosted runner Rollout kubectl apply
$ watch kubectl get pods2 / 2 ready
deployment / api · replicas: 2 · maxSurge: 1 · maxUnavailable: 0 v1-a v1 Ready serving traffic v1-b v1 Ready serving traffic v2-a v2 Ready serving traffic v2-b v2 Ready serving traffic
zsh — deployment session
visitor@steebono:~$ git push origin main
Waiting for pipeline…
SIMULATION · NOT LIVE INFRASTRUCTURE
03 — profile

About me

Stefano riding a horse on the beach
stefano@bono
photo taken mid-horse-ride, obviously

I like taking a blank repo all the way to something people actually use — picking the stack, wiring the backend, shaping the UI, and then babysitting the servers that keep it all running at 2am.

Most of that happens after hours, because I genuinely enjoy writing code more than is probably healthy. Dosly, Yelly and h00k.dev didn't start as portfolio pieces — they started as itches I wanted to scratch, and I kept going because I liked watching them run in production.

Available for interesting problems
#lives in Italy#works in Switzerland#horseback riding (on vacation)#one piece fan
My code on GitHub ↗
04 — tools

My stack

ai & tooling
OpenAI APIGemini APIn8nClaude CodeGitHub Copilot
frontend
ReactReact NativeExpoTypeScriptAstroTailwind CSS
backend
C# / .NETNode.jsREST APIsWorkersServerless
data
MsSQLMySQLPostgreSQLSQLiteRedisMongoDBSolRElasticSearch
messaging & realtime
RabbitMQAzure Service BusSignalRWebSockets
infra & devops
Microsoft AzureKubernetesDockerTraefikGitHub ActionsAzure DevOps
observability
Application InsightsOpenTelemetryPostHogSentry
integrations & platforms
Microsoft Dynamics 365HubSpotBentoAuth0RevenueCatStripePostFinance
05 — contact

Let's talk.