[DIS] Fiber Desktop v1 ground-up rebuild and launch — fnn desktop app

Milestone 2 complete: Wallet, Peers & Channels are live

Hi everyone,

Following up on the Milestone 1 updateMilestone 2 is done.

Since that post, the Wallet, Channels, and Network sections moved from placeholders to fully wired screens backed by the official fnn node. This update covers everything shipped from late June through v0.1.7


What M2 set out to do

M2 was about making Fiber usable end-to-end without JSON-RPC literacy:

  • Wallet — send and receive with human-readable CKB amounts
  • Invoice management — create, track, inspect, and cancel unpaid invoices
  • Peer management — connect to public relays and custom peers
  • Channels — open, list, and monitor channels through pending → ready states
  • Network — connectivity surfaced outside setup, plus a lightweight graph explorer

What you can do today

Download and install

Pre-release builds remain on GitHub for macOS, Windows, and Linux (Apple Silicon and Intel Macs, Linux x64 and ARM64):

Releases · chukwuma619/fiber-studio · GitHub

Latest tag: v0.1.7. These are still unsigned dev builds (Apple/Windows code signing and notarization are planned for M3). The README install guide covers first-launch warnings on macOS and Windows.


End-to-end payment test (testnet verified)

Beyond wiring the UI to fnn, we ran a full off-chain payment on testnet through Fiber Studio — create invoice → pay → confirm settled. It worked.

Field Value
Network Testnet
Amount 30 CKB (sent off-chain via Fiber)
Fee 0.03 CKB
Invoice note payment for test
Payment hash 0x87570729fd66eebe76a8cf51dcf80047a1fd69eb363c7f7adc448872943bc1b8
Result Payment sent successfully; invoice status Paid“Payment settled on the Fiber network”

Screenshots:

  1. Payment sent — confirmation modal showing “30 CKB sent off-chain via Fiber”, Success badge, fee 0.03 CKB

  2. Invoice paid — invoice details modal showing Amount 30 CKB, Status Paid, payment hash visible

This is the concrete E2E proof behind the grant checklist’s “setup → relay → channel → pay/receive” row — not just that the screens exist, but that money moved off-chain and the invoice settled.


Wallet — send, receive, and track payments

The Wallet tab is now a merged send/receive workspace:

  • Create invoice — amount in CKB (not raw shannons), optional expiry and note, QR code + copyable Bech32m string
  • Import invoice — add an external invoice to your local list by payment hash
  • Invoice list — filter by Active / Paid / All; inspect status, amount, and payment details (cancelled invoices appear under All)
  • Cancel unpaid invoices — via cancel_invoice (the app stores payment hashes locally because fnn has no list_invoices)
  • Send payment — invoice tab with parse-and-preview before confirm (amount, payee, route preview)
  • Keysend — direct pubkey payments with route preview
  • Payment history — sent payments with status, fees, route hops, and paginated “load more”
  • Relay routing warning — surfaced when your saved peer is not connected, so failed routes are easier to diagnose

Amounts throughout the wallet use human-readable CKB formatting. Home Recent activity also shows incoming invoices alongside payments.


Channels — open, monitor, close, and recover

The Channels tab covers the full channel lifecycle:

  • Open channel — pick from saved/connected peers; funding validation against on-chain balance and minimum capacity
  • Channel list — state badges for Opening → Awaiting signatures → Ready → Closing (plus failure/shutdown states where applicable)
  • Liquidity bars — local vs remote balance on ready channels
  • Channel detail — copy peer pubkey and channel ID; view capacity and state
  • Close channel — cooperative shutdown for active channels
  • Abandon channel — recover from stuck pending/failed opens
  • On-chain wallet balance — shown on the channels page for funding decisions
  • Refresh — manual reload with loading indicators (skeletons on initial load, spinners on refresh)

Testnet relay nodes in shared/relays.json include multiaddrs so channel opens can target documented testnet hubs directly.


Network — peers, relays, and graph browser

The Network tab is where connectivity lives after first-run setup:

  • Saved peers — add by pubkey + multiaddr, connect, and remove
  • One-click relay connect — official testnet relays from setup or Add saved peer
  • Connected peers — live list_peers view with bootnode/relay badges
  • Discovery connections — bootnodes shown separately (connect for gossip, not for opening payment channels); disconnect applies here, not to saved peers
  • Status summary — relay connectivity, saved-peer counts, gossip graph sync state
  • Gossip graph browser — paginated Nodes and Channels tables from graph_nodes / graph_channels (lightweight browse, not a block-explorer-style map)

Peer connection logic was hardened across this milestone: connection delays, graph-based address lookup when only a pubkey is known, P2P suffix normalization, and clearer error messages when saved peers fail to connect.


Settings and setup improvements (beyond the M2 checklist)

While building M2, several supporting pieces landed that make the app easier to run day-to-day:

  • Settings page — network switch (testnet; mainnet shown as coming soon), wallet password change, per-network data directories, open config/data folder, appearance (light/dark/system)
  • Legacy data migration — automatic move from the old ~/fiber-studio layout to network-specific directories on first launch
  • Setup wizard hardening — per-step validation, password confirmation, normalized private key input, clearer copy on every step
  • Unified error banners — consistent dismiss/retry feedback across Home, Wallet, Channels, and Network
  • Node-empty states — contextual guidance when the node is stopped or RPC is unavailable (instead of blank tables)
  • In-app updates — still active from M1 (check on launch + Settings); version bump script and publish workflow refined through v0.1.7

Node start/stop lives in the app header (visible on every page). View logs is available from Home and the header. Settings covers node configuration — config/data paths, wallet password, network switch — rather than a dedicated “Node” tab from the original proposal.


Technical / architecture notes

Under the hood, M2 added a substantial Rust command layer on top of the validated Tauri shell from M1:

Area What changed
Backend commands New wallet, network, and settings modules (~2,000+ lines) wrapping fnn JSON-RPC
Invoice storage Local invoice index + live get_invoice refresh (no upstream list API)
Payments list_payments pagination, hex-timestamp compatibility for fnn 0.8.1, route/fee display helpers
Peers Saved-peer persistence, bootnode detection, async connect with retry
Data layout Network-specific data directories with legacy migration
Frontend data layer Page-level caching, cache invalidation on mutations, loading skeletons, poll-in-flight guards
CI / releases Consolidated publish workflow, version:bump script, frozen lockfile installs, cross-compilation targets
Bundled node Official fnn v0.8.1 (unchanged pin from M1)

Rough scale of this milestone: 60 commits, 134 files changed since the M1 release


How this maps to the grant

M2 goal Status
Wallet — merged Send + Receive, human-readable CKB, invoice QR Done
Invoice management — local list, inspect, cancel unpaid Done
Peer management — list_peers, one-click public relays Done (+ saved peers, remove, bootnode awareness)
Channels — open, list, monitor, pending → ready Done (+ close, abandon, on-chain balance)
Network tab — connect flow surfaced post-setup Done
Network graph explorer — graph_nodes / graph_channels Done (paginated table view)
Dev builds on GitHub for testers Donev0.1.3 → v0.1.7
E2E testnet: setup → relay → channel → pay/receive Verified — 30 CKB off-chain payment on testnet; hash 0x87570729fd66eebe76a8cf51dcf80047a1fd69eb363c7f7adc448872943bc1b8; invoice settled (Paid)
Create invoice → appears in list → inspect/cancel Verified
Graph loads without raw JSON-RPC Verified
No protocol fork — official fnn RPC only Verified

What’s working now vs M1

Screen M1 (June) M2 (now)
Home Live dashboard + incoming invoices in recent activity, richer empty/error states
Wallet “Coming soon” Full send/receive, invoices, QR, payment history
Channels “Coming soon” Open, monitor, close, abandon, funding validation
Network “Coming soon” Peers, relays, graph browser, connect/disconnect
Settings Updates only Node/wallet config, theme, network switch, paths

Honest status — what’s left for M3

M2 focused on feature-complete app flows on unsigned dev builds. Still planned for Milestone 3 (launch):

  • Product launch — final brand, custom domain, marketing website
  • Signed distribution — Apple notarization, Windows Authenticode, Linux bundles
  • Operations — guided fnn upgrade wizard, auto-start & system tray, log export, expanded error playbooks
  • Mainnet — setup wizard still shows mainnet as “coming soon” (testnet is the supported path today)
  • v1.0.0 — signed final release + DAO completion report

Some M3-scope items landed early (payment history, invoice parse-preview, and basic in-app updates are already in the app), but tray, upgrade wizard, Apple/Windows code signing, and public launch remain M3 work.


What’s next

M3 is the finish and launch month: cross-platform testing, rebrand, website + custom domain, signing pipeline, and v1.0.0. I’ll post another update when the first M3 beta build (targeting v0.6.0 in the proposal) is ready for wider testing.


Try it and tell us what you think

We’ve already run the full testnet payment flow ourselves (see End-to-end payment test above). If you tested M1, this is a good time to repeat it on your machine:

  1. Fresh install → guided setup → node running
  2. Network → connect a public relay
  3. Channels → open a channel → wait for ChannelReady
  4. Wallet → create invoice → pay from a second node (or keysend)
  5. Network → browse gossip nodes/channels

Please share feedback here on Nervos Talk or open an issue on GitHub:

  • Does the Wallet send/receive flow make sense?
  • Is peer connection reliable on your network/OS?
  • Any confusion around channels vs peers (especially for multi-hop via a hub)?

The README now includes detailed Option A (direct) and Option B (multi-hop via hub) transaction guides if you want step-by-step checklists.

For those participating in the hackathon, feel free to use this when testing your projects (sending/receiving), without having to run any more terminal code :slightly_smiling_face:

GM everyone

6 Likes