Michael Neale
2a947e383d
Merge branch 'main' into micn/serverless-mode
...
* main: (128 commits)
perf(timeline): gate heavy message render behind useDeferredValue (#1022 )
Add animated profile avatars (#1031 )
Polish direct message and members modals (#1054 )
Polish huddles UI (#1041 )
Fix video review comments in threads (#1056 )
Polish message reaction tray (#1002 )
Refine app loading skeletons (#1001 )
Polish channel modal forms (#1000 )
Normalize desktop icon sizing (#999 )
Add shared skeleton loader primitives (#998 )
chore(scripts): update post-screenshots repo name to block/buzz (#1042 )
docs: fix stale sprout repo references in RELEASING.md (#1043 )
chore(release): release version 0.3.23 (#1040 )
fix(release): publish manifest from successful platforms (#1039 )
chore(release): release version 0.3.22 (#1038 )
chore(release): release version 0.3.21 (#1037 )
fix(release): use signed NSIS installer for updates (#1036 )
handoff: pass full session history to summarizer (#1033 )
feat(emoji): latest-set-wins union for custom emoji across desktop, mobile, and CLI (#989 )
Fix relay NIP-11 software URL (#1030 )
...
# Conflicts:
# Cargo.lock
# crates/buzz-acp/src/config.rs
# crates/buzz-acp/src/relay.rs
# crates/buzz-acp/src/serverless_relay.rs
# crates/buzz-cli/src/client.rs
# crates/buzz-cli/src/commands/channels.rs
# crates/buzz-cli/src/commands/mem.rs
# crates/buzz-cli/src/lib.rs
# desktop/scripts/check-file-sizes.mjs
# desktop/src-tauri/Cargo.lock
# desktop/src-tauri/src/commands/messages.rs
# desktop/src-tauri/src/commands/mod.rs
# desktop/src-tauri/src/events.rs
# desktop/src-tauri/src/lib.rs
# desktop/src-tauri/src/managed_agents/runtime.rs
# desktop/src-tauri/src/relay.rs
# desktop/src/app/AppShell.tsx
# desktop/src/app/AppTopChrome.tsx
# desktop/src/features/messages/hooks.ts
# desktop/src/features/sidebar/ui/AppSidebar.tsx
# desktop/src/features/workspaces/ui/AddWorkspaceDialog.tsx
# desktop/src/features/workspaces/ui/WelcomeSetup.tsx
# desktop/src/features/workspaces/workspaceStorage.ts
# desktop/src/shared/api/tauri.ts
# justfile
2026-06-16 13:09:55 +10:00
Will Pfleger
d99ad131f1
refactor: rename sprout backend to buzz ( #958 )
...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com >
Signed-off-by: Will Pfleger <wpfleger@block.xyz >
Signed-off-by: Will Pfleger <wpfleger@squareup.com >
Signed-off-by: Will Pfleger <wpfleger96@gmail.com >
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1fgdl5qqnh3k3f2xkqrvt7cujalhm623x4s7fdjdj5yrtp5fzjl9qrjpucw <4a1bfa0013bc6d14a8d600d8bf6392efefbd2a26ac3c96c9b2a106b0d12297ca@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub16v54tttfqacx9ycvc3k0ut0npj564ahcuajzy6qjvh57ntmsf4uq4806j2 <d32955ad69077062930cc46cfe2df30ca9aaf6f8e76422681265e9e9af704d78@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Will Pfleger <wpfleger96@gmail.com >
2026-06-10 19:29:51 -04:00
tlongwell-block
421593062f
mesh: Rust-owned coordinator — fix saved-agent reconnect flakiness + DRY the start path ( #879 )
...
Signed-off-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Signed-off-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co >
2026-06-09 10:59:28 -04:00
Michael Neale
15f038748f
Merge remote-tracking branch 'origin/main' into micn/serverless-mode
...
* origin/main:
chore(release): release version 0.3.12 (#886 )
Show hover cards for inline message emoji (#885 )
Fix monotonic read-state merges (#884 )
Refine sidebar behavior and borders (#869 )
fix(presence): clear on disconnect, fix heartbeat/TTL, drop broken REST path (#877 )
fix(cli): publish ephemeral events over WebSocket via sprout-ws-client (#876 )
docs(sprout-acp): add communication discipline rules to base prompt + deprecate --mention flag (#883 )
Polish thread summaries and reactions (#881 )
feat(cli): add emoji export and import subcommands (#882 )
Polish message row hover states (#880 )
Improve emoji naming and custom emoji UX (#878 )
docs: add ecosystem section to CONTRIBUTING.md, fix stale release info (#873 )
fix(relay): wire custom filter fields through HTTP bridge (#864 )
chore: deprecate sprout-mcp — fill CLI gaps, remove crate and all references (#850 )
Fix custom emoji status in profile popover (#874 )
fix(agent): gate handoff on provider token usage, not byte estimate (#821 )
docs: add VISION_MESH.md — the compute-commons vision (#867 )
fix(desktop): simplify profile popover header (#853 )
fix(desktop): remove thread comment hover outline (#861 )
feat(desktop): always show channel section search/add buttons (#856 )
# Conflicts:
# crates/sprout-cli/src/client.rs
# desktop/src/app/AppShell.tsx
# justfile
2026-06-06 15:21:14 +10:00
Will Pfleger
ef98ae942a
fix(cli): publish ephemeral events over WebSocket via sprout-ws-client ( #876 )
2026-06-05 16:26:30 -04:00
Will Pfleger
f1c672fea5
chore: deprecate sprout-mcp — fill CLI gaps, remove crate and all references ( #850 )
2026-06-05 12:31:52 -04:00
Michael Neale
4c49c8f521
Merge remote-tracking branch 'origin/main' into micn/serverless-mode
...
* origin/main: (36 commits)
fix: use immutable commit-SHA URLs in screenshot PR comments (#842 )
feat(mobile+desktop): two-tier Slack-style app icon badge (#802 )
chore: simplify file-size check to a flat 1000-line limit (#839 )
fix(desktop): robust emoji picker — unify picker + fix custom emoji in editing, status, reactions (#837 )
feat(desktop): reusable screenshot workflow for agents (#826 )
desktop(mesh-llm): let a serving node route a different model (#833 )
chore(release): release version 0.3.9 (#832 )
fix: native arbitrary-file download + image context-menu flash (#830 )
fix(desktop): custom emoji reaction rendering + picker autofocus (#831 )
Mesh-LLM v1: relay-gated direct-iroh inference between users (WAN) (#822 )
chore(release): release version 0.3.8 (#829 )
chore(release): release version 0.3.7 (#825 )
feat: code block rendering, syntax highlighting, and compose fixes (#803 )
feat: custom emoji — user-owned NIP-30 sets with a client-side union (#816 )
Install sprout-cli skill at repo root + fix desktop clippy (#818 )
fix(desktop): use public re-export path for ensure_client_node_for_model (#824 )
refactor(desktop): feature-gate mesh-llm-sdk behind optional Cargo feature (#823 )
fix(desktop): align workflow read/save commands to the frontend contract (#820 )
fix(desktop): disable mesh-llm auto-build to prevent git config corruption (#819 )
fix(desktop): clear clippy lints in agents/mesh_llm commands (#817 )
...
# Conflicts:
# Cargo.lock
# desktop/scripts/check-file-sizes.mjs
# desktop/src-tauri/Cargo.toml
# desktop/src/app/AppShell.tsx
# desktop/src/app/AppTopChrome.tsx
# desktop/src/features/messages/hooks.ts
# desktop/src/features/workspaces/useWorkspaceInit.ts
# desktop/src/shared/api/tauri.ts
2026-06-04 15:08:56 +10:00
Michael Neale
a4183e263c
test(serverless): prove agent replies in DM (gift-wrapped, deterministic channel id)
...
Adds agent_responds_in_dm_e2e — completes the functional trio (public
channel, private channel, DM). A DM in serverless is a private channel
with a deterministic UUIDv5 id derived from the participants (matching
desktop/src-tauri/src/commands/dms.rs). The message is gift-wrapped to
the agent; the test asserts the agent decrypts it and replies.
All three pass against live public relays (3 passed; 0 failed).
2026-06-04 06:45:00 +10:00
tlongwell-block
33cfc85293
Mesh-LLM v1: relay-gated direct-iroh inference between users (WAN) ( #822 )
...
Signed-off-by: Eva <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: npub1t2tgm7d8f995uqvmnm8h88sg3wnpp9a5xysjf6dg3tjmgt3ltulqdp8ehr <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@sprout-oss.stage.blox.sqprod.co >
Co-authored-by: Max <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co >
2026-06-03 10:49:09 -04:00
Michael Neale
cc9b0b22c4
refactor(serverless): back agent relay layer with nostr-relay-pool
...
The serverless agent path hand-rolled multi-relay subscribe/reconnect/
resubscribe/dedup in relay.rs — reimplementing what nostr-relay-pool
(rust-nostr) already does, with gaps that caused the agent to miss
messages when a single relay 502'd mid-session.
Replace the serverless backend with nostr-relay-pool's RelayPool, which
provides the standard Nostr client model used by damus/0xchat/nostr-tools:
- persistent REQ per relay, fanned out across all relays
- auto-reconnect (default) with jittered backoff
- auto-resubscribe on reconnect (relays replay stored events on REQ)
- merge + dedup across relays (Event notification = first-seen only)
HarnessRelay now dispatches to ServerlessRelay when serverless; server
mode (NIP-42 AUTH + HTTP bridge) is unchanged. RestClient and the typing/
presence publisher share the pool. Subscription IDs match the server-mode
scheme so event routing is identical.
Proven: e2e_agent_responds passes 3x consecutively (~3s each) against live
public relays, surviving damus 503s via nos.lol.
- 272 unit tests pass, clippy clean
2026-06-03 07:16:12 +10:00
tlongwell-block
ede8ddb425
Sprout × mesh-llm: in-process mesh node (serve/consume) + relay admission ( #798 )
2026-06-02 10:28:20 -04:00
Michael Neale
1293881b72
fix(serverless): multi-relay fan-out for agent CLI + harness, prove agent replies e2e
...
The serverless agent never actually posted a reply: three real bugs,
each found by an end-to-end test against live public relays (no LLM).
1. CLI replies hit a single relay. `sprout messages send` used only the
first relay, so when that relay rate-limited the agent ("noting too
much") the reply was dropped. SproutClient now fans out reads/writes
across the full relay list — publish succeeds if ANY relay accepts,
queries merge+dedup. lib.rs passes the whole ws list, not just the first.
2. Agent harness died on a single relay 503. RestClient (channel discovery,
sibling checks) queried only the primary relay; a damus 503 crashed
discovery with "channel discovery error". RestClient now holds the full
relay list and fans out the same way — one relay down no longer kills the
agent. HarnessRelay carries relay_urls; rest_client() passes them through.
3. CLI panicked on wss:// (no rustls CryptoProvider). The serverless WS
transport (tokio-tungstenite) builds TLS directly and, unlike reqwest,
does not auto-install a provider. Install aws_lc_rs at CLI startup.
This is the standard Nostr client model (damus RelayPool, nostr-tools
SimplePool): relays don't gossip, so a client publishes-to-many,
reads-from-many, and dedups. Server mode is unchanged (single URL, HTTP bridge).
New e2e test (crates/sprout-acp/tests/e2e_agent_responds.rs + stub_agent.sh):
creates a channel + adds the agent, spawns the real sprout-acp harness with a
no-LLM ACP stub, posts an @mention, and asserts the agent's reply lands on the
relay. Passes in ~6s even while damus is 503-ing the whole time.
Also: fix pre-existing channels-subcommand stability test drift (PR #712 added
`channels search`); remove paid/auth relays already done; drop dead helpers.
2026-06-02 18:02:12 +10:00
Michael Neale
84f84931f1
feat(serverless): run channels, DMs, messages, and agents against a generic Nostr relay
...
Adds a 'serverless' workspace mode that points the desktop app at any generic
public Nostr relay (e.g. wss://relay.damus.io) with zero Sprout server
infrastructure — no Postgres, no HTTP /query|/events bridge, no NIP-98 auth.
Reuses Sprout's native event kinds (39000 channel metadata, 39002 membership,
kind 9 messages, h-tag scoping); 'serverless' is purely a transport + auth
concern, so the server-mode path is untouched.
Transport: reads/writes go over plain WebSocket (REQ/EOSE, EVENT/OK) instead
of the HTTP bridge; NIP-42 AUTH is answered only if the relay challenges.
Desktop backend:
- AppState.serverless flag + is_serverless(); apply_workspace gains a flag
- ws_relay.rs: query_relay_ws / submit_event_ws / publish_signed_event_ws
- relay.rs: query_relay/submit_event + agent profile sync branch to WS
- events.rs: build_channel_metadata_serverless (39000) + members (39002)
- create_channel/open_dm publish those events directly (DM ids = UUIDv5 over
sorted participants so both sides converge without a server)
- managed agents inherit SPROUT_SERVERLESS into the ACP subprocess env
Agents (full support, not a follow-up):
- sprout-acp: RestClient + HarnessRelay gain serverless mode; query/submit use
plain WS, NIP-42 handshake skipped on (re)connect; SPROUT_SERVERLESS env/arg
- sprout-cli: SproutClient serverless WS query/submit; --serverless flag,
to_ws_url helper, NetworkMsg error variant
- npub respond-to permissions are in-process and work unchanged
Frontend:
- Workspace.mode + workspaceMode()/isServerlessWorkspace() helpers
- relayClient.setServerless() skips the AUTH-wait on connect; late challenges
still answered so writes succeed on relays that require auth
- ServerlessContext/useIsServerless() hides search, pulse, projects, workflows
- Serverless toggle in the Add Workspace dialog and Welcome screen
Docs: docs/SPROUT_LITE_MODE.md updated with the implementation + testing steps.
2026-06-01 20:42:29 +10:00
renovate[bot]
efa93c4383
chore(deps): update rust crate sqlx to 0.9 ( #740 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Will Pfleger <wpfleger@block.xyz >
Co-authored-by: Will Pfleger <pfleger.will@gmail.com >
2026-05-25 21:32:34 +00:00
renovate[bot]
e5c35bb59e
chore(deps): update rust crate serde_json to v1.0.150 ( #737 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Will Pfleger <pfleger.will@gmail.com >
2026-05-23 23:53:59 +00:00
renovate[bot]
4278eb5202
fix(deps): update rust crate similar to v3 ( #690 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-23 03:19:20 +00:00
renovate[bot]
0de910f14d
fix(deps): update rust crate toml to v1 ( #691 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-22 21:45:59 -04:00
Will Pfleger
a65b7fc06f
fix(deps): migrate nostr crate from 0.36 to 0.44 ( #708 )
2026-05-22 17:17:11 -04:00
tlongwell-block
8bc94413eb
feat(relay/git): git on Sprout, S3-backed ( #726 )
...
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: Dawn <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@users.noreply.sprout >
Co-authored-by: Sami <sami@users.noreply.sprout >
Co-authored-by: Quinn <quinn@users.noreply.sprout >
Co-authored-by: Mari <95cae996907d7cab9f5dbf43c0f53edeac6ab0b032a6feae4abfd784e467b3f5@users.noreply.sprout >
Co-authored-by: Eva <eva@users.noreply.sprout >
Co-authored-by: Tyler Longwell <tyler@block.xyz >
2026-05-22 15:05:07 -04:00
Will Pfleger
d0d2670fe2
fix(deps): upgrade redis 1.0 and deadpool-redis 0.23 together ( #703 )
2026-05-21 17:55:44 -04:00
Will Pfleger
d4f55cee3c
fix(deps): upgrade getrandom to 0.4 with fill() rename ( #704 )
2026-05-21 17:40:18 -04:00
tlongwell-block
962dd7dced
feat(sprout-agent): auto-fallback to Databricks OAuth ( #699 )
...
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com >
2026-05-21 13:05:58 -04:00
tlongwell-block
fa9e26fa5c
feat(sprout-agent): Databricks provider with OAuth 2.0 PKCE auth ( #698 )
...
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: Dawn (sprout agent) <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co >
2026-05-21 12:08:24 -04:00
renovate[bot]
e08a971abf
chore(deps): update rust crate dashmap to v6.2.1 ( #652 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-20 23:09:12 +00:00
renovate[bot]
9df214d43a
chore(deps): update rust crate tower-http to v0.6.11 ( #647 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-20 23:08:56 +00:00
renovate[bot]
0dd9a05948
fix(deps): update rust crate sha2 to 0.11 ( #665 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-20 22:54:25 +00:00
renovate[bot]
881ed204bb
chore(deps): update rust crate metrics to v0.24.6 ( #638 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-20 22:47:35 +00:00
renovate[bot]
9f4adcc74c
chore(deps): update rust crate rmcp to v1.7.0 ( #656 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-20 22:39:39 +00:00
tlongwell-block
c9dd97ba1a
feat(cli/mem): add mem patch, mem hash, and reject empty-stdin in mem set ( #627 )
...
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: Dawn (sprout agent) <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co >
2026-05-20 14:51:30 -04:00
tlongwell-block
24520aa2b1
NIP-AE: agent engrams (kind:30174) — core memory injection + sprout mem CLI ( #593 )
...
Signed-off-by: Tyler Longwell <tlongwell@squareup.com >
Signed-off-by: Tyler Longwell <109685178+tlongwell-block@users.noreply.github.com >
2026-05-19 13:16:37 -04:00
tlongwell-block
70cb53e2c7
Add Sprig all-in-one agent binary ( #605 )
...
Signed-off-by: Tyler Longwell <tlongwell@squareup.com >
2026-05-17 13:31:58 -04:00
tlongwell-block
92c859043c
dev-mcp: add view_image tool ( #602 )
...
Signed-off-by: Tyler Longwell <tlongwell@squareup.com >
2026-05-15 16:21:16 -04:00
Wes
1d604e8b2e
Update Rust dependencies for pair relay ( #534 )
2026-05-11 10:47:22 -07:00
tlongwell-block
70a691517b
feat: automatic git auth and signing for sprout agents ( #528 )
2026-05-11 10:38:45 -04:00
tlongwell-block
91f16e326f
feat: embed sprout CLI in dev-mcp, add NIP-OA auth tag support ( #525 )
2026-05-11 06:57:34 -04:00
tlongwell-block
082414bf3f
feat: sprout-agent + sprout-dev-mcp — minimal ACP coding agent ( #493 )
2026-05-10 22:33:58 -04:00
Bradley Axen
c6da3a72ab
Add countdown bot reference example ( #516 )
2026-05-08 15:39:40 -07:00
Wes
3a12369491
feat: serve web UI from relay + repos page redesign ( #479 )
...
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com >
2026-05-05 19:20:13 +00:00
tlongwell-block
454781caae
Sprout speaks Nostr. Nothing else. ( #475 )
2026-05-05 12:03:06 -04:00
tlongwell-block
df33818b5b
feat(relay): NIP-OA agent authentication for NIP-43 membership (WS + REST + git) ( #471 )
2026-05-04 12:12:22 -04:00
tlongwell-block
15bd9ba2ac
feat: sprout-pair-relay — ephemeral sidecar for NIP-AB device pairing ( #467 )
2026-05-03 21:07:36 -04:00
tlongwell-block
1feb18e2e0
feat(git-sign-nostr): implement NIP-GS git object signing with Nostr keys ( #459 )
2026-05-03 10:05:30 -04:00
tlongwell-block
3899ca566d
feat(git): Role-based push permissions with service-bound auth ( #441 )
...
Signed-off-by: Tyler Longwell <tlongwell@squareup.com >
Co-authored-by: Tyler Longwell <tlongwell@block.xyz >
2026-05-01 00:25:33 -04:00
tlongwell-block
f23560d3d4
feat: Image & video uploads for MCP and CLI (Blossom protocol) ( #433 )
...
Co-authored-by: Tyler Longwell <tlongwell@block.xyz >
2026-04-30 14:35:02 -04:00
Bradley Axen
fcec10547d
Route ACP observer traffic over relay ( #421 )
...
Signed-off-by: Tyler Longwell <tlongwell@squareup.com >
Co-authored-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com >
Co-authored-by: Tyler Longwell <tlongwell@squareup.com >
2026-04-30 09:34:37 -04:00
tlongwell-block
121737f93f
NIP-34 git transport: Smart HTTP hosting with NIP-98 auth ( #419 )
...
Signed-off-by: Tyler Longwell <tlongwell@squareup.com >
2026-04-29 18:04:59 -04:00
Bradley Axen
7c2c556d72
feat: Add local ACP session observer ( #412 )
2026-04-29 04:21:58 +00:00
Wes
e2c94a8538
feat(mobile): image upload + media viewer parity with desktop ( #384 )
...
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-22 11:54:29 -07:00
renovate[bot]
12afa16cb1
chore(deps): update rust crate axum to v0.8.9 ( #365 )
...
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-20 06:28:22 -07:00
tlongwell-block
b8d6a5cf8b
feat: NIP-AB device pairing — Phase 1 (core library + CLI) ( #333 )
2026-04-16 14:56:36 -04:00