- vendor/libghostty: vorgebaute macOS-libghostty.a (arm64) + Header + Build-Patches + README - Sources/CGhostty: C-Modul der libghostty-C-API - Sources/MiniTerm/Ghostty.swift: GhosttyApp + GhosttySurfaceView (Surface, Input, Größe, Fokus) - main.swift: Engine-Wahl per Info.plist MTEngine - Package.swift: CGhostty-Target + Link gegen libghostty + Frameworks - STATUS.md: Stand, Build-Weg (macOS-15-VM), offene Punkte
MiniTerm — winzige eigenständige Terminal-Apps für macOS
Ein minimaler, auf SwiftTerm basierender Terminal-Emulator. Sinn der Sache:
jede erzeugte .app ist eine eigene macOS-App mit eigener Bundle-ID — also
eigenes Dock-Icon und eigener ⌘-Tab-Eintrag. Genau das, was sich unter macOS
mit --class (wie bei Alacritty/Ghostty unter Linux) nicht lösen lässt.
Jede App startet in einem konfigurierbaren Arbeitsverzeichnis und führt einen
konfigurierbaren Befehl aus (z. B. claude). Für Claude Code reicht das
locker — SwiftTerm ist ein vollwertiger xterm-256color-kompatibler Emulator.
Voraussetzungen
- macOS 13+ und Xcode bzw. die Command Line Tools (
xcode-select --install) - Swift (kommt mit Xcode)
Schnellstart
cd MiniTerm
chmod +x make-app.sh
./make-app.sh \
--name "Claude · Projekt A" \
--bundle-id com.deinname.claude.projekta \
--workdir ~/code/projekt-a \
--command "claude"
Beim ersten Lauf wird das Binary einmal gebaut (swift build -c release,
lädt SwiftTerm). Danach liegt die App in ~/Applications/Claude · Projekt A.app
— per Doppelklick starten, Dock-Icon erscheint als eigene App.
Mehrere Apps (eigene Icons/Configs)
Einfach pro App einmal aufrufen. Das Binary wird nur einmal kompiliert und wiederverwendet:
./make-app.sh --name "Claude · Webshop" --bundle-id com.deinname.claude.webshop \
--workdir ~/code/webshop --command "claude" --icon ./icons/shop.icns
./make-app.sh --name "Claude · Infra" --bundle-id com.deinname.claude.infra \
--workdir ~/code/infra --command "claude" --icon ./icons/infra.icns
./make-app.sh --name "Scratch Shell" --bundle-id com.deinname.scratch \
--workdir ~ --command "" # leer = einfache Shell
Optionen
| Flag | Pflicht | Bedeutung |
|---|---|---|
--name |
ja | Anzeigename + Dateiname der App |
--bundle-id |
ja | Eindeutige Bundle-ID (gibt die eigene App-Identität) |
--workdir |
nein | Startverzeichnis (~ wird expandiert; leer = Home) |
--command |
nein | Befehl beim Start (leer = nur eine Login-Shell) |
--font-size |
nein | Schriftgröße (Default 13) |
--font |
nein | Schriftfamilie (Default Menlo; Fallback System-Mono) |
--icon |
nein | PNG/JPG (wird automatisch konvertiert) oder .icns |
--out |
nein | Zielordner (Default ~/Applications) |
Icon aus einem PNG
--icon nimmt direkt ein PNG (oder JPG) — das Skript erzeugt daraus
automatisch alle nötigen Größen und das .icns (via sips/iconutil):
./make-app.sh --name "Claude · Infra" --bundle-id com.deinname.claude.infra \
--workdir ~/code/infra --command "claude" --icon ~/Downloads/infra.png
Am besten ein quadratisches Bild nehmen, sonst verzerrt sips es. Eine
fertige .icns-Datei kannst du weiterhin auch direkt angeben.
Wie die Konfiguration funktioniert
Das kompilierte Binary ist für alle Apps identisch. Die Unterschiede stecken in
der Info.plist jedes Bundles (Schlüssel MTCommand, MTWorkingDirectory,
MTWindowTitle, MTFontSize, MTFontName). Das Programm liest sie beim Start aus
Bundle.main. So genügt ein Build für beliebig viele Apps.
Hinweise
- Der Befehl läuft immer über eine Login-Shell (
zsh -l), damit PATH stimmt (Homebrew,~/.local/binusw.) undclaudegefunden wird. - Nach Beenden des Befehls fällt das Fenster in eine normale Shell zurück
(
exec zsh -l), schließt sich also nicht sofort. - Die App ist ad-hoc signiert. Beim ersten Start ggf. Rechtsklick → „Öffnen", falls Gatekeeper meckert.
- SwiftTerm-Version: im
Package.swiftaufbranch: "main". Für reproduzierbare Builds dort auf einen festen Tag (from: "...") umstellen.
Tastatur
- Enter sendet wie gewohnt einen Wagenrücklauf (
\r) → Eingabe absenden. - Shift+Enter sendet einen Zeilenumbruch (
\n) → für mehrzeilige Eingaben, z. B. in Claude Code. Gilt auch für Enter auf dem Ziffernblock. - ⌘C / ⌘V funktionieren über das Edit-Menü.