Project Info
Inspiration
Vibe coding is changing how we build software, but it still keeps us tied to the desk. We were inspired by physical AI coding controllers that make agent activity feel tangible, and asked: what if those controls moved with us on devices we already carry?
What it does
Vibe Signal connects Codex to an iPhone and Apple Watch. It displays the agent’s live state—idle, working, waiting, completed, or error—and uses colors and haptics to make each state recognizable at a glance. From the Watch, users can approve or deny requests, continue or retry a turn, stop an active task, and send new prompts by voice. Pairing requires only a QR scan, and communication stays on the local Wi-Fi network.
How we built it
We built Vibe Signal as three connected layers: A TypeScript VS Code extension receives Codex lifecycle events through hooks. A local WebSocket server converts those events into a consistent state protocol and accepts remote commands. Native SwiftUI apps for iPhone and Apple Watch display status and send actions back through WatchConnectivity. The iPhone acts as the bridge between the desktop and Watch. Pairing data includes the computer’s local address, port, and authentication token. Voice recordings travel from the Watch to the iPhone for transcription, then return to Codex as prompts.
Challenges we ran into
The hardest challenge was making several systems behave like one reliable product. Codex hooks, WebSockets, iOS background execution, WatchConnectivity, speech recognition, audio playback, and Xcode signing all have different lifecycle constraints. We had to handle stale state, reconnect dropped sockets, prevent duplicate commands, keep the iPhone bridge active in the background, and make audio continue after the Watch screen dims. We also worked through delayed Watch file transfers, speech-recognition timing, and compatibility with older generated Xcode projects.
Accomplishments we're proud of
We are most proud that Vibe Signal closes the complete coding loop from the wrist. A user can describe a change by voice, send it to Codex, follow the agent’s progress, respond when it needs input, and receive the result without returning to the computer. We also built a local-first architecture with QR pairing, token authentication, live state synchronization, background connectivity, distinct haptics, and high-quality spoken responses.
What we learned
We learned that a useful AI companion does not need to reproduce the entire desktop interface. A small number of clear states and contextual actions can communicate what matters while reducing distraction. We also learned how important lifecycle design is across Apple devices. A connection that works while both apps are open is only the beginning; background suspension, audio sessions, network changes, and delayed Watch transfers must all be treated as normal operating conditions.
What's next
Next, we want to add a secure cloud relay so Vibe Signal can work beyond the local Wi-Fi network. We also plan to support more coding agents, multiple computers, richer notifications, Dynamic Island and Live Activities, and a macOS menu bar companion. The larger vision is to make agent state available wherever the developer is—not by turning every device into a remote desktop, but by delivering the right signal and controls at the right moment.
Vibe Signal
Let your AI coding agent stay connected when you leave the desk.
Vibe Signal is a companion system for AI coding agents. A VS Code extension watches Codex via lifecycle hooks, pushes live status over the local Wi‑Fi to your iPhone, and mirrors it to Apple Watch with haptics and Approve / Continue / voice controls.
Codex CLI ──hooks──► VS Code Extension (connector)
│
WebSocket (same Wi‑Fi)
│
iPhone
│
WatchConnectivity
│
Apple Watch
See PROTOCOL.md for the wire formats.
How we used Codex and GPT-5.6
Codex powers the product
Vibe Signal is built directly around the Codex CLI. Codex lifecycle hooks such as SessionStart, PostToolUse, PermissionRequest, and Stop are translated into a small set of live states that can be understood at a glance. When Codex needs input, Vibe Signal sends the decision back from the iPhone or Apple Watch. Voice prompts can also start or continue a Codex turn, completing the loop from wrist to coding agent.
This is more than a status display: Codex is the active agent behind the experience, while Vibe Signal provides a mobile control and notification layer around it.
GPT-5.6 helped us build it
We used GPT-5.6 in Cursor as an engineering collaborator throughout development. It helped us:
- Design the local-first architecture and shared WebSocket protocol
- Implement the TypeScript VS Code connector and native SwiftUI apps
- Debug state synchronization across Codex, iPhone, and Apple Watch
- Work through iOS background execution, WatchConnectivity, speech, and audio lifecycle issues
- Create tests, refine the demo flow, and document the project
GPT-5.6 was especially valuable when changes crossed multiple platforms. It could reason about the connector, protocol, and Apple clients together instead of treating each component as an isolated codebase.
Built with
TypeScript, Node.js, Swift, SwiftUI, iOS, watchOS, Apple Watch, VS Code Extension API, Codex CLI, GPT-5.6, WebSockets, WatchConnectivity, AVFoundation, Speech Recognition, UserNotifications, URLSession, QR pairing, Xcode, and XcodeGen.
Repo layout
| Path | Role |
|---|---|
connector/ | VS Code extension — local HTTP + LAN WebSocket + Codex hook installer |
app/ | SwiftUI iPhone + Apple Watch sources (build on a Mac) |
PROTOCOL.md | Shared message contracts |
MVP features
- Red / yellow / green status on Watch and iPhone (
working/waiting/completed) - Distinct haptics per state change
- Approve / Deny for Codex
PermissionRequest - Continue / Retry / voice prompt after
Stop - Same-WiFi realtime sync via QR pairing
1. Desktop connector (VS Code)
Requirements
- Node.js 18+
- VS Code (or Cursor with VS Code extension compatibility)
- Codex CLI with hooks enabled
Install / run from source
cd connector
npm install
npm run compile
In VS Code: Extensions → … → Install from VSIX… after packaging, or use the Extension Development Host:
- Open the
connectorfolder in VS Code - Press
F5(Run Extension) - In the Extension Development Host, confirm the status bar shows
Vibe Signal: idle
Sidebar UI
Click the Vibe Signal pulse icon in the Activity Bar:
- Toggle Connector On/Off (server only listens when On)
- Live state, detail, client count, host:port, token, health URL
- Buttons for pair QR, copy pairing JSON, Codex hooks, simulate, rotate token
Status bar shows Off / current state; click it to open the sidebar.
Useful commands
| Command | Purpose |
|---|---|
| Vibe Signal: Toggle Connector | Enable / disable the LAN server |
| Vibe Signal: Open Sidebar | Focus the Vibe Signal panel |
| Vibe Signal: Pair Device | QR webview for iPhone |
| Vibe Signal: Setup Codex Hooks | Merge hooks into ~/.codex/hooks.json |
| Vibe Signal: Simulate Event | Drive states without Codex |
| Vibe Signal: Copy Pairing Info | Copy host/port/token JSON |
| Vibe Signal: Show Status | Modal status dump |
Settings (agentpulse.*):
port(default8787)permissionTimeoutMs(default120000)stopTimeoutMs(default60000)
Dev harness (no VS Code)
cd connector
npm run compile
# PowerShell
$env:AGENTPULSE_TOKEN='test-token-mvp'; node scripts/dev-server.js
# then
node scripts/ws-client.js 127.0.0.1 8787 test-token-mvp
2. Wire Codex hooks
- Start the extension (so the port is listening).
- Run Vibe Signal: Setup Codex Hooks.
- This copies
hooks/hook.js→~/.agentpulse/hook.jsand merges Vibe Signal entries into~/.codex/hooks.json. - In Codex CLI, run
/hooks, review, and trust the Vibe Signal command hooks. - Start a Codex turn — status should move to working, approvals to waiting, finish to completed.
Without trust, Codex skips the hooks silently.
Cancel in MVP = Deny a pending permission request (Codex has no interrupt-via-hook).
3. iPhone + Apple Watch app
Sources live under app/. They must be compiled on a Mac with Xcode 15+ (iOS 17 / watchOS 10).
Generate the Xcode project
# on macOS
brew install xcodegen # once
cd app
xcodegen generate
open VibeSignal.xcodeproj
Xcode steps
- Select your Team under Signing for both
VibeSignalandVibeSignalWatch. - Set a unique bundle id if
com.vibesignal.appis taken. - Run the VibeSignal scheme on a physical iPhone (camera + local network; Watch optional).
- Install the Watch app from the Phone’s Watch app if needed.
Pairing
- On desktop: Vibe Signal: Pair Device.
- On phone: scan the QR (or paste JSON / enter host + port + token).
- Phone and desktop must be on the same Wi‑Fi. Status becomes Live.
- Watch updates automatically via WatchConnectivity while the iPhone app is paired/reachable.
Permissions
- Camera (QR)
- Microphone + Speech (voice prompts)
- Local Network (LAN WebSocket)
States & controls
| State | Color | Typical trigger | Watch actions |
|---|---|---|---|
| Working | Red | Session / prompt / tool use | Mic |
| Waiting | Yellow | PermissionRequest | Approve / Deny |
| Completed | Green | Stop | Continue / Mic |
| Error | Orange | Best-effort non-zero Bash | Continue / Mic |
Haptics: start (working), triple notification (waiting), failure (error), success (completed).
Phase 2 / 3 (not in MVP)
Dynamic Island, menu bar app, cloud relay, internet remote, multi-device.
License
MIT (or your choice once published).
Analysis
View
Metric
- 41
- 10
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- HTMLIn code
- JavaScriptIn code
- SwiftIn code
- TypeScriptIn code
- Node.jsClaimed
4 of 5 appear in the indexed code. 1 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
- CursorCommits
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
257 KB
Source files
41
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
TangyrenMidKing/vibe-signal
98 files · 38.7 MB · @ 72b7a29
Structure
Interface
28 files · 29%Screens, components and styles rendered to the user.
Application logic
16 files · 16%Domain rules, services and shared utilities.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- Swift43%
- TypeScript30%
- Markdown10%
- JavaScript8%
- HTML8%
- YAML1%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
connector/package.json
npm · 5- ws
- +4 more
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.