Wharfbase
Self-hosted database workspace: one container scans a Docker host, finds every database inside it and opens each one in a grid — without publishing a single port.
I build the system, then run it.
From the React component down to the machine it boots on. I write control planes that provision real hardware, native Swift apps I use every day, and the Traefik-fronted Docker host that keeps it all reachable.
Full-stack engineer · self-hoster · macOS native
Three threads running in parallel — one product, one native app, one piece of plumbing.
Self-hosted database workspace: one container scans a Docker host, finds every database inside it and opens each one in a grid — without publishing a single port.
On the Mac App Store with Termini Pro, plus a notarized DMG. Now the Windows build: a Tauri shell over a Rust core on russh, syncing hosts with the Mac through a shared folder.
Encrypted off-site snapshots of every service with restic, healthchecks on each web container, and a cron actuator that restarts the ones alive but not answering.
Filter by what you care about. Anything with a link is live right now — the rest are private repos or unreleased binaries.
A subscription hosting service where a paid Stripe invoice provisions a real workload — and the fleet supervisor buys a new dedicated machine when capacity runs out.
NestJS + Prisma/Postgres + BullMQ, driving the Pterodactyl application API. A supervisor computes commitment pressure, live pressure and pending demand every 60 seconds, alerts across three channels, waits for exactly one human confirmation, then orders from Scaleway, bootstraps with cloud-init, waits for Wings to check in with a baked-in token, and creates the port allocations.
A local-first Mac app that reads a folder of files — text, PDFs, scans, photos, audio — describes them, works out what relates to what, and writes pages about it.
Teams forget to tear down staging environments and preview deployments. Reaper finds them, tells the owner first, and deletes them only once you explicitly arm it.
The hosting business itself — marketing site in five languages, checkout, a status page with its own incident history, and the identity and panel services behind it, all on infrastructure I own and operate.
Pterodactyl orchestrated over MariaDB, Redis and Traefik with Let's Encrypt wildcard TLS and SMTP routing — running paying customers' servers.
A self-hosted identity service issuing issuer- and audience-pinned JWTs, with TOTP enrolment and the release desk that announces Termini when the App Store goes live. Version 2.7 and quietly load-bearing.
The mail server for my own domains: Postfix, Dovecot, Rspamd and OpenDKIM under supervisord, with a Next.js webmail and admin on top — Sieve, quotas, plus-addressing, 2FA and 299 tests.
A curated royalty-free image library — search, collections and downloads, built on Next.js with Motion-driven transitions and shipped in a container.
A data-first comparison catalog scoring GPUs, CPUs, phones, cameras and motors 0–100 on value, derived transparently from specs, age and current price.
A Turborepo scaffold taking a quote through approval, invoice and payment: NestJS API, Prisma/Postgres, Stripe, PDF generation and transactional mail.
A macOS network monitor in Swift — live throughput charts, connection inspection and a full preferences layer. It taught me the rhythm of native UI work.
A Rust CLI for encrypting and decrypting files and whole directories with AES-256 — small, fast and dependency-light. My most-starred open-source project.
A Red-DiscordBot cog that keeps a single live status embed in a channel, with an uptime-style history bar and latency under every service it watches.
A terminal tool that makes ufw approachable: an interactive menu, ready-made service templates for SMTP and SFTP, and one-click sane defaults.
The Docker host under everything here: Traefik routing with wildcard ACME certs, Cloudflare DNS, ufw, healthchecks with an actuator that restarts what hangs, and encrypted off-site snapshots — all defined in compose and cron.
Next.js 16, React 19, Tailwind v4, Motion, Lenis smooth scroll and an OGL shader backdrop — containerised and served from the same host as the rest.
Weighted by how much production code I've actually written with it, not by how it looks on a CV.
Languages.Where I'm fluent enough to be opinionated.
Frontend.Interfaces that stay calm under real data.
Backend & data.Queues, jobs, and state that survives a restart.
Native apps.Apps I build because I want to use them — Mac first.
Infrastructure.The part I run at 2am when something breaks.
Practice.How the work actually gets shipped.
Most of my work lives inside Fleeq — a hosting business I design, build and operate on my own metal. That means the marketing site and the checkout, but also the control plane that decides when the fleet is running out of capacity, buys a dedicated machine, bootstraps it with cloud-init, brings it into the panel and starts placing customers on it.
The interesting bugs are never in the UI. They're the disk read from the wrong API field, the cloud-init script that dies on line 1 because runcmd runs under dash, the mail filter that turned away all of Gmail because a resolver's refusal read as a blocklist hit. I've learned to test the paths a dry run never takes — the round trip costs about two cents.
When the web stack ends I switch to Swift. Termini is the SSH terminal I actually use — on the Mac App Store since September, and now ported to Windows over a Rust core; llmwiki turns a folder of files into a wiki you can question, entirely on-device. I write the tools I want to hold.
Years writing code
First commit in 2019
Projects in flight
Shipped, live or in build
Services self-hosted
One Docker host, Traefik in front
Languages I ship in
TS, Swift, Rust, Go, Python, SQL
If I can't deploy it, I don't understand it yet. Every project here ends at a running container, not a merged PR.
Fakes hide the five bugs that matter. I test acquisition paths against the actual provider, then tear it down.
Dense where it earns it, calm everywhere else. Motion should explain a change, never announce itself.
Not a CV — the projects that actually changed how I build.
A self-hosted database workspace: one container scans Docker or Kubernetes, works out what each database is and who uses it, joins the right networks through a Go allowlist proxy in front of the Docker socket, and opens it in a grid. Eleven phases, an OWASP ASVS L2 review with 17 fixes, chaos tests, and a license server issuing Ed25519-signed keys.
Termini Pro went on sale through StoreKit, the direct download became a notarized Developer ID DMG, and both channels read 2.4.6. Then the port: a Tauri shell over a Rust core on russh, where Swift's Codable and serde disagreeing about one capital D would have silently dropped every host's ProxyJump.
RocketMail went through six hardening phases — cross-mailbox access, path traversal and stored XSS closed; Rspamd, Sieve, quotas and 2FA added; 299 tests — and its deploy surfaced four failures, three of them silent. SSO lost a token confusion between two kinds of JWT. Every web service gained a healthcheck and an off-site backup tier.
A NestJS control plane that turns a Stripe invoice into a provisioned game server — and, when the fleet runs dry, orders a dedicated machine from Scaleway, installs Docker and Wings via cloud-init, waits for it to check in, and creates 121 port allocations. Release tears it all back down and stops the billing.
An anonymous publishing platform where every submission passes a deterministic prefilter and a Gemini classifier before it can appear. Review is scheduled off-request, and a sweeper re-drives anything the model couldn't reach. Nothing is ever published unread.
Two macOS apps in Swift: a terminal with a full SSH stack and a theming layer, and a local-first app that OCRs, transcribes and links a folder of files into a wiki you can ask questions of. Both taught me how different shipping a binary is from shipping a deploy.
Fleeq SSO (jose-signed JWTs, TOTP enrolment) and RocketMail, a self-hosted SMTP management platform with mailbox parsing over better-sqlite3. The unglamorous services everything else quietly depends on.
Pterodactyl orchestrated over MariaDB, Redis and Traefik with Let's Encrypt wildcard certs, running paying customers' game servers on a single self-hosted host. The moment reliability stopped being a hobby.
A macOS network monitor in Swift — real-time throughput charts, connection inspection, a preferences layer. My first app someone other than me installed.
Freelance work, a stubborn infrastructure problem, or just a good argument about self-hosting — I read everything.
Based in Italy · usually replying within a day