Mobile control plane for AI coding agents
Run AI engineers on your server.
Command them from your phone.
Spin up AI coding agents on your cloud server. Monitor, steer, and review every one from your phone — 24/7, no desktop.
All while using your existing AI subscriptions and credits.
2:11
5G ● 69%
Syndic
All 7
2 Active
1 Idle
1 Input
3 Closed
▾ hone
5
+
syndic/ws-7IAeV008xJS98299 · 22h ago
Fix workers memory leak in background job processor
● RUNNING
○ api-server/ws-A3kXm... · 4m
12 turns
Add dark mode to settings
● INPUT
○ syndic/ws-fFmZx... · 4h
Agent waiting for reply
Fix Redis connection pool
IDLE
○ syndic/ws-BbDf2... · 1d
Paused · 86 turns
Update CI pipeline config
CANCELLED
○ syndic/ws-HmY-_... · 1d
Cancelled 1d
Refactor user endpoints
CLOSED
○ syndic/ws-Kp9xR... · 2d
Closed 2d
▾ humza-website
2
+
syndic/ws-mL6Fd... · 1d ago
Build landing page hero
● RUNNING
○ syndic/ws-mL6Fd... · 3h
118 turns
Do I have a package json...
CANCELLED
○ syndic/ws-pQ7nX... · 1d
Cancelled 1d
+ New Task
Fix workers memory leak
✕
⑂ api-server · ws-A3kXm · claude
● LIVE
Fix workers memory leak in background job processor
Q
⑂
>_
Root cause
The WorkerPool in workers/pool.js was holding references to completed job callbacks in a Map that was never cleared. Each job registered a onComplete closure but the cleanup on job exit was missing, causing the map to grow indefinitely under sustained load.What I fixed
Added explicit cleanup in the job exit handler — the callback reference is now deleted from the map on both success and error paths. Heap usage dropped from ~1.8 GB/hr growth to flat in local benchmarks.Can you also open a PR for this
PR created: https://github.com/humzakhan/api-server/pull/5
✎ 1 file +4 −1
PR #5 ›
diff ›
● Auto-scroll paused
↓ Jump to live
Message the agent...
@
■ Stop
↑ Send
I
The
I'm
Q
W
E
R
T
Y
U
I
O
P
A
S
D
F
G
H
J
K
L
⇧
Z
X
C
V
B
N
M
⌫
123
☺
⏎
← PR #5 · 1 file
f
workers/pool.js+4 −1
File 1 of 1 · 1 hunk
‹
›
☰
47
worker.on('exit', (code) => {
48
this.busy = false;
49
- this.emit('done', id, code);
49
+ if (this.callbacks.has(id)) {
50
+ this.callbacks.delete(id);
51
+ }
52
+ this.emit('done', id, code);
53
});
◫ Comment
✕ Reject
How it works
Three steps. Five minutes. Ship from your phone.
1
Setup
Install on your server
One command on your server. Syndic installs, detects your CLIs, and waits for your phone to pair.
$ curl -fsSL get.syndic.dev | sh
Installing syndic v0.1.0...
✓ Binary installed
✓ Service configured
$ syndic init
Scanning for AI CLIs...
✓ Claude Code 2.1.89 — ready
✓ Codex CLI — needs auth
✓ Server ready · waiting for pairing
AWS
GCP
DigitalOcean
Hetzner
Any Linux VM
2
Connect
Pair your phone
Run
syndic pair on the server. Scan the QR code with the Syndic app. Confirm the 6-digit code. No account, no signup.$ syndic pair --url http://46.225.159.112:8099
Server: 46.225.159.112:8099
Expires: 5 minutes
Scan with the Syndic app.
✓ Device paired: iPhone
TOTP: 175563
✓ TOTP verified — pairing complete!
12:585G ●
✓
Paired
Connected to your server
DeviceiPhone
Server46.225...112
ProtocolTLS 1.3
BiometricEnabled
Open Fleet
⊞
Fleet◫
Inbox⑂
Review⚙
Settings3
Dispatch
Dispatch from anywhere
Launch coding agents from your phone. Pick the repo, describe the task, choose your CLI. They code 24/7 — you monitor, steer, and merge from wherever you are.
Claude
Codex
Kimi
OpenCode
>_
Custom
Your phone
launch · steer · merge
TLS 1.3 · encrypted
Your server
agents code 24/7
Explore the app.
Eight screens. Every workflow.
Syndic
Exploration complete. You've seen it all.
10:24
Sunday, April 5
Tap to explore
⌘
Dispatch◉
Fleet⟩_
CLIs1
✦
Review⚡
Debug◈
Security∑
Budget⟐
SettingsDownload on App Store
Dispatch
Your desktop workflow — from your phone.
Describe the task, pick the repo, choose your CLI, tap launch. Your agent starts on the server. You get notified when it needs you.
3:285G ●
Can you list all prompts in this repo
⑂ hone · syndic/ws-7IA... · claude ● LIVE
Can you list all prompts in this repo
⑂Q>_ 27 tool calls · agent, glob, bash, read
Here are all the prompts in this repo:
Core Prompts (prompts/)
● Auto-scroll paused ↓ Jump to live
Message the agent...
@
■ Stop
3:265G ●
Task launched!
Your agent is spinning up.
You'll be notified when it needs you.
You'll be notified when it needs you.
TaskCan you list all prompts in...
Repo / Branchhone / main
HarnessClaude Code
Watch in Fleet
+ Launch another task
3:265G ●
New Task
Cancel
Repository
hone ▾
main ▾
Description
Can you list all prompts in this repo
Harness
Claude Code ▾
↗ Launch Task
· Describe it. Launch it. Walk away.
· Same workflow as your desktop — just mobile
· Full visibility: every file, every tool call, live
· Works with Claude Code, Codex or OpenCode etc
Fleet
Multiple agents. One glance.
Point agents at different repos and walk away. Each runs independently — own branch, own PR. The fleet screen shows you everything at a glance.
9:415G ●
Syndic
No tasks running
Your fleet is idle. Launch a task to put your agents to work.
+ New Task
FleetActivityReviewSettings
9:415G ●
Syndic
3 Active
2 Review
1 Blocked
LUNA
Phase 3B
● running
Phase 2 — Auth
● review
APEX
Fix Redis Pool
● running
Update CI Config
↳ merged
FleetActivityReviewSettings
9:415G ●
Syndic
3 Active
2 Review
1 Blocked
▽ Filtered: Review ✕
LUNA
Phase 2 — Auth
● review
APEX
Fix Redis Pool
● review
FleetActivityReviewSettings
· Parallel execution across repos — no bottlenecks
· Each agent is isolated: own branch, own worktree
· Choose the right CLI for each task
· Budget guardrails so costs never surprise you
CLIs
Your favorite coding agents baked in
Run Claude on one task, Codex on another. Spread cost across providers. Swap CLIs without changing your workflow.
3:105G ●
AI CLIs
Claude Code
● ready
›
Codex CLI
● needs auth
Run codex login on server
›
GITHUB
humzakhan
● Scopes: repo
Rate limit: 4,998 remaining
›
SECURITY
87
/100 · 7/8 checks passed
3:105G ●
← Claude Code
Claude Code
2.1.89 (Claude Code)
● Ready
Usage
Settings
MODEL
Default model
Used for new workspaces
Sonnet 4.6
Thinking mode
Extended uses more tokens
Auto
Review model
Used for code review
Sonnet 4.5
SESSION DEFAULTS
Start in plan mode
Agent plans before executing
Compact mode
Tips card + idle warnings
Max turns
Per session limit
200 ›
3:115G ●
Syndic
All 4
0 Active
New Task
Cancel
HARNESS
Claude Code
2.1.89 · Ready
Claude Code
Selected ▲
↗ Launch Task
☰ Advanced
· Claude Code, Codex, OpenCode — all supported
· Mix and match CLIs across tasks and repos
· Rotate between API subscriptions to manage spend
Review · Merge
PR lands. You review the diff. You merge. All from your phone.
Syndic pulls the diff when the PR opens. File-by-file. Tap to approve, confirm to merge. Done before you finish your coffee.
9:415G ●
Merge PR #8
● CI PASSING
feat: add auth middleware · luna · 22 commits
MERGE STRATEGY
● Squash and merge
Combine all commits into one
○ Merge commit
○ Rebase and merge
⊡ Face ID required to confirm merge.
↗ Confirm Merge
9:415G ●
← routes/auth.ts Line 21 selected
18 req: Request, res: Response, next: ...
+ const token = req.headers.authoriza...
21 | if (!token) return res.status(401)
+ await verifyJWT(token, process.env....
+ next()
Should we return a 403 here instead of 401?
Good point — 401 is correct here since the token is missing entirely.
MarkdownCancelPost
↗ Merge
1 Comment
✕ Reject
9:415G ●
← PR #8 · 3 files
◫ routes/auth.ts
+48 -12
File 1 of 3 · 3 hunks ‹ › ≡
@@ -14,8 +14,12 @@ import { db } from...
14 import { Request, Response } from '...
15 import { z } from 'zod'
+ import { verifyJWT, signJWT } from ...
+ import { rateLimit } from '../middl...
17 export const authMiddleware = async...
18 req: Request, res: Response
+ req: Request, res: Response, next: ...
+ ) => {
+ const token = req.headers.authoriza...
19 ) => {
20 const t = req.query.token as string
21 if (!token) return res.status(401)
+ await verifyJWT(token, process.env....
+ next()
↗ Merge
◻ Comment
✕ Reject
FleetActivityReviewSettings
9:415G ●
Review
2 PR
Phase 2 — Auth + CRUD
PR #8
luna · 22 commits · 3 files · 18m ago
✓ Tests passing ✓ CI green
+187 -34feat/auth
↗ Merge
✕ Reject
Fix Redis Pool
PR #9
apex · 4 commits · 1 file · 1h ago
↻ CI running...
+24 -8fix/redis
FleetActivityReviewSettings
· Full diff viewer with syntax highlighting
· Inline comments the agent picks up
· CI status at a glance
· One-tap merge (squash, rebase, or merge commit)
· Post-merge: chain the next task immediately
Logs & Debug
Something broke. You already know why.
Server logs, live on your phone. Spot crashes, failed tests, timeouts — search, fix, done. No laptop, no SSH.
12:565G ●
← Activity Monitor
syndic-betaup 5d 18h 12m
CPU
Usage
0.6%
MEMORY
DISK
NETWORK
↓ In
0 MB/s
↑ Out
0 MB/s
PROCESSES
Running
2
Total
133
12:565G ●
← Logs
● live
⌕ Search logs...
07:13:13 [info] provider_health_check...
07:13:13 [debug] codex_api_key_check...
07:18
07:18:14 [debug] claude_credentials...
07:18:14 [info] provider_health_check...
07:22
INFO: 47.83.221.47 – "GET / HTTP/1.1" 404
INFO: 47.83.221.47 – "GET /favicon.ico" 404
07:23
07:23:15 [debug] claude_credentials...
07:23:15 [info] provider_health_check...
07:28
07:28:15 [debug] codex_api_key_check...
07:28:15 [info] provider_health_check...
● journalctl -f · 92 linesPause
FleetActivityReviewSettings
· Live log streaming — every event, as it happens
· Search across all output instantly
· See the full error trail, not just a notification
· Retry failed tasks directly from the log view
Security
Your agents run in your cloud. Your keys never leave it.
Your VM, your keys, your code. No cloud relay, no intermediary. Syndic scans your server on a schedule and shows the results on your phone — so you catch issues without SSH-ing in.
· Zero data on external servers — there are no external servers
· Automated security scans, results on your phone
· Certificate, firewall, and port checks on a schedule
· Direct phone-to-server connection over TLS
· QR code pairing — single-use token, expires in 5 minutes
· Biometric app lock
Architecture
Split-brain: the server runs the agent fleet, the phone is a stateless remote control. No intermediary. No cloud relay. Direct connection.
E2E encrypted
No telemetry
No analytics
No tracking
Get Started
Running in under a minute.
One command to install. One QR code to pair your phone. That's it.
$ curl -fsSL https://get.syndic.dev | sh
$ syndic init
· Install the server daemon on any Linux VM
· Scan the QR code with the mobile app
· Add your repos and API keys
· Dispatch your first agent
You've seen the app. Now run it on your server.
Free to start. AGPL backend. No account required.
★ Star on GitHub Read the DocsBudget
Know what your agents cost — before it surprises you.
Track spend by day, week, and month. See exactly which agents are burning through tokens.
9:415G ●
‹ Settings Usage
Claude
Max 5×
Session
94% CriticalRuns out in 6m
Weekly
88%Runs out in 2h
Extra usage
$27.60$30 limit · near cap
Today
$89.20
188M tokens
Last 30 days
$3,812.44
7.8B tokens
9:415G ●
‹ Settings Usage
Claude
Max 5×
Session
51%Resets in 2h 27m
Weekly
60%1% in deficit
Extra usage
$10.54$30 limit
Today
$45.16
95M tokens
Yesterday
$30.86
69M tokens
Last 30 days
$2,202.78
3.7B tokens
· Daily, weekly, and monthly spend tracking
· Breakdown by provider: Anthropic, OpenAI eyc
· Set budget caps — agents pause when limits hit
Settings
Your server, your rules.
Self-hosted configuration for AI coding agents
Configure repos, API keys, default CLIs, notification preferences, and pairing — all from your phone.
12:585G ●
← hone
H
hone
github.com/humzakhan/hone.git
⑂ main
SCRIPTS
Setup script not set
Runs once when a worktree is created
AGENT INSTRUCTIONS
Pre-task instructions
Prepended to every new task
⌄
Review instructions
Sent to agent at review pass
⌄
REPOSITORY
Default branch
main ›
⊘ Remove Repository
12:595G ●
← Claude Code
✦
Claude Code
2.1.89 (Claude Code)
● Ready
Usage
Settings
MODEL
Default model
Used for new workspaces
Sonnet 4.6
Thinking mode
Extended uses more tokens
Auto
Review model
Sonnet 4.5
SESSION DEFAULTS
Start in plan mode
Compact mode
Max turns
200 ›
12:585G ●
Settings
APPEARANCE
◎
Theme
Ash
›
REPOSITORIES
hone
● main · 1 active tasks
/var/syndic/repos/hone
humza-website
● main · 0 active tasks
+ Add Repository
AI CLIS
✦
Claude Code
● ready
›
◈
Codex CLI
● needs auth
›
FleetInboxReviewSettings
· Manage repos and branches
· Add and rotate API keys
· Set default CLI per repo
· Pair new devices via QR code
Pricing
Ship more. From anywhere.
Run the server free. Pay only for the mobile experience.
Free
$0 / forever
Everything you need
to start dispatching.
to start dispatching.
- 2 repositories
- 4 concurrent agents
- Dispatch, monitor, review
- Diff viewer + merge
- Push notifications
- Voice dispatch
Pro
$59
Everything in Free, plus full
control over your fleet.
control over your fleet.
- Unlimited repos + agents
- Terminal access to your VM
- CLI usage + settings
- Activity monitor
- Audit log
- iOS widget
- Apple Watch widget
- Offline queue
- Priority support