Status: implemented. See
server/routes/openclaw.js,server/integrations/openclaw/api.js,client/src/pages/OpenClaw.jsx, and the client serviceclient/src/services/apiOpenclaw.js(not the proposedopenclaw.js). The shipped endpoint surface differs from this proposal:GET /api/openclaw/status,GET /api/openclaw/sessions,GET/POST /api/openclaw/sessions/:id/messages, and streamingPOST /api/openclaw/sessions/:id/messages/stream. The proposedPOST /sessions,GET /jobs,GET /subagents, andPOST /context/composewere not built.
A generic, first-party operator chat surface inside PortOS that allows a user to communicate with a local or privately reachable OpenClaw runtime without relying on third-party messaging providers like Telegram.
PortOS is already reachable over Tailscale and is intended to be a secure, self-hosted operating surface. For sensitive operator work, routing chat through Telegram or another third-party messaging network adds avoidable privacy and security exposure.
This feature adds a generic assistant/operator chat module to PortOS so users can:
- chat with their assistant directly inside PortOS
- inspect session state without leaving the app
- keep sensitive machine/admin context off third-party transports
- use PortOS as a first-party local operator console
PortOS is a public open-source project used by many people.
Therefore:
- do not bake any private assistant identity into product features
- do not assume one specific assistant persona or relationship model
- do not assume one specific machine/network topology
- do not assume OpenClaw is always present
This feature must remain:
- generic
- optional
- instance-configurable
- safe for users running their own OpenClaw or no assistant at all
Identity, assistant naming, local network details, and machine-specific behavior must live in local/private configuration or git-ignored instance data.
This should be presented as something like:
- Operator Chat
- Assistant Console
- OpenClaw
- Runtime Chat
Not:
- a hardcoded persona name
- a product-level "Rowan" feature
- a fixed Chief-of-Staff replacement
- Provide a first-party chat UI inside PortOS for talking to an assistant/runtime.
- Reduce reliance on Telegram for operator/admin conversations.
- Keep the feature generic enough for any PortOS instance to connect to its own OpenClaw deployment.
- Preserve clean boundaries between:
- PortOS UI
- assistant runtime
- private instance config
- Make chat adjacent to PortOS state, apps, repos, tasks, and services.
- replacing all external messaging integrations
- embedding assistant identity into PortOS core
- making PortOS depend on OpenClaw to function
- exposing private machine details through public/open-source defaults
- coupling this feature tightly to one user's workflow
PortOS already has several relevant building blocks:
client/src/pages/ChiefOfStaff.jsxclient/src/components/cos/*- existing tabbed operational UI patterns
- event logs, terminal-style panels, status indicators
client/src/services/socket.jsuses relative paths and is already Tailscale-friendlyserver/index.jsalready mounts Socket.IO and API routes for local/private access
- CoS page and agent runner already model:
- status
- running jobs
- event streams
- agent outputs
server/cos-runner/already provides a process/runtime management pattern
client/src/pages/Messages.jsxserver/routes/messages.js- existing draft/message/thread models can inform UX, even if operator chat is a separate domain
- PortOS already assumes trusted-network/private access via Tailscale
- this is compatible with a local-first assistant console
- operator UI
- session list UI
- message history UI
- context attachment UX
- runtime connection status
- local authentication to PortOS itself
- optional linking between chat and PortOS pages/apps/tasks
- session runtime
- message handling
- tool execution
- subagent/session orchestration
- response generation
- runtime-side security/policy enforcement
PortOS should talk to OpenClaw through a small adapter/integration layer, not by reimplementing assistant logic.
Suggested shape:
- server integration module
server/integrations/openclaw/*
- PortOS API routes
server/routes/openclaw.js
- client service wrapper
client/src/services/openclaw.js
- UI page
client/src/pages/OpenClaw.jsxorclient/src/pages/OperatorChat.jsx
A page inside PortOS where the user can:
- see whether an OpenClaw runtime is configured/reachable
- view available sessions or a default session
- load recent message history
- send a message
- receive assistant replies
- see timestamps and basic status
Suggested features:
- session selector
- message timeline
- input composer
- connection status badge
- send/receive loading states
- optional "reply in current session" mode
Allow the user to send a message with attached PortOS context such as:
- current page/app
- selected repo/app
- active task
- system status summary
- current machine/app metadata
Examples:
- "look at this app"
- "review the current queue"
- "inspect the service behind this page"
- "summarize what changed here"
This context should be explicit and user-controlled, not silently leaked.
Expose runtime information such as:
- connected runtime endpoint
- active sessions
- spawned subagents/jobs
- recent tool actions
- execution status
- reminders/cron job visibility if supported
This should feel like an operator console, not just a basic chat box.
Optional future capabilities:
- ask assistant to inspect a repo and open linked results
- pass page context to assistant with one click
- show inline approvals/review items
- link assistant output to Review / Goals / Apps / Brain surfaces
- generic OpenClaw connector support
- generic UI for assistant/runtime chat
- generic settings for endpoint/auth/session behavior
- generic local data storage hooks
- assistant identity/persona
- local machine topology
- hostnames, ports, URLs, tokens
- role preferences
- private operator notes
- machine-specific context mapping
- no private assistant identity in product defaults
- no machine-specific hostnames or ports in committed code/docs beyond generic examples
- no assumptions about Telegram or other third-party transports
- no assumptions that all users want autonomous operator chat
- fail gracefully when OpenClaw is unconfigured or unreachable
PortOS can expose generic settings like:
{
"enabled": true,
"provider": "openclaw",
"transport": "http",
"sessionMode": "default",
"allowContextAttachments": true,
"showRuntimeStatus": true
}Actual endpoint/auth/session defaults should live in local, git-ignored config, for example:
{
"enabled": true,
"baseUrl": "http://100.x.x.x:PORT",
"authToken": "...",
"defaultSession": "main",
"label": "Local Operator Runtime",
"paths": {
"toolsInvoke": "/tools/invoke",
"responses": "/v1/responses"
}
}The exact file/location should align with PortOS local config conventions, but must remain out of public repo defaults if it contains private topology or credentials.
These would be PortOS routes that proxy or adapt to an OpenClaw runtime.
GET /api/openclaw/status- runtime reachable?
- configured?
- default session?
GET /api/openclaw/sessionsGET /api/openclaw/sessions/:id/messagesPOST /api/openclaw/sessions/:id/messagesPOST /api/openclaw/sessions- create or bind a new operator session if needed
GET /api/openclaw/jobsGET /api/openclaw/subagentsPOST /api/openclaw/context/compose- build a safe context bundle from current PortOS state
These should remain thin adapters where possible.
A new page such as:
/openclaw/operator-chat/assistant
I recommend /openclaw or /operator-chat.
- runtime status
- session list
- quick actions
- optional recent tasks/subagents
- message timeline
- streamed assistant replies
- tool activity summaries (optional)
- context chips
- current page/app context
- recent system events
- inspectable attachments
- chat should feel calm and operational, not social-media-like
- context attachments should be explicit
- runtime status should be visible
- errors should be actionable
- chat must not block normal PortOS use
Relationship:
- CoS remains an autonomous/managed system surface
- OpenClaw chat is a direct operator conversation surface
Possible links:
- "Ask about this CoS task"
- "Open in Operator Chat"
- "Send BTW / additional context"
Relationship:
- Messages page manages external communications/accounts
- OpenClaw Operator Chat is an internal/local console
This distinction should stay clear in the UI.
Assistant outputs that need human attention could eventually create Review items.
These are strong context sources for chat attachments and operator actions.
- OpenClaw unreachable
- OpenClaw configured incorrectly
- runtime session missing/expired
- streaming disconnects
- PortOS page context too large/noisy
- user accidentally sharing more context than intended
- partial feature deployment on instances without OpenClaw
If OpenClaw is not configured:
- hide the page by default or show a setup screen
- do not break PortOS navigation
- do not throw noisy errors in unrelated pages
If runtime is unavailable:
- show disconnected status
- preserve local UI state where possible
- allow retry/reconnect
- confirm PortOS route/page placement
- confirm local config pattern
- confirm whether proxying through PortOS server is preferable to direct browser calls
- add OpenClaw integration module
- add status/session/message proxy routes
- keep adapter minimal
- session list
- message timeline
- composer
- status badge
- current page/app/task context chips
- explicit attach/send flow
- subagents
- jobs
- session status
- linked review actions
-
Keep the product generic
- no private assistant identity in public code
-
Use local/private config for identity and topology
- assistant name, endpoint, role, machine map stay local
-
Proxy through PortOS server first
- keeps auth/config simpler
- avoids browser-side exposure of private runtime details
- fits existing PortOS API patterns
-
Do not merge this into Messages
- operator chat is a different domain than email/SMS/Telegram messaging
-
Keep OpenClaw optional
- PortOS must still work cleanly without it
-
Should OpenClaw chat live as a top-level page or under Chief of Staff?
- My recommendation: top-level page or top-level tool, not hidden under CoS
-
Should PortOS support multiple runtimes or one default runtime first?
- My recommendation: one default runtime first, design for future plurality
-
Should chat sessions be created/managed by PortOS or discovered from OpenClaw?
- My recommendation: discover existing sessions first, optionally allow PortOS to create a dedicated operator session
-
Should tool activity be shown in the timeline from the start?
- My recommendation: basic status first, detailed tool activity later
- this feature spec
- PortOS extension-point audit
- minimal server-side OpenClaw adapter
- minimal
/openclawpage - local private config example (git-ignored)
PortOS should gain a generic, optional, first-party OpenClaw operator chat surface so users can communicate with their assistant/runtime directly over their private network instead of depending on Telegram.
That feature should be:
- generic in product code
- private in identity/config
- optional per instance
- aligned with existing PortOS CoS, socket, and Tailscale architecture