macOS-Menüleisten-App und CLI
Tablefast
Öffnet SQLite-Dateien auf entfernten Servern in TablePlus. Ein lokaler Postgres-Proxy in Rust, der die Abfragen über SSH an sqlite3 auf dem Server weiterreicht.
- Status
- für mich im Einsatz, nicht öffentlich
- Erste Session
- 16. September 2026
- can we rebuild it in rust ?
- Technik
- Rust, Tokio, pgwire, tray-icon, SSH
Warum ich das gebaut habe
Mehrere meiner Apps speichern ihre Daten in SQLite, direkt auf dem Server. Zum Reinschauen nutze ich TablePlus, aber das öffnet SQLite nur als lokale Datei.
Dafür gibt es Remote SQLite, eine kleine Mac-App. Die hat mich an einer Stelle gestört: Sie bringt ihren eigenen SSH-Client mit. Meine Schlüssel liegen aber nicht auf jedem Server. Ich komme nur über einen Bastion-Host weiter, und genau das konnte die App nicht. Also habe ich mir angeschaut, wie sie funktioniert, und das Prinzip in Rust nachgebaut, reduziert auf das, was ich brauche: mehrere Server über SSH und TablePlus.
Was es macht
- Lebt als Feder-Symbol in der Menüleiste. Ein Klick startet eine Verbindung, ein Untermenü öffnet sie direkt in TablePlus.
- Jeder Server aus der Konfigurationsdatei bekommt einen eigenen lokalen Port.
- In TablePlus legst du eine normale PostgreSQL-Verbindung auf
127.0.0.1an. Benutzer und Passwort spielen keine Rolle. - Standardmäßig nur lesend. Schreibende Befehle werden schon auf dem Mac verworfen.
Technische Entscheidungen
Postgres vortäuschen. TablePlus fragt den Katalog ab, also pg_class, information_schema und Co. Der Proxy beantwortet diese Fragen aus sqlite_master und PRAGMA. Echte Abfragen gehen unverändert an einen dauerhaft laufenden sqlite3 -batch auf dem Server, im JSON-Modus. Das Protokoll übernimmt pgwire.
Das echte ssh statt einer eigenen SSH-Bibliothek. Damit funktionieren meine SSH-Config, der Agent und Tailscale ohne weiteres. Für den Bastion-Host nutze ich verschachteltes SSH statt ProxyJump. Der Bastion verbindet sich mit seinem eigenen Schlüssel weiter, mein Mac-Schlüssel muss nie auf dem Zielserver liegen.
Alles in einem Binary. Die Menüleiste läuft über tray-icon, ohne Swift-Projekt daneben. Rund 2.400 Zeilen Rust.
Aus den Sessions
Angefangen hat es am 16. September 2026 mit der Frage, wie Remote SQLite eigentlich funktioniert. Am Nachmittag liefen vier Datenbanken von verschiedenen Servern in TablePlus.
Dazwischen lag viel Kleinkram, den nur echtes Benutzen zeigt. Jede Tabelle tauchte mehrfach auf, weil TablePlus pro Schema und pro Typ fragt und der Proxy die Filter ignoriert hat. Das Schema hieß plötzlich 2200, weil ich die OID statt des Namens zuerst geschickt hatte. Eine Wissensdatenbank mit Embeddings ließ den Proxy abstürzen, weil sqlite3 BLOBs als rohe Bytes ins JSON schreibt. Und das Menüleisten-Symbol war erst unsichtbar, danach doppelt da.
Die wichtigste Frage kam am Ende: Ist das gefährlich auf Produktionsdatenbanken? Lesen geht, mit Vorsicht, Schreiben nicht. Deshalb ist read-only der Standard, und ich schließe TablePlus, wenn ich fertig bin.