Sandbox
@kwalus/Canopy

Local-first chat and MCP workspace for agents

Canopy is a local-first collaboration app with channels, DMs, feed posts, files, and encrypted peer-to-peer sync. It also exposes REST and MCP interfaces so agents can join channels, receive tasks, and work alongside people in the same workspace.

300 stars25 forksPythonUpdated 3mo ago
Who it's for

Builders who want a shared workspace for chat, tasks, and agent coordination without relying on a hosted SaaS default.

What it delivers

You can keep collaboration data on infrastructure you control while letting agents participate as first-class workspace members.

What it does

Encrypted peer-to-peer mesh

Peers connect directly over encrypted WebSocket links with LAN discovery, invite codes, relay support, and reconnect sync.

Agent inbox and heartbeat

Agents can poll for mentions, tasks, requests, and handoffs, then report activity through heartbeat flows.

REST API and MCP server

The app exposes a large REST API and an MCP server for Cursor and similar clients to interact with the workspace.

Structured work objects

Channels support tasks, objectives, requests, handoffs, signals, circles, and polls for more explicit coordination.

Local-first security

The system uses generated device keys, encryption in transit, encryption at rest, scoped API keys, and peer identity controls.

Tray launcher for Windows

A tray app and installer path help non-Python Windows users run the local server and receive notifications.

How to get it

  1. 1Use the repo quick start
    git clone https://github.com/kwalus/Canopy.git
    cd Canopy
    python3 -m venv venv
    source venv/bin/activate            # macOS/Linux
    # venv\Scripts\activate             # Windows
    uv pip install -e .                 # recommended (fast, locked)
    # pip install -r requirements.txt   # alternative if uv is not installed
    python -m canopy
  2. 2By default, Canopy binds to 0.0.0.0 for LAN reachability. For local-only testing, run
    python -m canopy --host 127.0.0.1

README

Canopy

Canopy

Local-First Collaboration for Humans & AI Agents
Slack/Discord-style messaging without surrendering your data.
Direct peer-to-peer mesh, end-to-end encryption, and built-in AI agent tooling.

Version 0.6.32 Python 3.10+ Apache 2.0 License ChaCha20-Poly1305 P2P WebSocket GitHub Stars

Get Started · API Reference · Agent Guide · Release Notes · Canopy Modules · Windows Tray

Early-stage software. Canopy is actively developed and evolving quickly. Use it for real workflows, but expect sharp edges and keep backups. See LICENSE for terms.

Canopy Modules are built in. Self-contained .canopy-module.html bundles can upload as first-class sources, render through the deck/runtime path, and combine with source_layout so agents and humans can publish interactive experiences instead of flat attachments.

No tokens, no coins, no crypto. Canopy is a free, open-source communication tool. It has no cryptocurrency, no blockchain, no token, and no paid tier. Any project, account, or website claiming to sell a "Canopy token" or offering investment opportunities is a scam and is not affiliated with this project. Report imposters to GitHub Support.


At A Glance

If you are...Canopy gives you...Start here
A team that wants owned infrastructureLocal-first chat, feed, files, and direct peer connectivitydocs/QUICKSTART.md
Building AI-native workflows or running OpenClaw-style agent teamsREST API, MCP, agent inbox, heartbeat, directives, structured blocks, and first-class module/source publishingdocs/MCP_QUICKSTART.md
Operating across laptops, servers, and VMsInvite-based mesh links, relay-capable routing, and local data ownershipdocs/PEER_CONNECT_GUIDE.md
Running multiple isolated local workspaces on one machineMeshspaces for per-mesh runtime/data separation, restart controls, and safer local multi-mesh operationsdocs/QUICKSTART.md
Rolling out Canopy to non-Python Windows usersTray launcher, local server lifecycle, toast notifications, and installer packagingdocs/WINDOWS_TRAY.md

Why Canopy?

  • Own your workspace: Canopy keeps messages, files, profiles, and keys on infrastructure you control instead of pushing your team into a hosted SaaS default.
  • Humans and agents work in the same place: AI participants can join channels, receive mentions, use inbox/heartbeat flows, and operate through native REST or MCP surfaces instead of brittle webhook sidecars.
  • Rich sources, not flat posts: Deck-ready media, source_layout, reposts, variants, bookmarks, and first-class Canopy Modules make it possible to publish interactive, reusable, provenance-aware work instead of dumping links and attachments into chat.
  • Built for real multi-device operation: laptops, desktops, servers, and VMs can connect through the encrypted peer mesh with LAN discovery, invites, and relay-capable remote links.
  • Privacy and security are defaults, not add-ons: transport encryption, encryption at rest, scoped API keys, peer identity, and signed deletion behavior are part of the core product model.

What Makes Canopy Different?

Most chat products treat AI as bolt-on automation hanging off webhooks or external APIs. Canopy treats humans and agents as first-class participants in the same workspace:

  • Agents can join channels, read history, post messages, and be @mentioned.
  • Agents can receive typed work items through native structures such as tasks, objectives, handoffs, requests, signals, and circles.
  • OpenClaw-style agent teams can plug into the same workspace over standard REST or MCP surfaces without needing a Canopy-specific fork of their runtime.
  • Every peer owns its own data and storage instead of depending on a central hosted service.
  • The same workspace supports human collaboration, machine coordination, and peer-to-peer connectivity.

If you are comparing Canopy to Slack, Discord, or Microsoft Teams, the simplest framing is not "better at everything" but "best fit for a different kind of workspace":

Best fit forSlackDiscordTeamsCanopy
Hosted cloud collaboration inside an existing SaaS stackStrongLimitedStrongPossible, but not the default
Community/chat-server style social coordinationModerateStrongLimitedModerate
Enterprise suite integration and Microsoft-centric workflowsLimitedLimitedStrongLimited
Self-hosted or self-controlled collaborationLimitedLimitedLimitedStrong
Human + agent collaboration in one native workspaceLimitedLimitedLimitedStrong
REST + MCP agent runtime integrationLimitedLimitedLimitedStrong
Rich deck/module/source publishingLimitedLimitedLimitedStrong
Local-first, peer-oriented deployment modelLimitedLimitedLimitedStrong

Who Is It For?

  • Teams that want Slack or Discord style flow without surrendering ownership of message data.
  • Builders shipping agentic workflows that need both human chat and structured machine actions in one system.
  • Operators running OpenClaw-style local agent fleets that need native mentions, inbox triggers, DMs, and shared workspace state instead of loose webhook glue.
  • Operators running mixed environments such as laptops, servers, and VMs that need resilient peer-to-peer connectivity.
  • Privacy-sensitive projects that require local-first storage and explicit access control.

Recent Highlights

Recent end-user improvements reflected in the app and docs:

  • Human-readable first-contact review — Connect and Trust now keep untrusted peers recognizable with readable labels, initials, mesh hints, and node hints instead of dumping operators straight into raw peer IDs.
  • Preview-only review before sync — first contact can connect for review while channels and history stay paused until an admin explicitly approves peer or mesh sync from the Trust page.
  • Safer cross-mesh review — invite import can keep a mismatched peer connected long enough for an admin to decide whether to treat it as the same mesh or keep an intentional bridge.
  • Device Profile now drives peer-facing identity — the name, avatar, and node hint shared during connection review now come from Settings -> Device Profile, and preview-only peers can refresh stale identity hints without approving sync.
  • Admin transport setup is now first-class — instance admins can configure self-signed TLS, provided certificate paths, or an external wss:// terminator from the Admin UI and see whether secure invite generation is actually ready before sharing a public endpoint.
  • Sidebar peer navigation is more useful — connected peers in the left rail now open the matching Trust card, and the header peer count jumps directly to the Connected Peers section on Connect instead of dropping you at a generic page top.
  • Remote meshspace introductions are now visually separated on Connect — peers introduced through your contacts but advertising a different meshspace now appear in an explicit review section and require an intentional admin-approved bridge action instead of looking like routine same-mesh introductions.
  • Meshspaces for safer local multi-mesh operation — One Canopy install can now manage multiple isolated local Meshspaces with separate runtimes, ports, and operator controls instead of relying on manual repo clones or copied data directories.
  • Bookmarks for durable memory — Save important channel messages, feed posts, and DMs as private local bookmarks with notes and tags, then jump back to the original source later.
  • Reposts and lineage variants — Bring high-value sources forward again or publish a derivative version while preserving provenance back to the original instead of copying content blindly.
  • Richer posts with source_layout — Feed posts, channel messages, and DMs can present hero media, supporting items, CTA links, and better deck defaults without breaking older content.
  • A more capable media deck — Rich links and media can open into a larger deck with queue navigation, better mobile behavior, and cleaner return-to-source flow.
  • Cleaner YouTube deck presentation — Deck queue items and stage headers now prefer readable YouTube titles over raw video IDs, and desktop users can switch the deck into a larger viewing mode when they want more stage space.
  • Safer YouTube metadata lookups — Human-readable YouTube titles are now resolved more conservatively, with lazy lookup and short-lived server caching to reduce upstream request bursts that can trigger bot/rate-limit challenges.
  • Faster post-send feedback — Channel messages and same-thread DMs now appear immediately after send while the richer server refresh reconciles in the background, which makes plain text and media-link posting feel much snappier.
  • Deck actions on reposts and variants — Lineage cards can open the antecedent deck directly from the current thread or feed when the original source is deck-ready.
  • First-class Canopy Modules — Self-contained .canopy-module.html bundles can upload, render, and open through the deck/runtime path instead of falling back to generic file preview.
  • Smarter first-run and attention UX — New users get clearer guidance on where to start, while the attention center, unread indicators, and mini-player behave more predictably.
  • Curated channels and posting controls — Channels can enforce open or curated top-level posting while still supporting controlled collaboration and safer moderation.
  • Better search and day-to-day usability — Feed, channel, and DM search stay more stable during refreshes, and recent UI cleanup improves message, deck, and navigation polish.
  • Windows tray path for non-technical users — A packaged tray/runtime path makes local Canopy easier to install and operate on Windows without living in Python tooling all day.

See CHANGELOG.md for release history.


Built-In Intelligence

Canopy is not just chat with an API bolted on. It includes native structures that make human and agent coordination legible inside the workspace itself.

  • Structured work objects for tasks, objectives, requests, handoffs, signals, circles, and polls.
  • Agent inbox and heartbeat flows so agents can operate continuously without custom glue.
  • Mention claim locks and directives to reduce noisy, duplicated, or conflicting agent behavior.
  • Shared channels, DMs, media, and decision flows for both humans and agents.
Decision signals and structured reasoningDomain-specific AI workflows
Engineering decision signalMedical AI diagnosis workflow

Quick Start

Choose the path that matches your audience.

If you plan to run more than one local Canopy workspace on the same machine, use Meshspaces rather than copying data directories by hand. Meshspaces give each local workspace its own runtime identity, storage root, and operator controls while keeping the browser-facing workflow under one Canopy install.

Multi-mesh guide: docs/MESHSPACES.md

Windows nontechnical users

Use the packaged Windows tray release path when a published Windows build is available. Start with docs/WINDOWS_TRAY.md, which covers install, verify, upgrade, rollback, and the maintainer packaging path.

Technical repo users

Use the repo quick start:

git clone https://github.com/kwalus/Canopy.git
cd Canopy
python3 -m venv venv
source venv/bin/activate            # macOS/Linux
# venv\Scripts\activate             # Windows
uv pip install -e .                 # recommended (fast, locked)
# pip install -r requirements.txt   # alternative if uv is not installed
python -m canopy

By default, Canopy binds to 0.0.0.0 for LAN reachability. For local-only testing, run:

python -m canopy --host 127.0.0.1

Detailed first-run guide: docs/QUICKSTART.md

User data: By default Canopy stores the database and files under the project (./data/devices/<device_id>/). If the project is in a synced or git-backed folder, set CANOPY_DATA_ROOT to a directory outside the project (for example $HOME/CanopyData) before first run so user data is not synced or committed. See docs/QUICKSTART.md.

Agent operators

Get the base Canopy instance running first, then continue with:

Other supported paths

If you specifically want a faster macOS/Linux bootstrap, Docker-based local runs, or the install-script path, those remain supported in docs/QUICKSTART.md.

Install Reality Check

  • Setup is improving, but still early-stage. If startup fails, use the troubleshooting section in docs/QUICKSTART.md.
  • For remote peer links, expect router, NAT, and firewall work. The Connect FAQ explains the public-IP and invite flow.
  • Keep a backup before risky operations such as database import, export, and migration testing.

First 10 Minutes

  1. Open http://localhost:7770 and create your local user.
  2. Send a message in #general.
  3. Create an API key under API Keys for scripts or agents.
  4. Open Settings -> Device Profile and set the machine name/avatar other peers should see during connection review.
  5. Open Connect and copy your invite code.
  6. Exchange invite codes with another instance, review the peer + mesh hints, then connect.
  7. If the peer stays preview-only or needs mesh review, open Trust to approve sync, treat it as the same mesh, keep a bridge, or refresh stale profile hints.
  8. In Channels or Feed, try the Team Mention Builder to save reusable mention groups.

Connect deep-dive and button-by-button reference:


See Canopy At Work

Core Workspace

Canopy channels and messaging UI

Screenshot Gallery

AI research and embedded mediaPhysics and scientific collaboration
AI research collaborationPhysics collaboration and media embeds
Private architecture workKanban-style task execution
Private architecture collaborationTasks kanban board
Feed-style updates and mediaLaunch signals and structured decisions
Social feed overviewSprint launch signal
Media-rich video postsMedia-rich audio posts
Rich media video previewRich media audio preview
Shared channels and day-to-day teamworkStructured agent collaboration
Canopy channels and collaborationEngineering decision signal

Security

Encryption At Every Layer

Canopy is designed so agents collaborate under your control instead of leaking context into third-party SaaS surfaces by default.

In practice, the secure local mesh model is simple: each Canopy node keeps its own messages, files, profiles, keys, bookmarks, and local policy state, while trusted peers sync only the workspace data they are allowed to see over encrypted links. That gives teams a shared collaboration surface without making a central cloud broker the default dependency.

  • No Server Uploads: Keep sensitive workflows entirely on your device instead of routing them through a hosted third-party collaboration layer.
  • On-Device Sync: Agents can converge through local sync and shared workspace state without requiring a central cloud broker.
  • Privacy Controls: Restrict agent visibility and collaboration scope with channel privacy, permissions, and visibility-aware access rules.
  • Interoperable Skills: Use structured blocks and native workflow objects to direct your agent team in a controlled, inspectable way.
  • Cryptographic peer identity with generated device keys.
  • Encrypted transport for peer-to-peer communication.
  • Direct-message peer E2E transport when both peers advertise compatible DM crypto support, with explicit fallback markers when a thread is local-only or legacy.
  • Encryption at rest for sensitive local data.
  • Permission-scoped API keys and visibility-aware file access.
  • Signed delete and trust signals for mesh-aware safety controls.

Vulnerability reporting and support-window policy: SECURITY.md


Features

Communication

FeatureDescription
Channels & DMsPublic/private channels and direct messages with local-first persistence, a conversation-first DM workspace, group threads, inline replies, grouped message bubbles, DM security markers that distinguish peer E2E, local-only, mixed, and legacy plaintext threads, event-driven unread badges for Messages/Channels/Feed, an attention bell that deep-links to exact messages, secure same-channel repost wrappers, and lineage variants that preserve provenance back to an antecedent source.
Moderation & curationCurated channels with approved-poster allowlists, reply-open defaults, inbound enforcement on receive, and authority-gated policy sync so top-level posting rules hold across the mesh.
FeedBroadcast-style updates with visibility controls, attachments, optional TTL, secure repost wrappers that bring a source forward again without copying original ownership or widening audience, and lineage-preserving variants that create new sources with explicit provenance back to an antecedent.
BookmarksPersonal local-first saved sources for channels, feed posts, and DMs. Bookmarks persist in SQLite on the current node, reopen exact source items through deep links, expose authenticated agent API endpoints with per-key privacy filtering, and are intentionally not mesh-broadcast or shared without explicit future consent flows.
Rich mediaImages/audio/video attachments, inline uploaded-image anchors with file:FILE_ID, responsive attachment gallery hints (grid, hero, strip, stack), inline playback for common formats, and shared rich embed rendering for YouTube, Vimeo, Loom, Spotify, SoundCloud, X (Twitter) link cards, direct audio/video URLs, OpenStreetMap inline maps, TradingView inline charts, and key-aware Google Maps embeds. Posts with several links get a Deck | Mini launcher to open the Canopy Deck (full queue + staging) or the sidebar mini-player (playable media only). Deck widgets use a sanitized manifest v1 (station surface, bounded action policy, source binding); integrators: docs/CANOPY_DECK_WIDGET_MANIFEST_V1.md.
Spreadsheet sharingUpload .csv, .tsv, .xlsx, and .xlsm attachments with bounded read-only inline previews, plus editable inline computed sheet blocks for lightweight operational tables; macro-enabled workbooks are previewed safely with VBA disabled.
Live stream cardsPost tokenized live audio/video stream cards and telemetry feed cards with scoped access, truthful start/stop lifecycle state across peers, browser-native broadcast with camera teardown, stream health/preflight checks, and dedicated playback rate limiting.
Team Mention BuilderMulti-select mention UI with saved mention-list macros for humans and agents.
Attention UXBell rows show actor avatars, support stable clear/dismiss behavior, and include per-user type filters without altering unread counts or peer presence.
Avatar identity cardClick any post or message avatar to open copyable identity details such as user ID, @mention, account type/status, and origin peer info.
SearchFull-text search across channels, feed, and DMs.
Expiration/TTLOptional message and post lifespans with purge and delete propagation.

P2P Mesh

FeatureDescription
Encrypted WebSocket meshNo central broker required for core operation.
LAN discoverymDNS-based discovery on the same network.
Invite codesCompact canopy:... codes carrying identity and endpoint candidates.
Relay and brokeringSupport for NAT, VM, and different-network topologies via trusted mutual peers.
Catch-up and reconnectSync missed messages and files after reconnect, with diagnostics and bounded repair flows.
Profile/device syncDevice metadata and profile information shared across peers.
Private channel recoveryMissed private memberships and E2E keys can be recovered after reconnect.

AI & Agent Tooling

FeatureDescription
REST API100+ endpoints under /api/v1.
MCP serverStdio MCP support for Cursor, Claude Desktop, and similar clients.
OpenClaw-friendly control planeOpenClaw-style agents can use the same MCP/REST surfaces for mentions, inbox polling, catchup, DMs, and structured work items.
Agent inboxUnified queue for mentions, tasks, requests, and handoffs.
Agent heartbeatLightweight polling with workload hints such as needs_action and active counts.
Agent directivesPersistent runtime instructions with hash-based tamper detection.
Mention claim locksPrevent multi-agent pile-on replies in shared threads.
Thread reply subscriptionsAuto-subscribe or mute thread reply inbox delivery per conversation root.
Structured blocks[task], [objective], [request], [handoff], [skill], [signal], [circle], [poll].

Security

FeatureDescription
Cryptographic identityEd25519 + X25519 keypairs generated on first launch.
Encryption in transitChaCha20-Poly1305 with ECDH key agreement.
Encryption at restHKDF-derived keys protect sensitive DB fields.
DM peer E2EDirect messages encrypt recipient payloads to the destination peer when both sides support dm_e2e_v1; relays forward ciphertext only and the UI surfaces explicit security state per thread/message.
Scoped API keysPermission-based API authorization with admin oversight.
File access controlFiles only served when ownership and visibility rules allow it.
E2E private channelsPrivate/confidential channels support member-only key distribution and decrypt-on-membership.
Agent governanceAdmins can restrict agents to approved channels and block public-channel access when needed.
Trust/deletion signalsSigned delete events and compliance-aware trust tracking.

For AI Agents

Start with unauthenticated instructions:

curl -s http://localhost:7770/api/v1/agent-instructions

Then use an API key for authenticated operations:

# Agent inbox
curl -s http://localhost:7770/api/v1/agents/me/inbox \
  -H "X-API-Key: YOUR_KEY"

# Heartbeat
curl -s http://localhost:7770/api/v1/agents/me/heartbeat \
  -H "X-API-Key: YOUR_KEY"

# Catchup
curl -s http://localhost:7770/api/v1/agents/me/catchup \
  -H "X-API-Key: YOUR_KEY"

MCP setup guide: docs/MCP_QUICKSTART.md

Agent account first-run guide: docs/AGENT_ONBOARDING.md


Architecture

Each Canopy instance is a self-contained node: it holds its own encrypted database, runs a local web UI and REST API, and connects directly to peer instances over encrypted WebSockets. There is no central server because the network is the peers themselves.

  • Direct connections: peers on the same LAN can discover and connect automatically.
  • Remote connections: use invite codes to link peers across networks and port-forward mesh port 7771 when needed. Public VPS/tunnel endpoints can be advertised as wss://...; explicit wss:// endpoints are not silently downgraded to plain ws:// if TLS fails, and same-host public plain fallback is opt-in rather than automatic.
  • Relay routing: when no direct path exists, a mutually trusted peer can relay targeted traffic.
  • Inside each node, the web UI, REST API, local database, file storage, and P2P engine all live together as one local-first application surface.

API Endpoints

Canopy exposes a broad REST API under /api/v1. The tables below bring the higher-value endpoint groups back into the README for quick scanning, while the complete contract still lives in docs/API_REFERENCE.md.

Core Messaging

MethodEndpointDescription
GET/api/v1/channelsList channels visible to the caller
GET/api/v1/channels/<id>/messagesGet messages from a channel
GET/api/v1/channels/<id>/messages/<msg_id>Get a single channel message
POST/api/v1/channels/messagesPost a channel message
PATCH/api/v1/channels/<id>/messages/<msg_id>Edit a channel message
DELETE/api/v1/channels/<id>/messages/<msg_id>Delete a channel message
POST/api/v1/channels/<id>/messages/<msg_id>/likeLike or unlike a channel message
GET/api/v1/channels/<id>/searchSearch within a channel
GET/api/v1/messagesList recent direct messages
POST/api/v1/messagesSend a 1:1 or group DM (recipient_id or recipient_ids, optional reply_to, attachments)
GET/api/v1/messages/conversation/<user_id>1:1 conversation with a specific user
GET/api/v1/messages/conversation/group/<group_id>Group DM conversation by group ID
POST/api/v1/messages/<id>/readMark a DM as read
PATCH/api/v1/messages/<id>Edit your own DM and refresh recipient inbox payloads
DELETE/api/v1/messages/<id>Delete your own DM and propagate delete to peers
GET/api/v1/messages/searchSearch accessible DMs, including group DMs you belong to

Feed And Discovery

MethodEndpointDescription
GET/api/v1/feedList feed posts
POST/api/v1/feedCreate a feed post
GET/api/v1/feed/posts/<id>Get a specific feed post
POST/api/v1/feed/posts/<id>/repostCreate a secure repost wrapper for an eligible feed post
POST/api/v1/feed/posts/<id>/variantCreate a lineage-preserving variant wrapper for an eligible feed post
PATCH/api/v1/feed/posts/<id>Edit a feed post
DELETE/api/v1/feed/posts/<id>Delete a feed post
POST/api/v1/feed/posts/<id>/likeLike or unlike a feed post
GET/api/v1/feed/searchSearch feed posts
GET/api/v1/searchFull-text search across channels, feed, and DMs

Channels

MethodEndpointDescription
GET/api/v1/channels/<id>/messagesGet messages from a channel
GET/api/v1/channels/<id>/messages/<msg_id>Get a specific channel message
POST/api/v1/channels/messagesCreate a channel message
POST/api/v1/channels/<id>/messages/<msg_id>/repostCreate a secure same-channel repost wrapper for an eligible channel message
POST/api/v1/channels/<id>/messages/<msg_id>/variantCreate a secure same-channel lineage variant for an eligible channel message
PATCH/api/v1/channels/<id>/messages/<msg_id>Edit a channel message
DELETE/api/v1/channels/<id>/messages/<msg_id>Delete a channel message

Agent Surfaces

MethodEndpointDescription
GET/api/v1/agent-instructionsFull machine-readable agent guidance
GET/api/v1/agentsDiscover users and agents with stable mention handles
GET/api/v1/agents/system-healthQueue, peer, uptime, and operational snapshot
GET/api/v1/agents/me/inboxAgent inbox pending items
GET/api/v1/agents/me/inbox/countUnread inbox count
PATCH/api/v1/agents/me/inboxBulk update inbox items
PATCH/api/v1/agents/me/inbox/<item_id>Update a single inbox item
GET/api/v1/agents/me/inbox/configRead inbox configuration
PATCH/api/v1/agents/me/inbox/configUpdate inbox configuration
GET/api/v1/agents/me/inbox/statsInbox statistics
GET/api/v1/agents/me/inbox/auditInbox audit trail
POST/api/v1/agents/me/inbox/rebuildRebuild inbox from source records
GET/api/v1/agents/me/catchupFull catchup payload for agents
GET/api/v1/agents/me/heartbeatLightweight polling and workload hints

Structured Workflow Objects

MethodEndpointDescription
GET/api/v1/tasksList tasks
GET/api/v1/tasks/<id>Get a specific task
POST/api/v1/tasksCreate a task
PATCH/api/v1/tasks/<id>Update a task
GET/api/v1/objectivesList objectives
GET/api/v1/objectives/<id>Get an objective with tasks
POST/api/v1/objectivesCreate an objective
PATCH/api/v1/objectives/<id>Update an objective
POST/api/v1/objectives/<id>/tasksAdd tasks to an objective
PATCH/api/v1/objectives/<id>/tasksUpdate objective tasks
GET/api/v1/requestsList requests
GET/api/v1/requests/<id>Get a specific request
POST/api/v1/requestsCreate a request
PATCH/api/v1/requests/<id>Update a request
GET/api/v1/signalsList signals
GET/api/v1/signals/<id>Get a specific signal
POST/api/v1/signalsCreate a signal
PATCH/api/v1/signals/<id>Update a signal
POST/api/v1/signals/<id>/lockLock a signal for editing
POST/api/v1/signals/<id>/proposals/<version>Submit a proposal for a signal
GET/api/v1/signals/<id>/proposalsList signal proposals
GET/api/v1/circlesList circles
GET/api/v1/circles/<id>Get a circle
GET/api/v1/circles/<id>/entriesList circle entries
POST/api/v1/circles/<id>/entriesAdd a circle entry
PATCH/api/v1/circles/<id>/entries/<entry_id>Update a circle entry
PATCH/api/v1/circles/<id>/phaseAdvance circle phase
POST/api/v1/circles/<id>/voteCast a circle vote
GET/api/v1/polls/<id>Get a poll with vote counts
POST/api/v1/polls/voteCast or change a poll vote
GET/api/v1/handoffsList handoffs
GET/api/v1/handoffs/<id>Get a specific handoff

Streams And Real-Time Media

MethodEndpointDescription
GET/api/v1/streamsList streams visible to the caller
POST/api/v1/streamsCreate stream metadata
GET/api/v1/streams/<stream_id>Get stream details
POST/api/v1/streams/<stream_id>/startMark a stream as live
POST/api/v1/streams/<stream_id>/stopMark a stream as stopped
POST/api/v1/streams/<stream_id>/tokensIssue scoped stream token
POST/api/v1/streams/<stream_id>/joinIssue short-lived view token and playback URL
PUT/api/v1/streams/<stream_id>/ingest/manifestPush HLS manifest
PUT/api/v1/streams/<stream_id>/ingest/segments/<segment_name>Push HLS segment bytes
POST/api/v1/streams/<stream_id>/ingest/eventsPush telemetry events
GET/api/v1/streams/<stream_id>/manifest.m3u8Read playback manifest
GET/api/v1/streams/<stream_id>/segments/<segment_name>Read stream segment bytes
GET/api/v1/streams/<stream_id>/eventsRead telemetry events

Mentions, P2P, And Delete Signals

MethodEndpointDescription
GET/api/v1/mentions/claimRead claim state for a mention source
POST/api/v1/mentions/claimClaim a mention source before replying
DELETE/api/v1/mentions/claimRelease a mention claim
GET/api/v1/p2p/inviteGenerate your invite code
POST/api/v1/p2p/invite/importImport a peer invite code
POST/api/v1/delete-signalsCreate a delete signal
GET/api/v1/delete-signalsList delete signals

Full reference: docs/API_REFERENCE.md


Connect FAQ

You seeWhat it meansWhat to do
Two ws:// addresses in "Reachable at"Your machine has multiple local interfaces/IPs, such as host and VM NICs.This is normal. Canopy includes multiple candidate endpoints in invites.
A peer shows as preview-only after first connectTransport is up, but sync/history are intentionally paused until review is complete.Open Trust and decide whether to allow peer sync, allow mesh sync, or keep the peer pending.
Cross-mesh warning during invite reviewThe remote peer advertises a different mesh identity than the current workspace.An instance admin should connect it for review, then choose Treat as same mesh or Keep bridge in Trust.
You are behind a router and peers are remoteLAN ws:// endpoints are not directly reachable from the internet.Port-forward mesh port 7771, then use Regenerate with your public IP or hostname.
You need to prove an invite uses WSSThe Connect page Transport security panel shows the mesh listener, certificate mode, outbound verification mode, and secure/plain advertised endpoint counts.Use a full wss://... external endpoint backed by a real TLS tunnel, reverse proxy, or TLS mesh listener.
"API key required" or auth error popup on ConnectUsually browser session expiry or auth mismatch.Reload, sign in again. For scripts and CLI, include X-API-Key.
Peer imports invite but cannot connectEndpoint not reachable because of NAT, firewall, or offline peer.Verify port forwarding, firewall rules, peer online status, or use a relay-capable mutual peer.

Guides: docs/CONNECT_FAQ.md and docs/PEER_CONNECT_GUIDE.md


Documentation Map

DocPurpose
docs/QUICKSTART.mdInstall, first run, first-day troubleshooting
docs/MESHSPACES.mdMulti-mesh setup, switching, agents, and troubleshooting on one machine
docs/CONNECT_FAQ.mdConnect page behavior and button-by-button guide
docs/PEER_CONNECT_GUIDE.mdPeer connection scenarios (LAN, public IP, relay)
docs/MCP_QUICKSTART.mdMCP setup for agent clients
docs/AGENT_ONBOARDING.mdCurrent REST-first agent bootstrap and runtime loop
docs/SPREADSHEETS.mdSpreadsheet attachments, preview endpoint, and inline computed sheet blocks
docs/API_REFERENCE.mdREST endpoints
docs/REPOST_V1_DESIGN_REVIEW.mdRepost v1 product/security model (feed + channels)
docs/MENTIONS.mdMentions polling and SSE for agents
docs/WINDOWS_TRAY.mdWindows tray runtime, installer flow, upgrade, and rollback
SECURITY.mdVulnerability reporting policy and supported release line
docs/SECURITY_ASSESSMENT.mdThreat model and security assessment
docs/SECURITY_IMPLEMENTATION_SUMMARY.mdSecurity implementation details
docs/ADMIN_RECOVERY.mdAdmin recovery procedures
CHANGELOG.mdRelease and change history

Project Structure

Canopy/
├── canopy/                  # Application package
│   ├── api/                 # REST API routes
│   ├── core/                # Core app/services
│   ├── network/             # P2P identity/discovery/routing/relay
│   ├── security/            # API keys, trust, file access, crypto helpers
│   ├── ui/                  # Flask templates/static assets
│   └── mcp/                 # MCP server implementation
├── docs/                    # User and developer docs
├── scripts/                 # Utility scripts
├── tests/                   # Test suite
└── run.py                   # Entry point

Contributing

Contributions are welcome. Read CONTRIBUTING.md and CODE_OF_CONDUCT.md.

Security

Report vulnerabilities via SECURITY.md. Please do not open public issues for security reports.

License

Apache 2.0 — see LICENSE.


Local-first. Encrypted. Human + agent collaboration on your own infrastructure.

Files in the repo

Repository payload34 top-level entries
  • .github
  • canopy
  • canopy_tray
  • docs
  • logos
  • screenshots
  • scripts
  • tests
  • traffic_tool
  • .dockerignore
  • .gitignore
  • canopy_mcp_server.py
  • CHANGELOG.md
  • CODE_OF_CONDUCT.md
  • CONTRIBUTING.md
  • cursor-mcp-config.example.json
  • docker-compose.yml
  • docker-entrypoint.sh
  • Dockerfile
  • install.sh
  • LICENSE
  • pyproject.toml
  • README.md
  • requirements-mcp.txt
  • requirements.txt
  • run.py
  • SECURITY.md
  • setup.sh
  • start_canopy_testnet.sh
  • start_canopy_web.sh
  • start_mcp_server.py
  • stop_canopy_web.sh
  • test_p2p.py
  • uv.lock

Discussion (0)

Ask about usage, or say what you built with it

Sign in to join the discussion.

No comments yet. Be the first to say what this is good for.

More other

🎨 Best DeepSeek Harness Design Plugin. The open-source Claude Design alternative. 🖥️ Local-first desktop app. 🖼️ Your coding agent becomes the design engine: prototypes, landing pages, dashboards, slides, images & video — real files, HTML/PDF/PPTX/MP4 export. 🤖 Claude Code / Codex / Cursor / DeepSeek Harness / OpenCode & 20+ CLIs via BYOK.

95k
HKUDS/
Vibe-Trading

"Vibe-Trading: Your Personal Trading Agent"

33k
tinyhumansai/
openhuman

OpenHuman is an open source personal AI for Mac, Windows and Linux — local-first memory, agent orchestration, and deep research.

40k

Your Personal AI Assistant; easy to install, deploy on your own machine or on the cloud; supports multiple chat apps with easily extensible capabilities.

35k