>_ stefano@bono:~$ github.com/SteeBono ↗
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 NativeSignalRPostgreSQLDockerGemini Voice Live
Open Dosly ↗
LIVE 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 ↗
LIVE 03 / Dev tools

h00k.dev

Inspect webhooks in real time, mock API responses, replay requests and forward them straight to your local environment.

RealtimeDev tool
Open h00k.dev ↗
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.

Diagram of a k3s cluster running on Hetzner across three regions k3s cluster · VPN Only · Hetzner Cloudflare DNS · WAF · proxy Load Balancer LB11 · Nuremberg Traefik ingress · cert-manager cp · fsn1 control plane cp · nbg1 control plane cp · hel1 control plane agent · app role=app agent · db role=database postgres redis
node.json
"name": —
"tag": 
"detail": 

↔ scroll on small screens · click a node to pin its details

Diagram of the CI/CD deploy pipeline with a Telegram approval gate git push main branch Build & push GitHub → GHCR Approval gate Telegram bot Deploy self-hosted runner Rollout kubectl apply
stage.json
"name": —
"tag": 
"detail": 

↔ scroll on small screens · click a stage to pin its details

$ watch kubectl rollout status — illustrative rolling deployment ↓

A simplified, illustrative sequence — not a live view of the cluster — showing how a rolling update keeps the app online while a new version replaces the old one.

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

app
React NativeExpoTypeScript
backend
C# / .NET 8Node.jsRabbitMQSignalR
data
PostgreSQLpgvectorRedis
infra
k3sDockerTerraformTraefikGitHub Actions
05 — contact

Let's talk.