Project Info
Inspiration
Life moves fast. I have work, personal responsibilities, ideas, tasks, and projects all competing for attention. I kept losing track of what needed to be done, forgetting why a decision was made, or coming back to a project with no memory of where I stopped. I did not want another chatbot that starts from zero every time. I wanted a daily organizer I could talk to naturally: one that remembers my notes and projects, manages the things I need to do, and takes real work off my plate. Voice was essential because explaining a busy day out loud is much easier than typing every detail. That need became OpenAssist: a personal agent on my Mac that organizes my life, remembers context, and keeps work moving. I built it alone, and I use it every day.
What it does
OpenAssist brings live voice, a daily planner, projects, notes, long-term knowledge, and real agent work into one macOS app. Talk naturally from anywhere. A global shortcut starts Live Voice without making you stop what you are doing. Manage everyday life. Tasks, backlogs, reminders, daily focus, notes, and recurring work. Keep project context. Conversations, notes, decisions, and progress stay connected to projects, so the assistant can answer where a project stands and what is still needed. Remember useful history. It recalls completed conversations and saved knowledge instead of treating every session as a blank page. Delegate real work. When a request needs more than a quick answer, OpenAssist hands the task to a Codex agent, keeps the voice conversation going while it runs, and brings the finished result back into the same conversation. Use the computer itself. Through Codex Computer Use, the agent can open Mac apps and do the work directly. In the demo video it opens TextEdit and types a launch checklist by itself, recorded live. Analyze the screen. Screen Analysis reads whatever is on screen and helps on the spot: improve a draft, answer a question, insert text at the cursor. It is temporary by design: sessions are not kept in your notes, threads, or memory. Work across the Mac. With approval, it can use a signed-in browser and supported macOS apps such as Finder, Terminal, Calendar, Reminders, Contacts, Notes, Messages, and System Settings. Stay available on the phone. A companion iPhone app gives access to the planner, reminders, notes, projects, and assistant threads connected to the Mac. Keep the user in control. Important actions go through approval steps, and local settings, history, and memory stay on the Mac. A typical flow is conversational: I ask it to add something to my day, recall an older decision, check something on my computer, or delegate a longer task. It tells me when an agent is working, waits for the job to finish, and then speaks the result back. How I built it The engine underneath is the official Codex app server. OpenAssist runs it as the backend brain: chat turns, delegated agent jobs, and Computer Use all run through it, while Live Voice talks to the Realtime API directly. Computer Use comes from Codex's bundled plugin, so the same agent that answers questions can also operate the Mac. The desktop app is Electron, React, TypeScript, Node.js, and Vite. A native Swift helper handles the global keyboard shortcut and macOS-level voice and system integration. Live Voice connects to the OpenAI Realtime API (or Gemini Live) over WebSockets, and a routing layer decides whether a request can be answered directly, needs an OpenAssist tool, or should become a full Codex agent job. For longer tasks, OpenAssist creates the job, keeps the voice session informed while it runs, and returns the result as a natural spoken answer. Memory is deliberately small. Finished text conversations land in the Voice Log, and a short history is restored when a new session begins. Raw audio, partial transcripts, and provider events are never stored. The planner, reminders, notes, projects, approvals, and personal knowledge all live in the same app, and the iPhone companion (React Native and Expo) connects securely to the desktop. Challenges I ran into The hardest part was making voice feel like a dependable assistant instead of a voice skin on top of chat. I had to handle interruptions, microphone echo, repeated responses, reconnects, incomplete audio, and clear states for listening, speaking, delegating, and waiting. Agent handoff was tricky: the voice model must not guess an answer while a real agent is still working. OpenAssist pauses the answer, shows progress, waits for the delegated task, and then speaks the real result. Some bugs were humbling. At one point every Codex turn started silently returning nothing; my installed CLI had quietly fallen behind what the model required on the server side, and the error was swallowed. Another bug in my own cleanup code was killing live Computer Use helpers a few minutes after startup. Finding those taught me more about the app server's process model than any documentation. Computer access also needs trust, so conversation is separated from sensitive actions, and important changes ask for approval first. Accomplishments that I'm proud of A global voice shortcut that starts OpenAssist from any app. A complete voice-to-agent-to-spoken-result loop, shown with real footage in the demo video. Computer Use working end to end: ask, watch the agent operate a Mac app, and get the report back. Same-thread voice continuity across stop, start, and app restart. One connected system for tasks, reminders, notes, projects, knowledge, and agent work. A floating voice interface that shows listening, speaking, delegation, approvals, and errors without opening the main window. A phone companion that keeps the organizer available away from the desk. What I learned A useful personal assistant needs more than a capable model. It needs reliable state, carefully chosen memory, clear progress, safe approvals, and the patience to wait for real work to finish. Voice also changes the product. People speak with less structure than they type, so the system has to understand intent, preserve context, and make its current state obvious without interrupting the conversation.
What's next
Simpler setup and onboarding, better cross-device reliability, more skills and integrations, stronger project summaries and personal recall, and a more proactive daily organizer that still keeps the user in control.
OpenAssist
OpenAssist is a voice-first personal AI assistant for macOS and iPhone. It keeps daily tasks, reminders, notes, projects, and AI agent work in one place.
Daily Workspace and WebMCP
Public judge demo: openassist-daily-workspace.developingadventures.chatgpt.site
Public source: github.com/manikv12/OpenAssist
The new apps/workspace-site is a professional browser workspace for Gmail, Tasks, Calendar, notes, memory, accounts, activity, and a synthetic Shopify supply catalog. Its private judge demo gives each judge a separate 24-hour synthetic Cloudflare workspace and cart pointer that they can safely edit through the UI or WebMCP. Owner-only Live mode remains connected to the existing OpenAssist Workspace MCP and Composio; private Google data is never copied into Demo mode.
It exposes 29 judge-visible WebMCP tools that ChatGPT's in-app browser and the same-page voice agent can use. Live owner mode registers 14 additional Second Brain tools, for 43 shared definitions in the Site/voice contract. Every user or external write opens an exact, two-minute preview; destructive actions always require an on-screen tap. Private Google content is not copied into the Site database. The Shopify showcase can search products, return their images, inspect policies, and prepare a judge-isolated cart, but it never exposes checkout, payment, or order tools.
Owner Second Brain
The owner-only Work view keeps durable projects, research, decisions, future work, and agent results as indexed Markdown in the selected Google Drive. New content is organized under OpenAssist/Second Brain, while Cloudflare D1 stores only pointers, hashes, leases, policies, and sync status. Quick Capture can send an idea to the general Inbox or directly to a project; it does not create a Google Task until the work becomes an active personal action.
After one approved assignment, an owner-controlled runner can discover queued work, claim it with a short lease, perform one isolated tool-free Codex analysis pass with bounded Second Brain search, and submit a context-based result. It can analyze, draft, and organize, but it cannot edit a repository or browse yet. Agent IDs are routing labels for one trusted owner orchestrator, not separate security identities.
The voice gateway lives in apps/workspace-voice-gateway. The Site opens on a private access screen; judge credentials are supplied only in the Devpost review instructions. A judge never needs Google access or an API key. When the owner enables it, judges can use a short project-funded synthetic voice session. ChatGPT subscription voice and Live mode remain owner-only. The server API key never enters the browser or a Container.
See the architecture and security boundaries, the judge testing guide, the complete under-three-minute video script, the Devpost submission draft, the validation report, and the official-requirements readiness map.
What was added for the WebMCP Challenge
OpenAssist existed before the challenge. The Daily Workspace is a new extension built after the August 25, 2026 challenge start. Starting with commit aff7044, it added the ChatGPT Site, 29 real document.modelContext.registerTool tools, a separate synthetic judge workspace, visible approval previews, the live Workspace bridge, a safe Shopify catalog/cart showcase, and same-page voice-to-WebMCP control. The earlier desktop and Google Workspace features remain separate and unchanged.
Primary app: The supported desktop app is now the React + Electron app in
apps/desktop. The old Swift app is archived inlegacy/swift.
Why I Built It
Life moves fast. I had too many things to do, lost track of why decisions were made, and sometimes forgot work that had already happened.
I built OpenAssist as a daily organizer that I can talk to. It can remember useful context, keep projects organized, manage tasks and reminders, and hand real computer work to an AI agent when a simple answer is not enough.
What Makes It Different
- Live Voice coordinator: Talk naturally through OpenAI Realtime or Gemini Live.
- Real agent delegation: Browser, CLI, repository, logs, and computer tasks can be handed to Codex, Claude, or another selected worker.
- Conversation during work: Voice chat stays available while delegated tasks run in the background.
- Reliable results: OpenAssist tracks each task, reports progress, returns the final answer, and avoids duplicate work.
- Personal Knowledge: Search notes, planner items, reminders, saved memory, and project history when Knowledge access is enabled.
- Daily organization: Manage Today, backlog, categories, projects, tasks, due dates, and timed reminders.
- Notes and project continuity: Keep long-running work connected to the right project and continue from earlier context.
- Approval controls: Important writes and computer actions still use the existing approval rules.
- Global Live Voice: A macOS shortcut can start the floating Live Voice HUD from any app.
- Phone companion: The iPhone app can view and update the same planner, notes, reminders, and voice workflows through the desktop bridge.
GPT-5.6 Build Week Work
The desktop app includes GPT-5.6 Sol, GPT-5.6 Terra, and GPT-5.6 Luna as agent model choices. GPT-5.6 Sol was the daily driver for the real sessions behind this submission, including everything shown in the demo video.
Build Week work (July 13 onward), checked against the commit history and my Codex session logs:
- Made the React + Electron app the primary product and restructured the repository into
apps/desktop, archiving the old Swift app underlegacy/swift. The restructure itself was carried out by a Codex agent. - Updated Live Voice for the new layout: the global shortcut flow, the floating HUD, the Agent Work shelf, and same-thread continuity.
- Built the demo from real sessions, recorded live: voice delegation to a Codex agent, and Computer Use opening TextEdit and typing a launch checklist by itself.
- Fixed reliability bugs found through real daily use: a cleanup routine that was killing live Computer Use helpers, silent empty turns caused by an outdated Codex CLI, and streamed thinking text rendering with dropped words.
- Used it for real work all week on GPT-5.6 Sol: planning notes with diagrams, research comparisons delegated from voice, reminder and memory recall, and filling a browser form through Computer Use.
The Live Voice engineering in this build includes one-owner voice turn routing, a shared task registry with progress, cancellation and duplicate protection, same-thread continuity without saving raw audio, Knowledge routing for notes, reminders, planner data and memory, and the Live Voice HUD with task cards and completion notifications.
OpenAI Realtime or Gemini Live handles the low-latency speech connection. GPT-5.6 is the work agent that reasons over the request and completes delegated tasks.
How Codex Powers OpenAssist
OpenAssist runs the official Codex app server (codex app-server) as its agent engine:
- Chat turns and delegated agent jobs run through the app server, with GPT-5.6 (Sol, Terra, or Luna) as the reasoning model.
- Computer Use comes from Codex's bundled plugin. The agent can open Mac apps and do the work directly; the demo video shows it opening TextEdit and typing a launch checklist by itself, recorded live.
- Live Voice hands bigger requests to a Codex agent, keeps the conversation going while the job runs, and speaks the finished result back in the same session.
- Approvals, sandbox modes, and per-turn plugin selection all map onto the app server's own controls.
Codex was also part of the workflow behind the code: feature work, the repository restructure, and many of the regression scripts in this repo were developed with Codex agents.
How Live Voice Works
Your voice
-> OpenAI Realtime or Gemini Live
-> OpenAssist coordinator
-> direct conversation
-> assistant_capability -> exact local capability
-> assistant_delegate_work -> genuine agent task
-> one clear result in Today Live Voice
Both providers receive the same four-tool surface and use one reducer-owned turn state. Stopping Live Voice closes the microphone and realtime connection. Background work can finish safely, save one FIFO result, and notify you without creating extra visible threads.
Quick Start
Requirements:
- macOS 13.3 or newer
- Node.js 20.19 or newer, or Node.js 22.12 or newer
- Xcode Command Line Tools for the small macOS helper binaries
From the repository root:
npm run setup
npm run dev
Build the desktop app:
npm run build
Package a macOS app:
npm run package:mac
Verify Live Voice
Run the complete Live Voice regression set:
npm run verify:live-voice
Run the desktop build and the Live Voice checks together:
npm run verify
The checks cover coordinator state, capability selection, delegation, task limits, progress, cancellation, continuity, recall, echo protection, identical provider contracts, and exactly-one final-result delivery.
Repository Layout
apps/desktop/ Primary React + Electron macOS app
companion-projects/OpenAssist-Mobile-Remote/ iPhone companion app
legacy/swift/ Deprecated Swift implementation
Start with:
apps/desktop/src/App.tsxfor the React interfaceapps/desktop/electron/main.tsfor Electron and macOS integrationapps/desktop/electron/openassistBridge.tsfor app data and agent workersapps/desktop/electron/liveVoice/for the shared Live Voice coordinator, reducer, capability registry, provider adapters, outbox, and traceapps/desktop/electron/realtimeProxy.tsfor Live Voice transport and compositionapps/desktop/electron/realtimeTaskCoordinator.tsfor delegated-task trackingapps/desktop/docs/live-voice-architecture-plan.mdfor the implemented architecture and invariants
Privacy
- OpenAssist does not save raw Live Voice audio.
- Completed voice text is stored in the existing
Today Live Voicelog. - Knowledge access remains permission-controlled and is never enabled silently.
- API keys and provider sessions use the existing macOS Keychain paths.
- Local data stays under
~/Library/Application Support/OpenAssistunless a cloud provider is selected.
Repository Media
Generated screenshots, capture folders, and submission videos are intentionally ignored by Git. Required app icons, provider marks, and runtime UI assets remain tracked so a fresh clone still builds.
Deprecated Swift App
The Swift implementation is kept only as historical reference. It is not built by the main release workflow and should not be used for judging or new feature work. See legacy/swift/README.md.
Analysis
View
Metric
- 1
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
- CIn code
- CSSIn code
- HTMLIn code
- JavaScriptIn code
- PythonIn code
- ReactIn code
- SwiftIn code
- TypeScriptIn code
- Node.jsClaimed
- OpenAIClaimed
8 of 10 appear in the indexed code. 2 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
- GitHub CopilotCommits
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
23 MB
Source files
483
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
manikv12/OpenAssist
670 files · 90.5 MB · @ a175cfa
Structure
Interface
63 files · 9%Screens, components and styles rendered to the user.
Application logic
286 files · 43%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
- Swift38%
- HTML29%
- TypeScript26%
- CSS5%
- C1%
- Markdown1%
- Other (4)0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
apps/desktop/package.json
npm · 46- @anthropic-ai/claude-agent-sdk
- @google/genai
- @huggingface/transformers
- @liquid-dom/react
- @modelcontextprotocol/sdk
- @tiptap/extension-code-block-lowlight
- @tiptap/extension-image
- @tiptap/extension-placeholder
- @tiptap/extension-table
- @tiptap/extension-task-item
- @tiptap/extension-task-list
- @tiptap/markdown
- @tiptap/pm
- @tiptap/react
- @tiptap/starter-kit
- @types/qrcode
- @vitejs/plugin-react
- framer-motion
- +28 more
legacy/swift/web/chat/package.json
npm · 26- @panzoom/panzoom
- @tiptap/extension-code-block-lowlight
- @tiptap/extension-placeholder
- @tiptap/extension-table
- @tiptap/extension-task-item
- @tiptap/extension-task-list
- @tiptap/markdown
- @tiptap/pm
- @tiptap/react
- @tiptap/starter-kit
- lowlight
- lucide-react
- mermaid
- react
- react-collapsed
- react-dom
- react-markdown
- react-syntax-highlighter
- +8 more
legacy/swift/web/remote/package.json
npm · 12- react
- react-dom
- react-markdown
- react-syntax-highlighter
- remark-gfm
- +7 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.