Skip to content
CharlyAppsPublic

About

Agent Monitoring Daemon and App

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Sqwack

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

What It Shows

  • 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.

How It Works

  • sqwackd runs 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.

Requirements

  • 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).

Install

git clone https://github.com/CharlyApps/Sqwack.git
cd Sqwack

./scripts/install-daemon.sh
sqwackd setup
sqwackd status

Install agent integrations:

sqwackd integrations install claude
sqwackd integrations install codex
sqwackd integrations install hermes

Open the iPad app:

open ios/Sqwack.xcodeproj

Select the Sqwack scheme in Xcode and run it on an iPad simulator or device.

Android Tablet

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 installDebug

Or 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.

Pair The iPad

Start pairing on the Mac:

sqwackd pair

The 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

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 doctor

Sqwack uses Tailscale Serve only. It does not use Tailscale Funnel.

Times Gate

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 find

The 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.

Try Demo Data

sqwackd demo
sqwackd demo --loop

The iPad should update as the demo cycles through working, waiting, done, failure, and recovery states.

Useful Commands

sqwackd status
sqwackd doctor
sqwackd logs -f
sqwackd restart
sqwackd prune
sqwackd uninstall

Privacy And Safety

  • 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.

Tests

Daemon:

cd daemon
npm test
npm run typecheck

iPad app:

cd ios
xcodebuild -project Sqwack.xcodeproj -scheme Sqwack \
  -destination 'platform=iOS Simulator,name=iPad Pro 13-inch (M5)' test

Uninstall

sqwackd uninstall
rm /usr/local/bin/sqwackd
rm -rf ~/.sqwack

If you installed agent integrations, remove the sqwack-* hook entries from the provider config files. Sqwack creates .sqwack-backup files before editing provider configs.

Documentation

About

Agent Monitoring Daemon and App

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages