Eine quelloffene macOS-Menüleisten-App mit einer Sammlung harmloser, vollständig reversibler Streiche — von Rickrolls beim Surfen bis zu täuschend echten (aber gefälschten) System-Screens. Gesteuert über ein verstecktes Overlay per globalem Hotkey.
Mac-first (Swift + AppleScript). Der Name „Loki“ ist plattform-neutral gewählt — eine spätere Windows-/Linux-Variante ist als Ziel vorgesehen.
Setze Loki ausschließlich auf Geräten ein, die dir gehören oder für die du die ausdrückliche Erlaubnis der besitzenden Person hast.
- Alle Streiche sind reversibel und nicht-destruktiv — kein Datenverlust.
- Kein Abgreifen von Passwörtern, Daten oder Tastatureingaben. Keine heimliche Persistenz.
- Die Panik-Taste
⌃⌥⌘Pstoppt jederzeit alles und stellt den Originalzustand wieder her. - Beim ersten Start musst du diesen Bedingungen aktiv zustimmen.
Heimliche Überwachung oder Streiche ohne Einverständnis sind nicht der Zweck dieses Projekts und können je nach Land rechtswidrig sein. Nutze es mit gesundem Menschenverstand und Respekt.
Voraussetzung: macOS 14+, Xcode (für die XCTest-Toolchain).
# Bauen & testen (Tests brauchen die Xcode-Toolchain)
swift build
DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer swift test
# Fertiges Loki.app erzeugen (Menüleisten-App, kein Dock-Icon)
./scripts/build-app.sh release
open build/Loki.appDie App ist nur ad-hoc signiert (nicht via Apple Developer ID notarisiert). Beim ersten Öffnen ggf.:
xattr -dr com.apple.quarantine build/Loki.app # oder: Rechtsklick > ÖffnenLoki.appstarten — sie erscheint als Masken-Symbol in der Menüleiste.- Beim ersten Start dem Einverständnis zustimmen.
- Overlay öffnen mit
⌃⌥⌘L(oder Menüleisten-Icon → „Steuerung öffnen“). - Streich an-/ausschalten. Reversible Streiche zeigen einen Stopp-Knopf.
⌃⌥⌘P= PANIK: stoppt alles und stellt den Originalzustand wieder her.
Beim ersten Auslösen fragt macOS nach Berechtigungen unter Systemeinstellungen → Datenschutz & Sicherheit:
| Berechtigung | Wofür |
|---|---|
| Automatisierung | Browser/Systemfunktionen via AppleScript steuern |
| Bedienungshilfen | Maus-/Tastatursimulation, Tipp-/Aktivitätssignale |
| Bildschirmaufnahme | Wallpaper-Screenshot & lokale Vision-Sicht |
| Mikrofon + Spracherkennung | optional: gesprochene Antworten an den Companion (on-device) |
Im Tab Modi startest du kuratierte „Flows", die mehrere Streiche zeitlich gestaffelt zusammenspielen — und sich am Ende immer selbst auflösen:
| Modus | Tier | Was passiert |
|---|---|---|
| Kleine Spielereien | 1 (Sanft) | Sounds → Sprachausgabe → Rickroll → Auflösung |
| Irgendwas stimmt nicht | 2 (Unheimlich) | Fake-Mitteilungen, Geister-Sounds, Maus-Drift, Flackern, Rickroll → Auflösung |
| Die Heimsuchung | 3 (Heimsuchung) | Companion spricht mit dir, Beobachter reagiert live, dann eskaliert alles → Auflösung |
Der ModeRunner erzwingt einen Reveal am Ende jedes Modus; Panik stoppt
einen laufenden Modus jederzeit und setzt alles zurück.
- Einwilligungs-Gate beim ersten Start, danach transparentes Rechte-Onboarding.
- Auto-Auflösung: optionaler Timer (in Minuten), nach dem Loki von selbst „Das war Loki" zeigt und alles zurücksetzt.
- Panik ⌃⌥⌘P + reversible, nicht-destruktive Streiche; kein Daten-/Passwort-Abgriff.
- Der Companion spricht (kein Notes) auf Basis einer lokalen Skript-Engine; optional über ein lokales LLM (Ollama) und mit gesprochener Antwort (on-device Spracherkennung) — alles lokal, nichts wird übertragen. Bleibt im Einwilligungs-/Reveal-Modell, kein verdecktes Manipulieren.
Jeder Streich hat eigene Einstellungen (per Schieberegler/Auswahl/Textfeld im Overlay) und ist reversibel oder ein harmloser Einmal-Effekt.
Browser
- Rickroll-Redirect — leitet zufällige Tabs auf ein Video um (Wahrscheinlichkeit, Intervall, Ziel-URL, Browser).
- Tab-Flut — öffnet immer wieder Tabs mit zufälligen URLs (URLs, Anzahl, Intervall, Browser).
- Auto-Neuladen — lädt den aktiven Tab ständig neu (Intervall, Wahrscheinlichkeit).
UI / Display
- Desktop-Icons verstecken · Bildschirm einfrieren (Screenshot-als-Hintergrund) · Hintergrundbild tauschen
- Bildschirm umdrehen¹ · Farben invertieren · Hell/Dunkel umschalten (inkl. Flackern)
- Dock-Chaos (Position/Ausblenden/Riesen-Vergrößerung) · Heiße Ecke · Riesen-Mauszeiger
- Zeitlupen-Animationen · Bildschirmschoner · App drängt sich vor
Audio & Stimme
- Zufällige Sprachausgabe · Lautstärke-Chaos · Sprechende Uhr · Geister-Sounds · Sprechende Zwischenablage
Tastatur & Maus
- Maus-Drift · Scroll-Richtung umkehren · Tastaturbelegung tauschen · Tasten-Wiederholung · Maus-Geschwindigkeit
Fake-System
- Fake-Benachrichtigungen · Fake-Systemdialog · Hacker-Terminal · Geister-Notiz · Sprechender Companion (KI) · Der Beobachter (Vision) · Auflösung
Der Beobachter reagiert live auf Aktivität („Beweg dich nicht weg", „Ich lese, was du tippst"). Alles ist on-device & leichtgewichtig: Maus-/App-/Tipp-Signale, optional lokale Apple-Vision-OCR (standardmäßig aus). Nichts wird übertragen oder gespeichert, die Tipp-Erkennung merkt nur dass getippt wird, nie welche Taste (kein Keylogger). Gedacht fürs höchste Tier (Modus „Die Heimsuchung").
¹ „Bildschirm umdrehen" benötigt displayplacer: brew install displayplacer.
Hinweis: Einige
defaults-basierte Streiche (Scroll-Richtung, Tasten-Wiederholung, Maus-Geschwindigkeit, Mauszeiger-Größe) greifen je nach macOS-Version erst nach erneuter An-/Abmeldung. „Fake-Systemdialog" und „Hacker-Terminal" fragen keine Eingaben ab — sie tun nichts mit dem, was getippt wird.
Sources/
LokiCore/ # testbare Engine, Safety, Streich-Katalog (keine UI)
Engine/ # PrankModule, PrankEngine, ScriptRunner, DefaultCatalog
Safety/ # StateStore, ConsentStore, GlobalHotkey
Pranks/ # je ein Streich-Modul (run/undo)
Loki/ # SwiftUI-Menüleisten-App auf Basis von LokiCore
Tests/LokiCoreTests/ # Engine-/StateStore-Unit-Tests
scripts/build-app.sh # wrappt das Binary in Loki.app (LSUIElement, Info.plist)
Sicherheits-Kern: Jeder zustandsändernde Streich sichert den Originalwert im
StateStore (auf Disk persistiert, übersteht Neustarts) und stellt ihn im
undo wieder her. PanicManager/Panik-Hotkey ruft undo für alle aktiven
Streiche auf — best-effort, ein Fehler blockiert die anderen nicht.
- Neue Klasse in
Sources/LokiCore/Pranks/anlegen, diePrankModuleerfüllt. - In
DefaultCatalog.swift(allPranks()) registrieren. - Einstellungen deklarativ über
var settings: [PrankSetting]angeben — die UI baut die Controls automatisch. Werte im Code viacontext.configlesen. - Zustandsänderungen über
context.store.saveOriginal/consumeOriginalsichern, damit Panik & Undo funktionieren.
- Phase 1: Engine, Safety, Overlay, Starter-Streiche. ✅
- Phase 2: Einstellungs-Framework + Streiche mit Settings-UI & Suche. ✅
- Phase 3: Modi/Tiers + Companion, Auto-Auflösung, Rechte-Onboarding, neugestaltete UI. ✅
- Phase 4 (später): Scheduler (Zufall/Events), Fake-Vollbild-Screens (eigenes Fenster), optionales lokales LLM für den Companion, opt-in Remote-Steuerung — transparent, für die bespaßte Person sicht- und abschaltbar.
MIT — siehe LICENSE.