Replies: 5 comments
-
|
So far Im working entirely in one pr bc I figure I can just run and test in there #3400 Not professional, my apologies, I just really wanted to spearhead such a workflow, been wanting to for months and this project gives the idea actual legs, can scrap it if poorly executed but Ill keep my fork as updated and functional as possible without interfering with the current tickets at bay |
Beta Was this translation helpful? Give feedback.
-
|
I'm looking at #3244 now, just saw it |
Beta Was this translation helpful? Give feedback.
-
|
App Store review surfaced a concrete blocker for the iOS companion that I would like guidance on. Apple rejected Reviewer feedback was that this does not point to a proper public support website, and that a Support URL should not require a user to log in or create an account on a third-party service for non-account-related issues. This seems less like a code problem and more like a product/release expectation problem for a privacy-first self-hosted app. Questions for the community:
My current lean is:
Interested in what people think is the minimal acceptable version versus the long-term right answer. |
Beta Was this translation helpful? Give feedback.
-
|
Scope/alignment note with #3163: I do not see this thread itself as a Stabilization v1 candidate. The stabilization lane should stay on narrow backend/trust-boundary/docs/test work like #3400. This discussion is the separate companion-client/TestFlight/App Store track that should consume that contract once it lands, not widen the core repo scope during stabilization. |
Beta Was this translation helpful? Give feedback.
-
|
Here is the react native mobile app repo |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Why this matters
The current ChatGPT mobile app and Codex-style workflows prove there is real demand for being able to work from a phone while the actual compute and project state live elsewhere. The gap is that those workflows depend on a hosted subscription and a third-party app in the middle.
Odysseus is already aimed at the opposite model: local-first, privacy-first, user-owned orchestration. A mobile companion should extend that: the phone is the control surface, while the user's own Odysseus server, models, tools, and workspace remain the source of truth.
Current status
This is no longer just a hypothetical idea. The mobile companion work is already on a native iOS / App Store-track path:
GET /api/companion/manifestbefore accepting pairing state.So when I say we are basically already in the App Store, I mean this is at the native-app/distribution stage, not the “maybe someday we build a wrapper” stage. The next step is to make the TestFlight/App Store packaging and review story line up with the backend contract and privacy posture.
Backend contract already forming
The companion/backend slice in #3400 gives a clean foundation without adding mobile UI directly to the main repo:
POST /api/companion/pairmints a private pairing token from an admin session.GET /api/companion/manifestadvertises supported features and required scopes./api/chat_stream.That is the right separation: Odysseus core exposes a stable private server contract, and the mobile app consumes it as a separate client.
Remote connection strategy
The simplest recommended remote path should be a private HTTPS transport, not
trycloudflareQuick Tunnels.trycloudflareis useful for quick browser demos, but it is a poor fit for the companion app because Odysseus chat uses Server-Sent Events (/api/chat_stream), and Cloudflare's Quick Tunnel docs currently list SSE as unsupported. Quick Tunnels also use random temporary*.trycloudflare.comURLs, so a pairing QR can become stale as soon as the tunnel process restarts.Recommended order:
COMPANION_BASE_URLto thehttps://<device>.<tailnet>.ts.netURL, then mint a fresh pairing QR.trycloudflare.For any non-LAN transport, the important backend rule is: set
COMPANION_BASE_URLbefore minting the pairing token so the QR advertises the real remote origin instead of a LAN-only host/port.This probably deserves docs and a setup checklist, but not a separate product direction from the mobile companion work.
Tailscale proof from the TestFlight build
These screenshots show the mobile companion being used with Tailscale VPN as the private remote transport. The phone does not need to be on the same LAN as the Odysseus server; it can reach the user's private Odysseus origin through the tailnet while keeping the server off the public internet.
The visible
Chat resume failed: 404is useful follow-up evidence too: remote reachability is working well enough for the mobile app to load and interact with the agent, but stale or expired detached-stream resume should degrade more cleanly on mobile. That should be handled as a resume-state UX/API edge case rather than treated as a VPN/tunnel failure.What the mobile app should become
The first useful version should focus on daily remote control, not every desktop feature:
Longer-term opportunity
The larger unlock is mobile access to long-running autonomous work. I opened a separate discussion for a first-class Pursue Goal mode here: #3585.
If Odysseus has a durable goal runner and the mobile app can start/resume/monitor it, the phone becomes more than a chat surface. It becomes a way to kick off meaningful local work, check progress, approve human-in-the-loop decisions, and come back later without babysitting the desktop.
That could be a real differentiator: local model privacy, owner-controlled tools, and mobile-first control of long-running work.
Open questions
Suggested next step
Keep #3400 focused on the backend/mobile contract. In parallel, treat the Expo / React Native app as the companion client track and work toward a TestFlight-ready build that demonstrates:
Beta Was this translation helpful? Give feedback.
All reactions