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/bin usw.) und claude gefunden 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.swift auf branch: "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ü.
S
Description
No description provided
Readme 55 MiB
Languages
HTML 41.3%
Roff 37.2%
Shell 13.6%
C 3.3%
Swift 2.8%
Other 1.8%