joshuahirsig.xyz

Softwareentwickler · Systeme & Self-Hosting

Joshua 祐华 Hirsig

Softwareentwickler in der Schweiz. Ich arbeite über den ganzen Stack — Services in TypeScript und Go, etwas Rust — und betreibe die Linux-Server, auf denen das Ergebnis läuft. Fast alles, was von dieser Seite weggeht, liegt auf einer einzigen eigenen Maschine.

14

Dienste selbst gehostet

docker · traefik

23

Projekte umgesetzt

dev · work · client

2017

unterwegs seit

ch

Live-Status

online

Eigene Projekte

Dinge, die ich für mich selbst baue. Quellcode offen, wo es welchen gibt.

Koch- & Backbuch

2026

Live

Eine Codebasis für zwei Aufgaben: Rezeptverwaltung für die Bäckerei mit Bäckerprozent, Chargen und Kostenrechnung — und ein privates Kochbuch mit Mengen-Slider, Kochmodus und Sprachsteuerung. Als PWA offline installierbar.

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

roadbook

2026

In Entwicklung

Offline-fähige PWA für eine Autoreise: Etappenplanung, Reisetagebuch, Budget und Checklisten. Das Go-Backend bettet das gebaute React-Frontend als einzelne Binary ein, der Client synchronisiert über IndexedDB.

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

stepshot

2026

Alpha

Step-Recorder für KDE unter Wayland: screenshottet das angeklickte Fenster, markiert den Klick, benennt das UI-Element über AT-SPI und exportiert einen eigenständigen HTML-, PDF- oder DOCX-Report. Läuft im Tray.

  • Rust
  • AT-SPI
  • Wayland
  • KDE

fix-omnissa-horizon-wayland

2026

Patches, die den Omnissa-Horizon-Client unter Wayland brauchbar machen: Dark Theme, HiDPI-Skalierung, ein XKB-Crash und eine Protocol-Warnung. Aufbereitet für Fedora, Gentoo und Arch.

  • Shell
  • Patches
  • Wayland

ts3-query-proxy

2026

Übersetzungsschicht vom alten TeamSpeak-3-Raw-Query-Protokoll auf die TeamSpeak-6-SSH-Query, damit Tools für die alte Schnittstelle ohne Änderung weiterlaufen.

  • Python
  • asyncio

gentoo-forge

2026

Mein Gentoo-Setup als öffentliche Referenz: OpenRC, KDE Plasma auf Wayland, AMD-Grafik, systemweites LTO und natives Steam — Portage-Konfiguration samt Notizen, warum sie so aussieht.

  • Gentoo
  • Portage
  • OpenRC
  • Shell

dotfiles

2026

Laufend

Ein chezmoi-Repository für Fedora und Gentoo. Eine Distro-Erkennung wählt pro Maschine die passende Variante der Konfiguration von zsh, git, kitty, starship und btop.

  • chezmoi
  • zsh
  • Go templates

openmapper

2026

In Entwicklung

Ein Mapping-Werkzeug in Go. Für mehr ist es noch zu früh.

  • Go

TSPerms

2026

Live

Web-Oberfläche für die Servergruppen und Bans eines TeamSpeak-6-Servers — auch für Mitglieder, die gerade offline sind und deshalb im TS-Client nicht anklickbar wären.

  • Python
  • Flask
  • Docker
  • Traefik
  • Authentik

Open-Source-Beiträge

Beiträge zu fremden Projekten. Jeder Link führt zum Pull Request im Upstream-Repository.

gemergt

Fremdes Projekt: Maxallica/ts6-viewer

Drei Bugfixes: ein bufio-Panic bei grossen ServerQuery-Antworten (Buffer 4 KB auf 64 KB) und ein Goroutine-Leak im Keepalive; ein Read-Timeout von 15 Sekunden gegen hängende SSH-Verbindungen plus konfigurierbares max_width; Reconnect bei EOF für channellist, clientlist und serverinfo.

  • Go

gemergt

Fremdes Projekt: mathieuviart/legrandgeoquiz

Vollständige deutsche Lokalisierung — 146 Keys, 228 Ländernamen, 399 Hinweistexte — plus eine selbst hostbare Daily-API als Fallback zum Cloudflare Worker. Ein zweiter Pull Request teilte die 5510 Zeilen lange index.html in 14 Module auf, funktional unverändert.

  • JavaScript

gemergt

Fremdes Projekt: Majorfi/immich-places

HERE Maps als Fallback-Geocoder für die Fälle, in denen Nominatim nichts zurückgibt. Backend und Frontend, über Umgebungsvariablen konfigurierbar, kein Breaking Change.

  • Go
  • Next.js

in Review

Fremdes Projekt: coom/ts6-manager

Beiträge an coom/ts6-manager, einem aktiv gepflegten Fork von clusterzx/ts6-manager. Fünf offene Pull Requests: Single-Flight-Token-Refresh gegen die Refresh-Stampede bei parallelen 401ern; numerischer Vergleich von WebQuery-Booleans, weil "0" truthy ist und alle Clients fälschlich als abwesend markierte; erneutes Lesen der gespeicherten Identität, damit Rollenänderungen ankommen; fünf Security-Härtungen (yt-dlp-Argument-Injection, SSRF über Redirects, Entropie der MFA-Recovery-Codes); Reverse-Proxy-SSO über vertrauenswürdige Header mit JIT-Provisioning.

  • TypeScript

in Review

Fremdes Projekt: cinnyapp/cinny-desktop

System-Tray auf Tauri v2 portiert. Unter Linux mit einer eigenen ksni-StatusNotifierItem-Implementierung, weil Tauris tray-icon dort keinen Linksklick weiterreicht.

  • Rust
  • Tauri

in Review

Fremdes Projekt: mathieuviart/PokemonTCGSetOrMilitaryOperation

Die einzelne index.html modularisiert, Theme-Farben korrigiert, die nur im Dark Mode funktionierten, das Layout mobil responsiv gemacht, Self-Hosting per Docker Compose und ein Favicon ergänzt.

  • JavaScript
  • Docker

Arbeit

Anonymisierte Fallbeispiele aus dem Anstellungsverhältnis: keine Arbeitgeber-, Kunden- oder internen Namen. Mein Anteil ist als Commit-Zahl angegeben — in diesen Repositories wird direkt gepusht statt über Pull Requests, das ist also der ehrliche Massstab.

Inventar- und Wartungsanwendung

2026

Hauptautor · 113 von 137 Commits

Read-only-Übersicht über ein Inventar technischer Geräte, dazu der Ablauf für Wartungen und Übergabeprotokolle samt PDF-Export. Sieben Monate Arbeit, September 2025 bis April 2026 — mein grösster einzelner Beitrag.

  • TypeScript
  • Monorepo

Freigabe-Dienste für LLM-Agenten

2026

Hauptautor · 41 von 43 Commits

Eine Familie von Diensten, die einem LLM-Agenten kontrollierten Zugriff auf interne Geschäftssysteme gibt — mit menschlicher Freigabe vor jeder Schreiboperation. Drei davon stammen von mir: einer vor einer internen Inventar-API (8 von 10 Commits), einer vor einem internen Wiki (12 von 12), einer vor einem Zeit- und Ferienerfassungssystem (21 von 21).

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

Gateway für Agenten-Dienste

2026

Alleinige Umsetzung · 12 von 12 Commits Laufend

Ein Gateway, das die einzelnen Freigabe-Dienste hinter einem einzigen Endpunkt bündelt — ein Agent spricht so mit einem Einstiegspunkt statt mit vielen. Allein von mir geschrieben und weiterhin im Ausbau.

  • TypeScript
  • NestJS
  • MCP SDK

Beleg-Digitalisierung mit OCR

2026

Hauptautor · 18 von 23 Commits

Digitalisiert Belege per OCR. Bewusst ohne Serverkomponente gebaut: Alles läuft im Browser, sensible Dokumente verlassen das Gerät also nicht. Januar 2026.

  • React
  • PDF.js
  • Tesseract.js

Internes Bestell-Werkzeug

2025

Hauptautor · 37 von 41 Commits

Firmeninternes Werkzeug zum Auslösen und Nachverfolgen von Bestellungen. August bis November 2025.

  • TypeScript
  • Svelte

Internes Such-Werkzeug

2025

Hauptautor · 40 von 64 Commits

Firmeninternes Werkzeug zum Suchen und Auffinden interner Inhalte. Juli bis November 2025.

  • TypeScript

Template-Editor für Prüfprotokolle

2026

Mitarbeit im Team · 3 von 5 Commits

Editor für die Vorlagen hinter Prüfprotokollen zu technischen Anlagen. Ein kleiner Arbeitsanteil im Team. März 2026.

  • Vue 3
  • Node
  • PostgreSQL

Internes Kontaktverwaltungssystem

2026

Mitarbeit im Team, geringer Anteil

Firmeninternes System für Firmen- und Personendaten. Ich habe an einzelnen Teilen mitgearbeitet, zusammen mit mehreren anderen Entwicklern: 4 von 25 Commits im Frontend, 1 von 49 im Backend.

  • Java
  • Jakarta EE
  • React
  • TypeScript

Kundenprojekte

Websites und Gestaltungsarbeiten für andere.

denidrive.ch

2023

Website einer Fahrschule auf WordPress-Basis. Updates und neue Seiten mache ich bis heute.

  • WordPress
  • PHP
  • CSS

Akkordeon Brittnau

2022

WordPress-Framework für einen Verein aufgesetzt, damit die Mitglieder Beiträge und Termine selbst veröffentlichen können — ohne Umweg über mich.

  • WordPress
  • PHP

Kydah

2019

Portfolio-Website, von Hand in HTML, CSS und JavaScript geschrieben.

  • HTML
  • CSS
  • JavaScript

Mein Baumhaus

2018

Firmen-Website. Die Domain gibt es nicht mehr, der Link zeigt ins Internet Archive.

  • PHP
  • HTML
  • CSS
  • JavaScript

KIAN

2017

Gestaltung der Speisekarte eines Restaurants. Die Bestellung per Tablet am Tisch war zusätzlich geplant.

  • InDesign
  • Print

VicoTV

2017

Erste Version des Backends. VicoTV war ein Lernenden-Startup von Swisscom und SRG.

  • C#
  • .NET

Infrastruktur

Was auf der Maschine läuft — und wofür.

AdGuard Home

Filternder DNS-Resolver für alle Geräte im Haushalt, von aussen per DNS-over-HTTPS erreichbar.

  • DNS
  • DoH

Authentik

Single Sign-on für die Dienste dahinter. Anmeldung per Passkey, das Passwort bleibt als Rückfallebene.

  • SSO
  • OIDC
  • Passkeys

CrowdSec

Liest die Logs der öffentlichen Dienste und sperrt Adressen, deren Verhalten nach Angriff aussieht.

  • Security
  • iptables

Forgejo

Die Git-Forge, auf die ich tatsächlich pushe. GitHub und Codeberg sind Spiegel, die von hier aus befüllt werden.

  • Git
  • CI

Immich

Foto- und Videobibliothek für den Haushalt. Suche und Gesichtserkennung laufen auf dem Server, nicht in fremder Cloud.

  • PostgreSQL
  • ML

Matrix

Homeserver für privaten Chat und Anrufe. Die Anmeldung läuft über MAS gegen Authentik.

  • Synapse
  • MAS

Traefik

Reverse Proxy vor jedem Container: Routing nach Hostname und automatische Let's-Encrypt-Zertifikate.

  • Docker
  • ACME

Uptime Kuma

Überwacht alle anderen Dienste, meldet Ausfälle und liefert den Live-Status auf dieser Seite.

  • Monitoring

Vaultwarden

Passwort-Tresor, kompatibel zu den Bitwarden-Clients, auf eigener Hardware.

  • Rust
  • Bitwarden

Zipline

Kurze Links für Screenshots und Datei-Uploads, unter eigener Domain statt bei einem Hoster.

  • Node.js
  • S3

Spiele-Server

Browserspiele für Freunde, ganz ohne Konto.

Codenames

Wortassoziationsspiel für zwei Teams. Link öffnen, Seite wählen, los.

  • Browser

Massive Decks

Kartenspiel im Stil von Cards Against Humanity, gedacht für grössere Runden.

  • Browser

Scribble

Zeichnen und raten mit Freunden; eine Runde startet, sobald zwei Leute im Raum sind.

  • Browser
  • WebSocket

TriviaForge

Quizabende mit Fragensets, die man selbst schreibt statt kauft.

  • Browser

Lebenslauf

Stationen, in Kurzform.

  1. 06/2024 – heute Biomedical Engineer Immeditech AG Medizintechnik zwischen Gerät und IT-Infrastruktur. Daneben interne Werkzeuge: Freigabe-Dienste für LLM-Agenten, eine Inventar- und Wartungsanwendung, Beleg-Digitalisierung.
  2. 02/2023 – 05/2024 Informatiker MBT, Medizintechnik-IT Universitätsspital Basel IT-Verantwortung für medizintechnische Geräte samt Server- und Netzwerkumgebung. Klinische Systeme an die ICT-Infrastruktur angebunden, Betrieb und Monitoring der Fachapplikationen, Mitarbeit an Schnittstellendesign.
  3. 11/2020 – 02/2023 Junior IT-Onsite Engineer Universitätsspital Basel Vor-Ort-Support im 1st und 2nd Level. Neue Systeme gemeinsam mit Entwicklung und Netzwerk-Engineering integriert, Hardware-Migrationen und Abteilungsumzüge geplant und umgesetzt.
  4. 06/2020 – 11/2020 Rollout-Techniker Universitätsspital Basel Migration von Windows 7 auf 10 an Einzelarbeitsplätzen, inklusive Einzellösungen für klinische Software.
  5. 01/2020 – 06/2020 Dialoger Corris AG Direktansprache im Auftrag von Hilfswerken.
  6. 06/2018 – 11/2019 Militärpolizei, zuletzt Sicherungsunteroffizier Schweizer Armee Objektsicherung in Sion und Luzern. Vom Sicherungssoldaten zum Unteroffizier befördert, zuletzt mit Führungsverantwortung.
  7. 08/2014 – 06/2018 Lernender Applikationsentwicklung SWISS TXT AG Vierjährige Lehre als Applikationsentwickler bei der SRG-Tochter in Biel. In dieser Zeit entstand unter anderem die erste Backend-Fassung von VicoTV.
  8. 2014 – 2018 Informatiker Applikationsentwicklung EFZ Gewerblich-Industrielle Berufsschule Bern Berufsbegleitende schulische Ausbildung zur Lehre.
  9. 2014 – 2015 Basisausbildung Informatik ICT Berufsbildungscenter AG Einjährige Grundausbildung zum Einstieg in die Informatik.

Zertifikate

PDFs zum Herunterladen.