Software developer · Systems & self-hosting
Joshua 祐华 Hirsig
Software developer in Switzerland. I work across the stack — services in TypeScript and Go, some Rust — and run the Linux servers the results live on. Nearly everything linked from this page is self-hosted on a single box.
14
services self-hosted
docker · traefik
23
projects shipped
dev · work · client
2017
shipping since
ch
live status
online
Own projects
Things I build for myself. Source is public where there is any.
Koch- & Backbuch
2026Live
One codebase for two jobs: recipe management for a bakery with baker's percentages, batches and costing — and a private cookbook with quantity sliders, a cooking mode and voice control. Installable as an offline PWA.
roadbook
2026In development
Offline-capable PWA for a road trip: stage planning, travel diary, budget and checklists. The Go backend embeds the built React frontend in a single binary; the client syncs through IndexedDB.
stepshot
2026Alpha
Step recorder for KDE on Wayland: it screenshots the window you clicked, marks the click, names the UI element through AT-SPI and exports a self-contained HTML, PDF or DOCX report. Sits in the tray.
fix-omnissa-horizon-wayland
2026Patches that make the Omnissa Horizon client usable on Wayland: dark theme, HiDPI scaling, an XKB crash and a protocol warning. Packaged for Fedora, Gentoo and Arch.
Repository 7 GitHub stars 1 forks
ts3-query-proxy
2026Translation layer from the old TeamSpeak 3 raw query protocol to the TeamSpeak 6 SSH query, so tools written for the old interface keep working without changes.
Repository 4 GitHub stars 3 forks
gentoo-forge
2026My Gentoo setup as a public reference: OpenRC, KDE Plasma on Wayland, AMD graphics, system-wide LTO and native Steam — the Portage configuration plus the notes explaining why it looks that way.
Repository 2 GitHub stars
dotfiles
2026Ongoing
One chezmoi repository for Fedora and Gentoo. Distro detection picks the right variant of the zsh, git, kitty, starship and btop configuration per machine.
openmapper
2026In development
A mapping tool in Go. Too early to say more.
TSPerms
2026Live
Web interface for the server groups and bans of a TeamSpeak 6 server — including members who are currently offline and therefore cannot be clicked in the TS client.
Open-source contributions
Patches to other people’s projects. Every link goes to the pull request in the upstream repository.
merged
Upstream project: Maxallica/ts6-viewer
Three bug fixes: a bufio panic on large ServerQuery responses (buffer 4 KB to 64 KB) and a goroutine leak in the keepalive; a 15-second read timeout against hanging SSH connections plus a configurable max_width; reconnect on EOF for channellist, clientlist and serverinfo.
merged
Upstream project: mathieuviart/legrandgeoquiz
Complete German localisation — 146 keys, 228 country names, 399 hint texts — plus a self-hostable daily API as a fallback for the Cloudflare Worker. A second pull request split the 5510-line index.html into 14 modules, functionally unchanged.
merged
Upstream project: Majorfi/immich-places
HERE Maps as a fallback geocoder for the cases where Nominatim returns nothing. Backend and frontend, configurable through environment variables, no breaking change.
Pull requests #35
in review
Upstream project: coom/ts6-manager
Contributions to coom/ts6-manager, an actively maintained fork of clusterzx/ts6-manager. Five open pull requests: single-flight token refresh against a refresh stampede on parallel 401s; numeric comparison of WebQuery booleans, because "0" is truthy and marked every client as away; re-reading the stored identity so role changes arrive; five security hardenings (yt-dlp argument injection, SSRF through redirects, MFA recovery code entropy); reverse-proxy SSO over trusted headers with just-in-time provisioning.
in review
Upstream project: cinnyapp/cinny-desktop
System tray ported to Tauri v2. On Linux it uses its own ksni StatusNotifierItem implementation, because Tauri's tray-icon does not forward left clicks there.
Pull requests #586
in review
Upstream project: mathieuviart/PokemonTCGSetOrMilitaryOperation
Modularised the single index.html, fixed theme colours that only worked in dark mode, made the layout responsive on mobile, added self-hosting through Docker Compose and a favicon.
Pull requests #1
Work
Anonymised case studies from employment: no employer, no customer, no internal names. My share is given as commit counts — these repositories are pushed to directly rather than through pull requests, so that is the honest measure.
Inventory and maintenance application
2026Main author · 113 of 137 commits
Read-only overview of an inventory of technical devices, together with the workflow for maintenance records and handover reports, including PDF export. Seven months of work, September 2025 to April 2026 — my largest single contribution.
Approval services for LLM agents
2026Main author · 41 of 43 commits
A family of services that gives an LLM agent controlled access to internal business systems, with a human approval step in front of every write operation. Three of them written by me: one in front of an internal inventory API (8 of 10 commits), one in front of an internal wiki (12 of 12), one in front of a time and leave system (21 of 21).
Gateway for agent-facing services
2026Sole implementation · 12 of 12 commits Ongoing
A gateway that bundles the individual approval services behind a single endpoint, so an agent talks to one entry point instead of many. Written by me alone and still growing.
Receipt digitisation with OCR
2026Main author · 18 of 23 commits
Digitises receipts by running OCR over them. Deliberately built without any server component: everything happens in the browser, so sensitive documents never leave the device. January 2026.
Internal ordering tool
2025Main author · 37 of 41 commits
In-house tool for placing and tracking orders. August to November 2025.
Internal search tool
2025Main author · 40 of 64 commits
In-house tool for searching and retrieving internal content. July to November 2025.
Template editor for test protocols
2026Team contribution · 3 of 5 commits
Editor for the templates behind test protocols on technical equipment. A small piece of work in a team. March 2026.
Internal contact management system
2026Team contribution, small share
In-house system for company and person records. I worked on individual parts of it alongside several other developers: 4 of 25 commits in the frontend, 1 of 49 in the backend.
Client work
Websites and design work built for other people.
denidrive.ch
2023Website for a driving school, built on WordPress. I still handle updates and new pages for it.
Akkordeon Brittnau
2022WordPress set up for a music club so its members can publish news and event posts themselves, without me in the loop.
Mein Baumhaus
2018Company website. The domain is gone; the link points to the Internet Archive.
KIAN
2017Menu design for a restaurant. Ordering from a tablet at the table was planned alongside it.
VicoTV
2017First version of the backend. VicoTV was an apprentice startup run by Swisscom and SRG.
Infrastructure
What runs on the box, and what it is for.
AdGuard Home
Filtering DNS resolver for every device in the household, reachable over DNS-over-HTTPS from outside.
Authentik
Single sign-on for the services behind it. Login by passkey, with the password left as a fallback.
CrowdSec
Reads the logs of the public services and blocks addresses whose behaviour looks like an attack.
Forgejo
The Git forge I actually push to. GitHub and Codeberg are mirrors that get pushed from here.
Immich
Photo and video library for the household. Search and face recognition run on the server, not in someone else's cloud.
Matrix
Homeserver for private chat and calls. Login goes through Authentik by way of MAS.
Traefik
Reverse proxy in front of every container: routing by host name and automatic Let's Encrypt certificates.
Uptime Kuma
Watches every other service, sends the alert when one drops, and feeds the live status on this page.
Vaultwarden
Password vault, compatible with the Bitwarden clients, running on hardware I control.
Zipline
Short links for screenshots and file uploads, under my own domain instead of a hoster's.
Game servers
Browser games for friends, no account needed.
Codenames
Word association game for two teams. Open the link, pick a side, play.
Massive Decks
Cards-against-humanity style card game, made for larger groups.
Scribble
Draw and guess with friends; a round starts as soon as two people are in the room.
TriviaForge
Quiz nights with question sets you write yourself instead of buying.
CV
Stations, shortest form.
- 06/2024 – today Biomedical Engineer Immeditech AG Medical technology where devices meet IT infrastructure. Alongside that, internal tooling: approval services for LLM agents, an inventory and maintenance application, receipt digitisation.
- 02/2023 – 05/2024 IT Specialist, Medical Technology IT University Hospital Basel Responsible for the IT side of medical devices, including server and network environments. Connected clinical systems to the ICT infrastructure, ran and monitored specialist applications, contributed to interface design.
- 11/2020 – 02/2023 Junior IT On-Site Engineer University Hospital Basel First and second level on-site support. Integrated new systems together with development and network engineering, planned and carried out hardware migrations and department relocations.
- 06/2020 – 11/2020 Rollout Technician University Hospital Basel Migrated individual workstations from Windows 7 to 10, including one-off solutions for clinical software.
- 01/2020 – 06/2020 Face-to-face fundraiser Corris AG Direct dialogue on behalf of charitable organisations.
- 06/2018 – 11/2019 Military Police, latterly security NCO Swiss Armed Forces Guarding army installations in Sion and Lucerne. Promoted from security soldier to non-commissioned officer, latterly with command responsibility.
- 08/2014 – 06/2018 Apprentice, application development SWISS TXT AG Four-year apprenticeship in application development at the SRG subsidiary in Biel. The first backend version of VicoTV came out of this period.
- 2014 – 2018 Federal Diploma, application development Gewerblich-Industrielle Berufsschule Bern Vocational school programme accompanying the apprenticeship.
- 2014 – 2015 IT foundation year ICT Berufsbildungscenter AG One-year foundation programme as an entry into IT.
Certificates
Downloadable PDFs.
- C Programming Certification Course Programming Hub Download PDF: C Programming Certification Course
- IT Basics Certification Course Programming Hub Download PDF: IT Basics Certification Course
- Fundamentals of Online Marketing Google Atelier Digital Download PDF: Fundamentals of Online Marketing
- Python Certification Course Programming Hub Download PDF: Python Certification Course
- Promotion to Wachtmeister, Military Police Swiss Armed Forces Download PDF: Promotion to Wachtmeister, Military Police
- Professional Scrum Master I Scrum.org Download PDF: Professional Scrum Master I
- Basisausbildung Informatik (IT foundation year) ICT Berufsbildungscenter AG Download PDF: Basisausbildung Informatik (IT foundation year)