Restructure project: migrate from web to native desktop app with libp2p networking#1
Merged
Merged
Conversation
Replace the original Yew-based timeline app with a full chat platform architecture. New crate structure: - willow-transport: Protocol-versioned binary serialization with envelopes - willow-identity: Modern libp2p Ed25519 identity, Arc-based (Send+Sync), user profiles, signed message packaging - willow-messaging: Chat messages with Hybrid Logical Clock ordering, multiple content types (text, file, reaction, reply, edit, delete), pluggable message store with in-memory implementation - willow-channel: Server/channel/role/permission model with invite system - willow-network: libp2p networking layer with GossipSub, Kademlia, mDNS, Relay, and Identify protocols on tokio - willow-app: Bevy 0.14 desktop client with Discord-style layout and async network bridge via std::sync::mpsc channels All library crates have thorough documentation and tests (60 total). Removes old timeline and web crates. https://claude.ai/code/session_019s8X2ZL8SEF9KZok2e5qJV
intendednull
added a commit
that referenced
this pull request
Mar 25, 2026
- Fix openMemberList/closeMemberList to work on all viewports (Critical #1) - Scope .action-trigger to target message instead of page.last() (Important #3) - Add regression comment to messages sync test (Important #7) - Use beforeEach for mobile skip instead of per-test (Suggestion #10) - Use startsWith('mobile') consistently (Suggestion #9) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This was referenced Apr 24, 2026
intendednull
added a commit
that referenced
this pull request
Apr 26, 2026
lifecycle, fix IrohBlobStore spec drift, track 4 new follow-ups Round 2 review (two fresh agents) verified all 15 round-1 fixes land cleanly with no regressions, then surfaced 8 new findings (0 critical, 3 medium, 5 low) by widening scope to cross-component interactions, perf, and API surface. Fixed inline (trivial doc / spec): - Add an "Actor coordination signal" row to the spec decision tree + CLAUDE.md table covering tokio::sync::watch / oneshot / broadcast / Notify, with the explicit rule that tokio::sync::Mutex is forbidden for business state on the same terms as std/parking_lot Mutex. Closes the spec gap that left contributors without guidance on async channels. (round-2 #3) - Reconcile spec § 184 with the corrected IrohBlobStore comment (round-1 fixed the code, missed the spec). The blob store is not an iroh-callback boundary — it's an interim stub. The relay- status timestamp Mutex stays in the iroh boundary list. (round-2 #4) - Document the web `_event_loop` drop pattern in `crates/web/src/app.rs` so future readers see explicitly that the actor System is process- scoped on web (page reload tears everything down) and that any actor needing pre-close cleanup must route via `beforeunload`, not Drop. (round-2 #8) Tracked as new follow-ups in spec § Follow-up work: - F5. SearchActor head-of-line + rebuild-storm fix. Rebuild blocks Query in FIFO order; the rebuild Effect has no debounce. Fix is chunked-Rebuild + Debounce<Rebuild> wrap. (round-2 #1, #2 — Med) - F6. Browser-tier coverage for SearchIndexHandle consumers. The spawn_local + Effect path has no wasm-pack test. (round-2 #6) - F7. Sealed ClientSpawner to narrow the system() API surface, rather than exposing the full SystemHandle. (round-2 #7) - F8. Search-query debouncing-flicker fix via generation tag or Leptos Resource migration. (round-2 #5) Each follow-up has a "Trigger:" line naming the dedicated PR title. `just check` green: clippy zero warnings, 1003+ tests pass, WASM compile clean. Loop terminates here per the user's two-round cap; no Critical issues remain. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This was referenced Apr 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This is a major architectural restructuring that pivots Willow from a web-based application to a native desktop client. The project now uses Bevy for the UI, libp2p for P2P networking, and introduces a complete modular crate structure with proper separation of concerns.
Key Changes
Removed
crates/web/) — Yew-based web UI and related dependenciescrates/timeline/) — Old state management approachAdded
willow-app — New Bevy-based desktop UI with ECS architecture
ui.rs— Bevy UI layout (sidebar, message list, peer count)network_bridge.rs— Bridges async tokio networking into Bevy's synchronous ECSmain.rs— Application entry point with plugin systemwillow-network — Complete P2P networking layer built on libp2p
node.rs— High-levelNetworkNodemanaging the libp2p swarmbehaviour.rs— Composite network behaviour (GossipSub, Kademlia, mDNS, Identify, Relay)config.rs— Network configuration with sensible defaultswillow-channel — Server/channel/role/permission management (730 lines)
Server— Named communities with channels and membersChannel— Text/voice conversation spacesRole— Permission bundles assignable to membersInvite— Signed tokens for server access with expiration/use limitswillow-messaging — Chat messages with Hybrid Logical Clock ordering
Message— Supports text, files, reactions, replies, edits, deletes, system eventsHLC(Hybrid Logical Clock) — Distributed timestamp ordering that works across peers with clock skewMessageStoretrait withInMemoryStoreimplementationModified
willow-identity — Expanded with comprehensive documentation and API improvements
PeerIdbacking fromRctoArcfor thread safetyUserProfilefor display names and avatarsSignedPayloadfor cryptographic message signingpack()/unpack()functions for serializing signed dataIdentityErrorwillow-transport — Enhanced with protocol versioning and message types
Envelopewrapper with protocol version and message type tagsMessageTypeenum (Chat, Channel, Identity, File, Signal, Presence, Ping)TransportErrorCargo.toml — Workspace restructuring
willow-*namespace for clarityDocumentation
PLAN.md— High-level vision and architecture overviewCLAUDE.md— Development guide with build instructions and crate descriptionsNotable Implementation Details
Network Architecture — Uses libp2p's modular protocol stack: GossipSub for pub/sub, Kademlia for DHT, mDNS for local discovery, Noise for encryption, and Relay for NAT traversal.
Hybrid Logical Clocks — Implements the Kulkarni et al. (2014) algorithm to establish consistent message ordering across peers despite clock skew, critical for a decentralized chat system.
ECS Bridge — The
NetworkBridgeEventandNetworkBridgeCommandtypes allow the async tokhttps://claude.ai/code/session_019s8X2ZL8SEF9KZok2e5qJV