I build production systems and run the infrastructure underneath them.
Tech Lead at PlanetPulse, leading a distributed team of six remotely across Austria and India.
Most of my recent work lives in private organisation repositories, so this profile shows less than it should. Happy to walk through any of it.
🏭 Notch · a platform manufacturing plants use to report and resolve workplace safety hazards before they cause injuries. Three surfaces, all live in production: a NestJS API, a Next.js console for safety officers, and a React Native app for plant workers. Multi-tenant, with deadline escalation for overdue reports and localisation into 7 languages including right-to-left Arabic.
🖥️ Infrastructure · 17 production services across two Linux servers, on Dokploy and Traefik rather than a managed cloud platform. DNS, CDN and email authentication on Cloudflare; offsite backups to Backblaze B2. I also moved the company off paid SaaS subscriptions onto a self-hosted open-source stack covering project management, wiki, password vault, customer support, finance and HR.
📱 Consulting · I own a connected-hardware mobile platform end to end for a retained client: roadmap and architecture, hands-on development, code review and releases, the self-hosted infrastructure it runs on, and a typed React Native SDK over the device's Bluetooth Low Energy protocol.
🟣 merged · 🟢 in review · ★ project stars · refreshed daily
Every pull request
| Status | Project | Pull request | Date |
|---|---|---|---|
| Merged | Mentra-Community/MentraOS | #4079 Fix miniapp-cli dev watcher for Windows path separators | 2026-09-17 |
| Merged | career-ops-hq/career-ops | #4232 Stop reusing the headed page after its browser closes | 2026-09-16 |
| Merged | fosrl/pangolin | #3772 Fall back to newtVersion so the Type badge is never empty | 2026-09-16 |
| Merged | fosrl/pangolin | #3770 Point the manual systemd unit at the installed CLI path | 2026-09-16 |
| Merged | fosrl/pangolin | #3769 Correct month index and zero-pad database backup file names | 2026-09-16 |
| In review | embeddedos-org/eOffice | #45 Keep imported note tags from injecting HTML and script | 2026-09-17 |
| In review | growthbook/growthbook | #7024 Reject cron update schedules that run more than once an hour | 2026-09-17 |
| In review | growthbook/growthbook | #7023 Remove deleted features and experiments from watch lists | 2026-09-17 |
| In review | actualbudget/actual | #8954 [WIP] [AI] Refuse password bootstrap when OpenID is enforced | 2026-09-16 |
| In review | Dokploy/website | #184 Explain intermittent Bad Gateway for Next.js standalone in Compose | 2026-09-16 |
| In review | Dokploy/website | #183 Target the dokploy container in the auth secret migration script | 2026-09-16 |
| In review | makeplane/plane | #9844 Drop empty CORS origins so the deny-all fallback is reachable | 2026-09-16 |
| In review | papra-hq/papra | #1522 Declare api key permissions on restore and trash routes | 2026-09-16 |
| In review | papra-hq/papra | #1521 Say what the memory persistence driver costs on restart | 2026-09-16 |
| In review | SigNoz/signoz | #12878 Accumulate log pages with a functional state update | 2026-09-16 |
| In review | SigNoz/signoz | #12877 Remove unused Manager.Pause method | 2026-09-16 |
| In review | makeplane/plane | #9842 Honour MINIO_ENDPOINT_SSL when building export presigned URLs | 2026-09-16 |
|
Patterns for running a small company's products and internal tools on your own servers. DNS and email authentication, monorepo Dockerfiles, Compose topologies, backup tooling, and the production pitfalls that are not in the vendor docs. |
Real-time chat as three independent Node.js services behind a Next.js client. Passwordless OTP login queued over RabbitMQ so login never blocks on SMTP, plus Socket.io presence and typing indicators, Redis and MongoDB. |
Languages
Backend
Frontend and Mobile
Data
Infrastructure



