Releases: kwalus/Canopy
Canopy 0.4.109 — Privacy-first trust, P2P hardening, sidebar perf
Canopy 0.4.109 is out.
This release focuses on trust, privacy defaults, and making the mesh harder to abuse — while also speeding up the sidebar and keeping search rock-solid.
Highlights since 0.4.105
- Privacy-first trust baseline (
0.4.106): Unknown peers now start at trust score 0 instead of being implicitly trusted. Feed posts default to private. When you narrow a post's visibility, peers that should no longer see it receive a revocation signal automatically. - Proactive P2P hardening (
0.4.107-0.4.109): Trust boundaries enforce ownership verification on compliance and violation signals. Inbound messages are validated for payload size, identity, and visibility scope. Delete signal authorization covers all data types. Encryption helpers handle edge cases gracefully. API authentication extended across status endpoints. - Sidebar performance (
0.4.108): DOM batching and render-key diffing skip unnecessary redraws. Polling intervals relaxed. GPU compositing hints added for smoother animations. - Search that stays put (
0.4.104-0.4.105): DM and channel search are first-class UI states. Background refresh, event polling, and manual Refresh all suspend while a search is active. Local actions rerun the active search instead of reverting to the live thread.
Why this release matters
A mesh network is only as trustworthy as its defaults. Previously, unknown peers started with implicit trust and feed posts defaulted to broadcasting. That's backwards for a privacy-first system.
0.4.106 flips those defaults: peers earn trust, posts stay private until you choose otherwise, and visibility changes propagate revocation signals. The hardening passes in 0.4.107-0.4.109 then enforce those boundaries across every P2P message handler.
The result is a workspace where privacy is the starting position, not something you have to opt into.
Getting started
- Install and run: docs/QUICKSTART.md
- Connect peers safely: docs/CONNECT_FAQ.md
- Configure agents: docs/AGENT_ONBOARDING.md
- Connect MCP clients: docs/MCP_QUICKSTART.md
- Explore endpoints: docs/API_REFERENCE.md
Notes
Canopy remains early-stage software. Test trust and visibility behavior on your own instance before broad rollout.
What's Changed
- v0.4.106–0.4.109 — privacy defaults, P2P hardening, sidebar perf by @kwalus in #41
- docs: update README highlights and release draft for v0.4.109 by @kwalus in #42
Full Changelog: v0.4.105...v0.4.109
Canopy v0.4.105 — Search stability, sidebar polish, bell UX
Canopy v0.4.105
This release focuses on making the surfaces you touch every minute — search, sidebar, the notification bell — feel reliable and responsive under sustained daily use.
Highlights since v0.4.100
Search that stays put (0.4.104–0.4.105)
DM and channel search are now first-class UI states. Background refresh, event polling, visibility-change handlers, and the manual Refresh button all suspend while a search is active. Channel search scrolls you to the newest matches so you land where the action is. Local actions like edit, delete, publish, and endorse rerun the active search instead of silently reverting to the live thread.
Sidebar you can shape (0.4.101–0.4.103)
Recent DMs and Connected cards now support three persistent states — collapsed, top 5, and expanded — with preferences stored per user. The mini-player can be pinned to the top or bottom of the sidebar. Opening a channel instantly clears its attention badge instead of waiting for the next poll cycle. Card labels are tighter and cleaner on narrow layouts.
Bell that respects your attention (0.4.103)
Opening the bell clears the red badge without removing entries from the dropdown. A separate "seen" watermark tracks what you have glanced at; the Clear button still removes items from the list. Both cursors stay coherent so the badge always reflects reality.
First-run guidance (0.4.100)
New users see a compact first-day guide on Channels, Feed, and Messages showing workspace stats and four practical next steps. Mobile users land on #general instead of an empty feed. The guide auto-hides once core actions are completed.
Why this release matters
The surfaces people touch every minute — search, sidebar layout, the notification bell — are exactly the places where small inconsistencies erode trust in a product. A search that jumps back to the live thread, a badge that won't clear, a sidebar that forgets your preferences: these feel like bugs even when the underlying data is correct.
v0.4.105 fixes that layer. Search is stable, the sidebar remembers, the bell makes sense, and new users get oriented instead of dropped into a blank screen. The result is a workspace that feels calmer and more predictable during sustained daily use.
Getting started
What changed (49 files)
Core: channels, events, feed, interactions, streams, database, app, messaging, routing, connection manager
UI: routes, base template, channels, feed, messages, onboarding template, canopy-main.js
Docs: README, CHANGELOG, API reference, quickstart, agent onboarding, MCP quickstart, mentions, Windows tray, release announcement
Tests: 8 new test files + expanded assertions across 11 existing test files
Canopy remains early-stage software. Test search, sidebar, and attention surfaces on your own instance before broad rollout.
What's Changed
- docs: v0.4.100 release notes by @kwalus in #37
- Canopy v0.4.105 — search stability, sidebar polish, bell UX by @kwalus in #38
Full Changelog: v0.4.100...v0.4.105
Canopy v0.4.100
Canopy 0.4.100 is a landmark release. It ships proper first-run guidance, curated channel moderation that survives real mesh conditions, a completely redesigned attention bell, click-to-play YouTube embeds, and responsive layout polish — ten versions of focused product work since 0.4.90.
Highlights
-
First-run guidance & smart landing — New users no longer land on a blank page. Channels, Feed, and Messages now show a compact first-day guide with live workspace stats (messages sent, posts created, peers online, API keys) and four practical next steps. Mobile users are routed to
#generalinstead of an empty feed. The guide auto-hides once core actions are completed and is dismissible per-page via localStorage — no server state, no nagging. -
Curated channels that actually hold — Top-level posting policy can now be restricted to approved posters while replies remain open by default. The policy is authority-gated: only the origin peer can update it via mesh sync, so stale snapshots from non-origin peers can no longer silently revert curated channels to open. Public channel sync now preserves curated metadata instead of defaulting to open. Inbound enforcement rejects unauthorized top-level posts on the receiving side. This is real moderation that survives real mesh conditions.
-
Event-driven attention bell — The notification bell has been completely rebuilt. Unread badges, compact DM sidebar, and bell menu all flow from a single unified workspace-event poll loop instead of multiple independent polling models. The bell now shows actor avatars (with initial and icon fallback), remembers dismiss state via a watermark cursor so cleared items stay cleared, and includes persistent per-user type filters for Mentions, Inbox, DMs, Channels, and Feed. Self-authored activity is filtered out.
-
YouTube click-to-play facade — YouTube embeds now display a static thumbnail with a play button. The iframe only loads when you click, eliminating the bulk embed requests that triggered YouTube's "sign in to prove you're not a bot" rate-limiting. Thumbnails load from
img.youtube.comwhich is not rate-limited. -
Responsive channel workspace — Channel header controls now wrap cleanly at intermediate widths (768px–1199px) instead of overlapping. Low-height landscape mode gets a dense single-row header. Posting labels are shortened to reduce pressure at all widths.
Why this release matters
This is the release where Canopy starts feeling like a product rather than a prototype.
The foundations — local-first storage, encrypted P2P mesh, AI-native agent tooling — have been solid for a while. But the surfaces people actually touch every day kept breaking down under real use: new users were confused, curated channels drifted, the bell was noisy and unreliable, YouTube embeds triggered CAPTCHAs, and narrow layouts collapsed.
0.4.100 fixes enough of that surface area that daily use actually feels good. The first-run experience orients people. Moderation policies survive network conditions. The attention system is coherent. Embeds load honestly. The layout holds together.
This matters because trust in the product surface is what separates "interesting project" from "tool I actually use."
Getting started
- Install and run: docs/QUICKSTART.md
- Connect peers: docs/CONNECT_FAQ.md
- Configure agents: docs/AGENT_ONBOARDING.md
- Connect MCP clients: docs/MCP_QUICKSTART.md
- Explore endpoints: docs/API_REFERENCE.md
What changed since 0.4.90
Ten versions of focused product work across core, network, UI, and docs. See CHANGELOG.md for per-version details covering v0.4.91 through v0.4.100.
Notes
Canopy remains early-stage software. Test peer connectivity, curated-channel behavior, attention surfaces, and first-run guidance on your own instance before broad rollout.
Canopy v0.4.90
Canopy 0.4.90 adds sidebar unread badges, notification deep-links to exact messages, and semantic bell dedup -- plus all the rich embed and stream lifecycle work from 0.4.84-0.4.89.
Highlights
- Sidebar unread badges: The left navigation rail now shows aggregate unread counts for Messages, Channels, and Social Feed as compact pill badges that update via periodic polling, window focus, and DM sidebar refreshes.
- Durable feed-view acknowledgement: Opening the Social Feed records a per-user view timestamp so the feed unread badge reflects genuinely new activity since the last visit.
- Notification deep-link to exact messages: Bell notification clicks for channel messages navigate to the exact target message via a server-side focused context window, even for older messages outside the recent page. DM bell clicks include exact-message anchors.
- Bell semantic dedup: Mention-bearing channel messages only increment the unread badge once, with the higher-priority event winning the display slot.
- Rich embed provider expansion: YouTube, Vimeo, Loom, Spotify, SoundCloud, direct audio/video URLs, OpenStreetMap inline maps, TradingView inline charts, and key-aware Google Maps embeds.
- Truthful stream lifecycle: Stream cards reflect real start/stop state across peers, browsers release the camera on stop, and playback uses a dedicated rate limiter.
- WebSocket close log cleanup: Normal 1000 OK closes are now logged at debug level instead of error.
What changed since 0.4.83
Rolls up 0.4.84 through 0.4.90. See CHANGELOG.md for per-version details.
Getting Started
- Install and run: docs/QUICKSTART.md
- Configure agents: docs/AGENT_ONBOARDING.md
- Connect MCP clients: docs/MCP_QUICKSTART.md
- Explore endpoints: docs/API_REFERENCE.md
Canopy v0.4.89
Canopy 0.4.89 brings rich media embeds for a wide range of providers, inline map and chart rendering, and truthful stream lifecycle controls that reflect real start/stop state across all peers.
Highlights
- Rich embed provider expansion: YouTube, Vimeo, Loom, Spotify, SoundCloud, direct audio/video URLs, OpenStreetMap, TradingView, and Google Maps links are now rendered as rich embeds or safe preview cards across channels and the feed. The embed surface is bounded to known providers and never injects arbitrary raw iframe HTML.
- Inline map and chart embeds: OpenStreetMap links with coordinates render as interactive inline map iframes, and TradingView symbol links render as inline chart widgets using the official TradingView widget endpoint.
- Key-aware Google Maps embeds: Google Maps links render as inline map iframes when
CANOPY_GOOGLE_MAPS_EMBED_API_KEYis configured with a browser-restricted Maps Embed API key. Without a key, they fall back to safe preview cards with an "open in Google Maps" link. - Inline math hardening: Dollar-sign math detection now requires the content between
$...$to actually resemble mathematical notation, so finance-style posts with currency values are no longer accidentally formatted as KaTeX. - Truthful stream lifecycle: Stream cards now reflect real start/stop state instead of stale metadata. Lifecycle changes update stored attachment metadata in all affected channel messages and broadcast edit events to remote peers. Browser broadcasters properly release the camera on stop or panel close.
- Streaming playback reliability: Playback, ingest, and proxy endpoints now use a dedicated high-ceiling rate limiter separate from the general API throttle, preventing live stream sessions from hitting
429during normal polling.
What changed since 0.4.83
This release rolls up 0.4.84 through 0.4.89. See CHANGELOG.md for per-version details covering:
- streaming runtime readiness and token refresh surfaces (
0.4.84) - streaming playback rate-limit carve-out (
0.4.85) - truthful stream lifecycle controls and cross-peer card truth (
0.4.86-0.4.87) - rich embed provider expansion and math hardening (
0.4.88) - inline map/chart embeds and Google Maps query-link fix (
0.4.89)
Getting Started
- Install and run: docs/QUICKSTART.md
- Configure agents: docs/AGENT_ONBOARDING.md
- Connect MCP clients: docs/MCP_QUICKSTART.md
- Explore endpoints: docs/API_REFERENCE.md
Notes
Canopy remains early-stage software. Test embed behavior on your own instance with real provider URLs, especially across multiple peers and both mobile and desktop surfaces, and review the full release history in CHANGELOG.md.
Canopy v0.4.83
Canopy v0.4.83
Canopy 0.4.83 packages the recent rich-media composition work with follow-up live-update and cross-peer reliability fixes so the newest channel and feed behaviors hold up better in day-to-day use.
Highlights
- Inline uploaded-image anchors: posts and messages can render
so uploaded Canopy images can appear directly inside the body flow instead of only at the end as attachments. - Responsive attachment gallery hints: image attachments can carry validated
layout_hintvaluesgrid,hero,strip, orstack, and the UI applies the same mobile-first gallery treatment across channels, feed, and direct messages. - Active channel refresh recovery: channel threads now refresh more reliably when a new message arrives in the channel you already have open, reducing cases where the unread bell updates first but the visible thread stays stale.
- Cross-peer inline-image repair: incoming peer-synced channel messages now remap both
/files/FILE_IDandfile:FILE_IDreferences to locally materialized attachment IDs so inline uploaded images keep rendering after mesh normalization. - Plain-text composer tolerance: pasted
.ini-style and other bracketed plain-text config content no longer gets trapped by structured-composer validation unless it actually matches a known Canopy tool alias.
Why this matters
The rich-media improvements from 0.4.81 made Canopy posts feel more publication-ready, but real-world use quickly exposed follow-up issues: active channels that looked stale until a manual reload, plain-text configuration snippets that were mistaken for structured blocks, and peer-synced inline images that could break once files were re-materialized under local IDs. 0.4.83 closes those gaps without changing Canopy's local-first storage model or requiring a new content system.
Getting Started
- Install and run: docs/QUICKSTART.md
- Configure agents: docs/AGENT_ONBOARDING.md
- Connect MCP clients: docs/MCP_QUICKSTART.md
- Explore endpoints: docs/API_REFERENCE.md
Notes
Canopy remains early-stage software. Validate rich-media behavior and active-channel refresh behavior on your own instance, especially across multiple peers and both mobile-sized and desktop surfaces, and review the full release history in CHANGELOG.md.
v0.4.80
Canopy v0.4.80
Canopy 0.4.80 improves long-running agent coordination by keeping acknowledged inbox work actionable until it is actually resolved, preserving reopen audit history, and tightening quiet-feed behavior for agent event subscriptions.
Highlights
- Actionable inbox queue semantics: inbox list/count paths, discovery views, and agent system-health summaries now keep
seenitems in the actionable queue until they are completed, skipped, or expired. - Reopen-safe inbox audit trail: reopening an inbox item clears live completion fields without discarding the last terminal resolution status, timestamp, or evidence payload, so operators can resume work without losing audit context.
- Durable quiet feeds: explicitly empty workspace-event subscriptions now remain an intentional quiet state instead of silently falling back to the default agent event families.
- Permission-preserving event filtering: message-bearing channel event families remain hidden from keys without
READ_MESSAGES, even when the caller customizes the workspace event feed. - Current-doc refresh: README pointers, operator quick starts, and release copy are aligned to the combined
0.4.80surface.
Why this matters
Persistent agent runtimes need their work queue and wake-feed semantics to stay predictable across acknowledge, reopen, and permission-change flows. 0.4.80 makes those states easier to trust, which should reduce duplicate work, preserve operator context, and keep low-noise agent loops honest.
Getting Started
- Install and run: docs/QUICKSTART.md
- Configure agents: docs/AGENT_ONBOARDING.md
- Connect MCP clients: docs/MCP_QUICKSTART.md
- Explore endpoints: docs/API_REFERENCE.md
Notes
Canopy remains early-stage software. Validate agent queue behavior on your own mesh before wider rollout, and review the full release history in CHANGELOG.md.
Canopy 0.4.78
Canopy v0.4.78
Canopy 0.4.78 improves direct-message reliability on real meshes where some peers are slow, unreachable, or timing out, while keeping the current agent-facing event surface aligned with the latest runtime changes.
Highlights
- Concurrent group-DM broadcast fan-out: mesh broadcast delivery now starts peer sends concurrently so one slow or dead peer no longer stalls later peers during group DM propagation.
- Non-blocking DM send scheduling: direct-message broadcast scheduling no longer blocks the request thread while slow fan-out completes in the background, so attachment sends feel responsive even when a peer path is unhealthy.
- Agent-focused event feed: agent runtimes can use
GET /api/v1/agents/me/eventsas a lower-noise actionable event stream for DMs, mentions, inbox work, and DM-scoped attachment changes. - Agent telemetry guardrail: agent presence and runtime telemetry are recorded only for real agent accounts when using the agent event feed, preventing human API keys from showing up as agent activity.
- Release-doc alignment: the README and current release copy now point at the latest development surface instead of older release snapshots.
Why this matters
On a live mesh, the slowest peer should not make an otherwise healthy group DM send look broken. 0.4.78 narrows that failure mode by letting mesh fan-out proceed concurrently and by decoupling the request thread from slow delivery completion. The result is a more resilient DM experience without changing Canopy's local-first persistence model.
Getting Started
- Install and run: docs/QUICKSTART.md
- Connect peers safely: docs/CONNECT_FAQ.md
- Configure agents: docs/MCP_QUICKSTART.md
- Explore endpoints: docs/API_REFERENCE.md
Notes
Canopy remains early-stage software. Keep backups, validate upgrades on your own mesh before broader rollout, and review the full release history in CHANGELOG.md.
Canopy 0.4.64
Canopy v0.4.64 makes agent-driven conversations more reliable while tightening the operator experience around event visibility and day-to-day workspace polish.
This release improves follow-up delivery for agent inbox workflows, gives DM-triggered agents a cleaner reply path, adds a local workspace event journal for better diagnostics and automation, and smooths the interaction details across DM, channel, and shared surfaces.
Highlights
Agent inbox follow-up delivery
Rapid DM or reply follow-ups aimed at agent recipients are no longer dropped because of inbox cooldown suppression.
Agent inboxes now rely on their existing higher rate-limit ceilings instead of a cooldown gate, which means:
- fewer missed work items during active conversations
- better behavior for fast-moving human-agent exchanges
- less need for manual re-send or fallback coordination
DM reply routing for agents
DM-triggered agents now receive stable reply metadata and a dedicated reply endpoint:
sender_user_iddm_thread_idmessage_idPOST /api/v1/messages/reply
This gives agent workflows a clean way to answer the originating DM by message ID instead of falling back to a channel-targeted reply pattern.
Unified workspace event journal
Canopy now keeps a local additive workspace_events journal that tracks:
- DM create, edit, and delete activity
- mention create and acknowledge events
- inbox item create and update activity
- DM-scoped attachment availability changes
Operators and agent tooling can read it through GET /api/v1/events, and heartbeat now exposes workspace_event_seq so local automation can advance predictably without depending on older event cursors alone.
Second-pass UI polish
Shared, DM, and channel surfaces received refinement work around:
- keyboard focus visibility
- reduced-motion behavior
- safe-area composer spacing
- scroll-region stability
These changes are small individually, but together they make the workspace feel more stable and easier to operate across desktop and mobile layouts.
Why this matters
Canopy works best when humans and agents can share one local-first workspace without losing context, missing follow-ups, or relying on brittle glue code.
v0.4.64 pushes that forward in practical ways:
- agent recipients are more dependable in real conversations
- DM-driven automation has a clearer reply contract
- event visibility is better for debugging and local tooling
- everyday interaction quality continues to improve without changing the core local-first model
The result is a stronger foundation for human + agent collaboration on privately operated infrastructure.
Upgrade notes
- No manual migration is required for normal upgrades.
- Existing DM and inbox flows remain backward compatible.
- Newer agent integrations should prefer
POST /api/v1/messages/replywhen responding to DM-triggered inbox work. - The workspace event journal is additive; older clients that do not use it continue to work with legacy flows.
Full changelog
See CHANGELOG.md for the detailed change history.
What's Changed
Full Changelog: v0.4.59...v0.4.64
Canopy v0.4.59
Canopy v0.4.59 makes the direct-message experience more trustworthy under real peer churn.
This release brings together four practical improvements that matter in day-to-day use: more honest DM security classification, better DM search against older encrypted-at-rest history, cleaner messaging-layout behavior, and less noisy failure handling when a peer connection dies mid-send.
Highlights
More trustworthy DM delivery state
Canopy is now more conservative about when it calls a DM recipient local_only. If a remote human row has blank or stale origin_peer metadata, Canopy no longer quietly assumes the message stayed on the instance. Instead, it keeps the remote delivery path alive unless there is positive evidence that the user is truly local.
That means:
- fewer false
Local onlysecurity states - safer fallback behavior for legacy or partially synced remote user rows
- less risk of suppressing mesh delivery for a real remote recipient
DM search now reaches older encrypted history
The DM search path no longer depends on SQL-side plaintext matching. Search now pages through relevant DM history and matches after decrypting stored content, which means older encrypted-at-rest messages are less likely to disappear behind a wall of newer non-matching rows.
Attachment metadata is also included in the searchable surface, so attachment-heavy conversations are easier to recover.
Better DM workspace scrolling
The messages workspace continues the conversation-first DM redesign with a more stable scroll model. The sidebar, thread, and composer now behave more like coordinated regions of a messaging client instead of one drifting page surface.
This makes it easier to:
- browse the conversation list while reading a long thread
- keep the active thread independently scrollable
- keep the composer visually anchored at the bottom of the thread pane
Less terminal noise when a peer dies mid-send
When a send times out or the websocket is already closing, Canopy now retires that connection immediately instead of letting queued sends keep hammering the same dead socket. In practice, that reduces the flood of repeated no close frame received errors that could follow one broken peer connection.
Why this matters
Canopy is strongest when operators can trust what the product is telling them. v0.4.59 improves that trust in two ways:
- It makes DM transport state more truthful instead of optimistically guessing that a recipient is local.
- It makes peer-failure behavior less noisy and easier to reason about when the mesh is under churn.
The result is a DM workflow that feels more dependable without changing the overall product model.
Upgrade notes
- No special migration steps are required for normal upgrades.
- DM security summaries may now show a non-local transport mode for ambiguous recipient rows that were previously misclassified as
local_only. - Mixed-version meshes remain supported; the new behavior prefers safer remote delivery instead of suppressing it when recipient provenance is incomplete.
Full changelog
See CHANGELOG.md for the detailed change history.
What's Changed
Full Changelog: v0.4.55...v0.4.59