joshuahirsig.xyz

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

2026

Live

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.

  • SvelteKit
  • TypeScript
  • Drizzle ORM
  • SQLite
  • Tailwind v4
  • Playwright
  • Vitest

roadbook

2026

In 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.

  • Go
  • React
  • TypeScript
  • SQLite
  • OIDC
  • PWA

stepshot

2026

Alpha

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.

  • Rust
  • AT-SPI
  • Wayland
  • KDE

fix-omnissa-horizon-wayland

2026

Patches 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.

  • Shell
  • Patches
  • Wayland

ts3-query-proxy

2026

Translation 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.

  • Python
  • asyncio

gentoo-forge

2026

My 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.

  • Gentoo
  • Portage
  • OpenRC
  • Shell

dotfiles

2026

Ongoing

One chezmoi repository for Fedora and Gentoo. Distro detection picks the right variant of the zsh, git, kitty, starship and btop configuration per machine.

  • chezmoi
  • zsh
  • Go templates

openmapper

2026

In development

A mapping tool in Go. Too early to say more.

  • Go

TSPerms

2026

Live

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.

  • Python
  • Flask
  • Docker
  • Traefik
  • Authentik

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.

  • Go

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.

  • JavaScript

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.

  • Go
  • Next.js

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.

  • TypeScript

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.

  • Rust
  • Tauri

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.

  • JavaScript
  • Docker

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

2026

Main 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.

  • TypeScript
  • Monorepo

Approval services for LLM agents

2026

Main 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).

  • TypeScript
  • NestJS
  • Drizzle ORM
  • PostgreSQL
  • React
  • MCP SDK

Gateway for agent-facing services

2026

Sole 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.

  • TypeScript
  • NestJS
  • MCP SDK

Receipt digitisation with OCR

2026

Main 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.

  • React
  • PDF.js
  • Tesseract.js

Internal ordering tool

2025

Main author · 37 of 41 commits

In-house tool for placing and tracking orders. August to November 2025.

  • TypeScript
  • Svelte

Internal search tool

2025

Main author · 40 of 64 commits

In-house tool for searching and retrieving internal content. July to November 2025.

  • TypeScript

Template editor for test protocols

2026

Team 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.

  • Vue 3
  • Node
  • PostgreSQL

Internal contact management system

2026

Team 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.

  • Java
  • Jakarta EE
  • React
  • TypeScript

Client work

Websites and design work built for other people.

denidrive.ch

2023

Website for a driving school, built on WordPress. I still handle updates and new pages for it.

  • WordPress
  • PHP
  • CSS

Akkordeon Brittnau

2022

WordPress set up for a music club so its members can publish news and event posts themselves, without me in the loop.

  • WordPress
  • PHP

Kydah

2019

Portfolio website, hand-written in HTML, CSS and JavaScript.

  • HTML
  • CSS
  • JavaScript

Mein Baumhaus

2018

Company website. The domain is gone; the link points to the Internet Archive.

  • PHP
  • HTML
  • CSS
  • JavaScript

KIAN

2017

Menu design for a restaurant. Ordering from a tablet at the table was planned alongside it.

  • InDesign
  • Print

VicoTV

2017

First version of the backend. VicoTV was an apprentice startup run by Swisscom and SRG.

  • C#
  • .NET

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.

  • DNS
  • DoH

Authentik

Single sign-on for the services behind it. Login by passkey, with the password left as a fallback.

  • SSO
  • OIDC
  • Passkeys

CrowdSec

Reads the logs of the public services and blocks addresses whose behaviour looks like an attack.

  • Security
  • iptables

Forgejo

The Git forge I actually push to. GitHub and Codeberg are mirrors that get pushed from here.

  • Git
  • CI

Immich

Photo and video library for the household. Search and face recognition run on the server, not in someone else's cloud.

  • PostgreSQL
  • ML

Matrix

Homeserver for private chat and calls. Login goes through Authentik by way of MAS.

  • Synapse
  • MAS

Traefik

Reverse proxy in front of every container: routing by host name and automatic Let's Encrypt certificates.

  • Docker
  • ACME

Uptime Kuma

Watches every other service, sends the alert when one drops, and feeds the live status on this page.

  • Monitoring

Vaultwarden

Password vault, compatible with the Bitwarden clients, running on hardware I control.

  • Rust
  • Bitwarden

Zipline

Short links for screenshots and file uploads, under my own domain instead of a hoster's.

  • Node.js
  • S3

Game servers

Browser games for friends, no account needed.

Codenames

Word association game for two teams. Open the link, pick a side, play.

  • Browser

Massive Decks

Cards-against-humanity style card game, made for larger groups.

  • Browser

Scribble

Draw and guess with friends; a round starts as soon as two people are in the room.

  • Browser
  • WebSocket

TriviaForge

Quiz nights with question sets you write yourself instead of buying.

  • Browser

CV

Stations, shortest form.

  1. 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.
  2. 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.
  3. 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.
  4. 06/2020 – 11/2020 Rollout Technician University Hospital Basel Migrated individual workstations from Windows 7 to 10, including one-off solutions for clinical software.
  5. 01/2020 – 06/2020 Face-to-face fundraiser Corris AG Direct dialogue on behalf of charitable organisations.
  6. 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.
  7. 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.
  8. 2014 – 2018 Federal Diploma, application development Gewerblich-Industrielle Berufsschule Bern Vocational school programme accompanying the apprenticeship.
  9. 2014 – 2015 IT foundation year ICT Berufsbildungscenter AG One-year foundation programme as an entry into IT.

Certificates

Downloadable PDFs.