Sqwack is a local status board for your development machine.
It runs a small macOS daemon, sqwackd, and a native iPad or Android tablet app.
The daemon watches
your AI coding agents and local development services, then streams a live status
view to the iPad over your LAN or Tailscale.
No cloud backend. No remote shell. No source-code upload.
AI agents + dev services
|
v
sqwackd macOS daemon
|
v
LAN or Tailscale
|
v
Sqwack iPad / Android app
- Agent state: working, waiting for input, done, failed, or idle.
- Local dev services: process name, port, PID, and project directory.
- Machine health: CPU, memory, top processes, and recent activity.
- Read-only transcripts when the original provider session file is available.
- Account usage where a supported local source exists.
sqwackdruns locally on your Mac.- Agent integrations send small lifecycle events into the daemon.
- The daemon stores recent events in SQLite under
~/.sqwack/. - The iPad connects with a paired device token stored in Keychain.
- Tailscale is recommended for private remote access.
- macOS
- Node.js 24 or newer
- Xcode 16 or newer, for the iPad app
- iPadOS 18 or newer, or Android 8.0 or newer for the tablet app
- CodexBar 0.49 or newer, for account usage and balance cards
- Tailscale, optional but recommended
Sqwack reads Codex, Claude, and DeepSeek usage through CodexBar's local CLI when available. Codex and Claude are requested through CodexBar's CLI source; DeepSeek uses CodexBar's configured API account because CodexBar does not expose a DeepSeek CLI source. Usage refresh is manual, repeated requests for the same provider are suppressed for five minutes, and the iPad labels cached values with their age.
Provider icons are vendored from @lobehub/icons-static-png 1.94.0 (MIT).
git clone https://github.com/CharlyApps/Sqwack.git
cd Sqwack
./scripts/install-daemon.sh
sqwackd setup
sqwackd statusInstall agent integrations:
sqwackd integrations install claude
sqwackd integrations install codex
sqwackd integrations install hermesOpen the iPad app:
open ios/Sqwack.xcodeprojSelect the Sqwack scheme in Xcode and run it on an iPad simulator or device.
The Android app in android/ mirrors the iPad app screen for screen (Compose,
same wire protocol, same pairing flow). Build and install it with:
cd android && ./gradlew installDebugOr open the android/ folder in Android Studio. It needs Android 8.0 or newer,
keeps the screen awake while open, and stores the device credential in the app's
private storage instead of the iOS Keychain.
Start pairing on the Mac:
sqwackd pairThe command prints a short code and the addresses the iPad can use. In the app, enter the daemon address and the pairing code.
Pairing creates a long-lived device credential in the iOS Keychain. Revoke paired devices any time:
sqwackd devices
sqwackd devices revoke <device-id>Tailscale lets the iPad reach the daemon privately from anywhere without opening a public port.
Edit ~/.sqwack/config.json:
{
"network": {
"port": 4737,
"bind": "127.0.0.1",
"tailscaleServe": true
}
}Then apply the change:
sqwackd setup
sqwackd doctorSqwack uses Tailscale Serve only. It does not use Tailscale Funnel.
Sqwack can mirror Codex and Claude usage, agent state, CPU/RAM, and disk/uptime activity across all five screens of a Divoom Times Gate.
Add the device IP and the LocalToken shown in the Divoom app's device settings
to ~/.sqwack/config.json:
{
"timesGate": {
"host": "192.168.1.123",
"localToken": 123456,
"mac": "98:a3:16:d8:f2:74"
}
}Then run sqwackd restart. The token stays in the existing mode-0600 local
config file and is never sent anywhere except the Times Gate on the LAN.
Release the screens to the Divoom app or device Mode control, then restore the live dashboard later:
sqwackd timesgate off
sqwackd timesgate on
sqwackd timesgate toggle
sqwackd timesgate findThe selected state persists across daemon and Mac restarts. If DHCP changes the
device address, find locates the saved MAC, updates the IP, and restores the dashboard.
sqwackd demo
sqwackd demo --loopThe iPad should update as the demo cycles through working, waiting, done, failure, and recovery states.
sqwackd status
sqwackd doctor
sqwackd logs -f
sqwackd restart
sqwackd prune
sqwackd uninstall- The daemon is local-first and stores data under
~/.sqwack/. - Device tokens are hashed at rest.
- Pairing codes are short-lived and single-use.
- Hook scripts time out quickly and always exit without blocking your agents.
- The process kill action is confirmation-gated and PID-recycle checked.
- There is no arbitrary command execution endpoint.
Daemon:
cd daemon
npm test
npm run typecheckiPad app:
cd ios
xcodebuild -project Sqwack.xcodeproj -scheme Sqwack \
-destination 'platform=iOS Simulator,name=iPad Pro 13-inch (M5)' testsqwackd uninstall
rm /usr/local/bin/sqwackd
rm -rf ~/.sqwackIf you installed agent integrations, remove the sqwack-* hook entries from the
provider config files. Sqwack creates .sqwack-backup files before editing
provider configs.