Skip to content

Release v0.5.0 (retag) — promote dev to main - #152

Closed
bitwalt wants to merge 51 commits into
mainfrom
dev
Closed

Release v0.5.0 (retag) — promote dev to main#152
bitwalt wants to merge 51 commits into
mainfrom
dev

Conversation

@bitwalt

@bitwalt bitwalt commented Jul 10, 2026

Copy link
Copy Markdown
Member

Promotes dev to main so the current fixes ship under a re-tagged v0.5.0.

What's new since the last dev→main promotion (#151)

  • Buy-a-channel (step 2): restored the aggregated cost / fee-breakdown grand total, added step-2 guidance, and branded the order-creation loading state (fixes the "black page" while step 3 loads)
  • Payment: pre-selects a payment method, preferring Lightning (falls back to on-chain when that's the affordable option)
  • Dashboard: balance shows a loading placeholder instead of flashing 0 before the first fetch
  • Node: added a user-facing "Reconnect node" button in the profile menu (shared useNodeReconnect hook, also reused by the offline overlay)
  • Docs: fixed broken documentation links (FAQ, node hosting) to real pages
  • Plus the small post-Release v0.5.0 — promote dev to main #151 dev commits (Korean translation, order-channel LSP fix, market-maker onchain balance, README)

Net delta

~12 files, matching the main..dev content diff.

After merge

Retag the release:

git fetch origin
git tag -f -a v0.5.0 origin/main -m "KaleidoSwap v0.5.0"
git push -f origin v0.5.0   # republishes the v0.5.0 release via CI

🤖 Generated with Claude Code

bitwalt and others added 30 commits June 21, 2026 13:25
Release the KaleidoMind agent runtime as v0.7.0. The version marker now
mismatches every installed runtime, so the version gate (current_runtime_base)
treats stale trees as absent and re-downloads the corrected slim runtime on
next launch.

Built from the current npm pins (mind-provider ^0.6.0 → 0.6.1,
kaleido-mcp ^0.2.0, @qvac/sdk ^0.13.5) by the build-mind-assets workflow when
the mind-assets-v0.7.0 tag is pushed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
mind-provider 0.6.2 is the first provider release whose pinned core resolves
to @kaleidorg/mind 0.6.1 (on-device tool-output compression + atomic-recipe
safety guards); provider 0.6.1 on npm predated the core 0.6.1 publish. The
mind-assets-v0.7.0 runtime (ASSETS_TAG in mind_runtime.rs) builds from this
pin, so bumping it here makes the downloaded runtime carry the new core.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reduce visual noise on the Buy a Channel review/payment step while
keeping all information intact:
- Flatten the liquidity summary cards: drop the bordered corner badge
  box and show the per-section total inline
- Hide the redundant per-section total when there's only one section
  (single-BTC channel), since it duplicates the header Total capacity
- Use a neutral "Total" caption for the BTC section instead of repeating
  the "Confirmed Channel" title
- Collapse the triple-nested QR container down to the white QR tile
- Soften heavy shadows and borders on the summary panels

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Pins MCP_VERSION ^0.2.0 -> ^0.2.1 so the mind bundle picks up the fixed
kaleidoswap_get_quote tool (optional layers + buy-side to_amount). Pairs with
@kaleidorg/mind 0.6.2's corrected kaleidoswap-atomic recipe args, which the
provider (^0.6.2) pulls transitively — no PROVIDER_VERSION change needed.

Together these fix "buy 1 USDT" failing in chat with an MCP input-validation
error. The bundle is regenerated by prepare-mind-bundle at build time, so this
takes effect once both packages are published to npm.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
While the model is responding the send button becomes a red stop button that
cancels the in-flight turn (mind.cancelChat → sidecar cancel_chat → aborts the
running inference). The chat() promise then resolves with whatever was produced
so far and the turn ends cleanly.

- mind.ts: chat() accepts a caller-supplied chatId; new cancelChat(chatId).
- useMind.ts: expose cancelChat + thread chatId through chat().
- chat.tsx: track the in-flight chatId in a ref; Send↔Stop toggle; "tap ■ to
  stop" hint while responding.
- prepare-mind-bundle: PROVIDER_VERSION ^0.6.2 -> ^0.6.3 (cancel_chat support;
  pulls @kaleidorg/mind 0.6.4 with the AbortSignal plumbing).

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…ubmission)

Documents the 0.5.0 release for the QVAC hackathon submission: the on-device
KaleidoMind agent (chat, trade-by-chat atomic swaps, buy-channel-by-chat,
autonomy tab, stop button) plus the mind-runtime v0.7.0 bump and the recent
chat-swap quote + extraction-cancel fixes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds a prominent warning that the on-device agent and chat-based trading are an
early preview — rough edges, possible incorrect responses, and review-before-
approve guidance for spends.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The desktop app ships a Windows build and maps win → kaleidomind-win-x64.tar.gz,
but the mind-assets matrix only built mac/linux, so Windows users hit a 404
downloading the agent runtime. Add a windows-latest matrix entry; all @Qvac
engines the slim worker keeps (llm-llamacpp + bare-* addons) ship win32-x64
prebuilds in-package, and fetchNode() already handles node.exe.

Force bash as the job's default shell so the Package/Upload steps (and
tar/shasum/curl) work via Git Bash on the Windows runner.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
prepare-mind-bundle.mjs spawned bare `npm` via execFileSync (no shell). On
Windows npm is npm.cmd and execFile won't resolve the .cmd extension, so the
Windows mind-assets job failed with `spawnSync npm ENOENT`. Pick the
platform-correct binary (npm.cmd on win32) while keeping the no-shell safety.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Node 24's CVE-2024-27980 hardening refuses to spawn a .cmd/.bat through
execFile without a shell, so the previous npm.cmd fix traded ENOENT for
EINVAL. Add an opt-in `shell` flag to run() and enable it only for the npm
invocation on Windows. All args are static constants (no untrusted input), so
the no-interpolation safety property holds. curl/tar stay shell-less.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Under Git Bash, MSYS GNU tar shadows System32 bsdtar on PATH. GNU tar can't
extract the Windows Node .zip and misreads the `C:` drive prefix as a remote
host ("tar: Cannot connect to C: resolve failed"). Point the extraction at
System32's bsdtar (libarchive), which handles .zip and drive paths. Host-based
selection so cross-builds from mac/linux keep using plain tar.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Git Bash on the Windows runner ships coreutils `sha256sum` but not the Perl
`shasum`, so the Package step died with "shasum: command not found". Prefer
sha256sum, fall back to `shasum -a 256` (macOS). Both emit `<hex>  <file>`,
the format the app's checksum verifier parses.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Replace logo.svg references with kaleidoswap-pictogram in splashscreen and favicon
- Update full logo reference in README to kaleidoswap-full-logo
- Apply #15E99A → #6F32FF gradient to title and progress bar
- Change tagline to "Trustless trading on Lightning Network"
- Increase spacing between logo and tagline

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(splashscreen): update branding, copy and logos

- Replace logo.svg references with kaleidoswap-pictogram in splashscreen and favicon
- Update full logo reference in README to kaleidoswap-full-logo
- Apply #15E99A → #6F32FF gradient to title and progress bar
- Change tagline to "Trustless trading on Lightning Network"
- Increase spacing between logo and tagline

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(dashboard): sidebar hover effects, channel panel UX, asset row fixes

- Match sidebar nav item hover style to header icon buttons (primary color, scale)
- Separate chevron click (toggle submenu) from label click (navigate)
- Replace ArrowDownLeft/ArrowUpRight icons with Download/Upload in sidebar
- Add 25px top padding above Deposit/Withdraw quick-action buttons
- Rename "Create New Channel" to "Create Channel" (en.json + sidebar tooltip)
- Fix RGB asset quick-action button colors to match BTC (green/violet)
- Fix asset row tooltip clipping via React portal (position: fixed)
- Remove liquidity info footer text from dashboard
- Match Manage UTXOs border opacity to other outlined buttons
- Remove lock/unlock icon next to OPEN badge in channel list
- Move X/Y channel count next to Online chip, color it green

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…failures

categorizeError previously flagged any error whose message contained "network"
as a connectivity failure — so the RGB node's "recipient ID is for a different
network" (a 400 validation error) was reported as an unreachable node. Now:

- 400 → VALIDATION (non-retryable); connectivity heuristics only apply when
  there is no HTTP status code.
- transformSdkError forwards the kaleido-sdk KaleidoError statusCode/code so an
  explicit VALIDATION_ERROR/NETWORK_ERROR is trusted over the message heuristic.
- Add rgbPaymentErrors util + tests to map RGB payment failures to user-facing
  copy; wire into the Withdraw modal and wallet dashboard, with en/it strings.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Remove intro paragraph from support modal
- Unify troubleshooting card style with other cards
- Remove close button from support modal footer; center email link
- Remove gray bell icon from empty notification panel state

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
The dashboard and deposit asset picker only read listassets `.nia`, so a
received collectible (CFA), unique (UDA) or inflatable (IFA) asset never
appeared even though the node tracked it. Add getAllRgbAssets() to flatten all
four schemas into one display-ready list (falling back ticker→name→asset_id
since CFA has no ticker) and use it in the Deposit modal and wallet dashboard.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The rgbPaymentErrors.ts committed in 6b77418 had malformed indentation that
failed CI's `prettier --check`, turning dev red. Reformat it, and add the
rgbUtils.test.ts that was left untracked when getAllRgbAssets landed (6414b90).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…te (#137)

- Withdraw modal: remove nested card, left-align header with Upload icon
  and divider, move submit button to bottom-right (green), equal padding,
  MAX button inside amount input, SAT→SATS, remove max from placeholder,
  inline BalanceDisplay, confirmation step green Confirm + Back buttons
- Deposit modal: remove progress bar and nested card, left-align header
  with Download icon and divider, Continue button with ArrowRight
- Deposit BTC: amount→Test Coins order, unit in label row, full-width
  input, MAX button inside, max text below, BTC/LN logos replace chips,
  icon-only refresh button, sticky X button
- Deposit RGB: amount section matches BTC style, Lightning tab yellow
  when selected, green focus border, icon-only refresh button, RGB logo
  replaces address chip, Recipient ID borderless, remove gradient
  Generate Address button, remove zero-amount info card, no-channels
  warning as yellow banner
- Global: replace rgb-symbol-color.svg with rgb-logo.svg across all
  components; add lightning-logo.svg asset; SATS in Total Balance card
- Modal: X button moved outside scroll container (always visible)
- pnpm-workspace.yaml: approve esbuild + unrs-resolver build scripts

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* First fixes to trade page UI

* trade page fixes
A precision-0 asset (e.g. 200 units) displayed as 0.000002 and couldn't be
sent, because `assetInfo.precision || 8` treats the falsy 0 as "missing" and
falls back to 8 — so amounts were scaled by 10^8 (200/1e8 = 0.000002) for both
the available-balance display and the send-amount conversion.

Switch every `precision || N` fallback to `?? N` so an explicit 0 is honored,
keeping the fallback only for genuinely missing asset info. Covers the Withdraw
balance/amount path, StatusToast, swap history, channel creation, limit orders,
AssetRow, and the asset-channel quote hook. The central getAssetPrecision /
formatAssetAmountWithPrecision helpers already handled 0 correctly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…141)

Adopt kaleido-ui as the single source of truth for the design system and
move the app onto Tailwind v4.

- Tailwind v3 → v4 via @tailwindcss/vite; drop PostCSS config + autoprefixer
- styles.css: @import "tailwindcss" + "kaleido-ui/css"; @config for the
  app-local legacy palette; @custom-variant dark for class-based dark mode
- remove duplicated semantic token definitions from styles.css and
  tailwind.config.js (surface/content/border/status/primary/secondary/
  divider + typography now come from kaleido-ui@^0.1.70 via @theme)
- keep the app-specific legacy palette, spacing, and animations locally
- rewrite the 22 raw `var(--color-*)` usages to the `--app-*` channel vars
  exposed by kaleido-ui (styles.css scrollbars + DcaHistoryChart SVG)
- typography: Mulish -> self-hosted Satoshi (display) + Geist Mono; drop
  webfontloader and the Google-hosted Mulish load

Visuals are preserved: the desktop's slate palette is now the canonical
kaleido-ui semantic palette, and v4 opacity modifiers resolve via
color-mix(in oklab, C, transparent), equivalent to the prior rgba() alpha.

Verified: type-check, production build, lint (0 errors), 375/375 tests.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ss all history sections (#140)

* feat(history): redesign filters, sidebar nav, and UI consistency across all history sections

- Add 4-column filter grid (Search / All Assets / All Types / All Statuses) to all history sections (assets, deposits, withdrawals, swaps, channel-orders)
- Add new Select component with icon support and consistent dropdown styling
- RGB Assets: default to "All Assets" view; fetch all transfers in parallel when no asset selected
- Channel Orders: activate All Assets filter using listAssets for readable Name (TICKER) labels; add type filter (Bitcoin vs RGB Asset)
- Sidebar: add History submenu with all sections (same accordion pattern as Liquidity)
- Edit Columns panel: remove background, keep border only; rename button to "Edit Columns"; style with outline border
- Reset to Default: remove border, render as plain clickable text with RotateCcw icon
- Standardize refresh button style across all sections (outline, border-white/30, md size)
- Use consistent icons: Coins (All Assets), LayoutGrid (All Types), Calendar (All Statuses)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(history): remove section titles, inline refresh button, add tooltips, fix TS6133

- Remove title header (icon + h2) from all wallet-history section cards
- Move refresh button inline with filters row as rightmost element
- Add 'Refresh data' tooltip to all refresh buttons (matching Lightning Channels card style)
- Channel Orders: convert Edit Columns to icon-only button with tooltip
- Channel Orders: move column selector panel below filters row
- Channel Orders: rename panel title to 'Edit Columns'
- fix(select): remove unused React default import resolving TS6133 CI failure

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(history): bound listTransfers concurrency + surface per-asset failures

The All-Assets view fired one listTransfers per asset via unbounded
Promise.all on every load/refresh (thundering-herd on the local RGB node,
which serializes these). Cap concurrency at 5. Also, a per-asset failure
was silently dropped (try/finally, no catch) leaving an incomplete list
with no feedback; now surface a warning toast counting failed assets.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: bitwalt <walterm21@proton.me>
* feat(ui): redesign Liquidity page to match Trade layout

- Add ChannelsNav tab strip (Manage Channels / Open / Buy / Sell Channels coming-soon) matching TradeNav style
- Restructure channels, create-new-channel and order-new-channel pages with shared nav wrapper
- Update page title and icon to "Liquidity" + Droplets across all three routes
- Unify filter controls (tabs + Filter + Sort by) into a single row inside the card
- Replace StatCard icons with Wallet/ArrowDown/ArrowUp all in primary green style
- Match "Your Channels" card bg to StatCards (surface-overlay/80)
- Style Details button to match dashboard outline button; remove footer divider
- Replace Public Unlock icon with Globe; rename "Sell" → "Sell Channels" in sidebar
- Subtle channel card hover (bg-black/20); border on Filter/Sort by buttons

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* liquidity-page-fixes-#1

* feat(ui): Buy Channel flow polish + MM navigation

- WalletConfirmationModal: selectable Lightning/Onchain cards, single Pay
  button, yellow insufficient-balance banner, Deposit-style container
- BackConfirmationModal & LSP modal: match Deposit modal style, ghost/primary
  button patterns, inline X removed, spacing adjustments
- Deposit/Withdraw modals: X button moved inline with title row (prop-drilled
  onClose through LayoutModal → Content → each Step)
- Order status screens (Step5): full redesign — no cards, elements on bg,
  centered vertically; Expired/Failed use early-return branches with
  Return↔Action row; success uses one-shot confetti + ripple + checkmark
  animation with infinite green glow pulse; Expired gets scale+glow yellow
  pulse; Failed gets red glow pulse
- OrderProcessingDisplay: wallet-unlock ring animation, Channel Details-style
  Card with Amount/Method/Type/Asset/Order ID rows
- MarketMaker → Buy Channel: navigate to ORDER_CHANNEL_PATH with
  location.state { preselectedAssetId, returnTo }; Step2 locks asset dropdown
  when preselected; Step5 returns to returnTo on success/back
- i18n: rename Payment Failed→Order Failed, Order Completed!→Order Completed,
  Payment received!→Payment received; update successMessage copy

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(ui): rename "Total Balance" to "Total Lightning Balance" in Channels Management

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: migrate pnpm overrides from package.json to pnpm-workspace.yaml

pnpm v11 no longer reads the "pnpm" field from package.json.
Moved all overrides to pnpm-workspace.yaml and regenerated lockfile.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: bitwalt <walterm21@proton.me>
…rs (#143)

General UI polish: unified button radius, pending-channel dots, channel-card footer, DCA/Limit-Orders screens, Settings redesign.

Security-sensitive features from the branch were DISABLED before merge (shown 'Coming soon') because they did not work correctly:
- Change Password: only re-encrypted the local mnemonic copy without calling the node's /changepassword (which also requires the wallet to be locked), silently diverging the unlock password from the recovery-phrase password. Modal wiring removed; to be reimplemented as lock->changepassword->re-unlock.
- Auto Time-Lock: selector was never persisted and no inactivity timer consumed it (locked nothing).

Also: merged current dev (Tailwind v4 #141, history #140, buy-channel #142); kept dev's validated versions of Deposit/Step2, LayoutModal, MarketMaker and the history screens; removed dead imports so 'tsc && vite build' is green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…d→unlock (#145)

The prior modal only re-encrypted the local SQLite mnemonic copy and never
changed the node's unlock password, so the two silently diverged (it was
disabled in #143). This wires it to the node properly:

- Add `changePassword` to NodeApiWrapper + a `changePassword` mutation/hook
  in nodeApi (SDK already exposes RlnClient.changePassword).
- New flow: verify current password locally → lock the node (required by the
  node's /changepassword, which 403s while unlocked) → POST /changepassword
  → best-effort re-encrypt the local mnemonic copy with the new password so
  the recovery-phrase viewer stays in sync → route the user to the standard
  unlock screen to re-enter with the new password.
- Recoverable failure paths: if lock fails the session is untouched; if the
  change fails the wallet is locked but the password is unchanged and the UI
  tells the user to unlock with their current password.
- Drops the unvalidated seed-phrase fallback (not needed to change the node
  password; the local copy is only synced when it already exists).

Auto Time-Lock remains 'Coming soon' (separate feature, issue #144).

Refs #144. NEEDS ON-DEVICE VERIFICATION (node lock/unlock lifecycle).

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…oice history filter (#146)

* feat: docker-regtest connect preset, LN-only deposit max, pending-invoice history filter

Three additions:

1. Remote connect — 'Local Docker Regtest' preset. New regtestConnectionType
   'docker' + NETWORK_DEFAULTS.LocalDockerRegtest that points the node's
   backends at the kaleidoswap-maker docker hostnames (bitcoind:18443,
   http://esplora:3000, myproxy.local:3000) — the node runs inside the compose
   network so it resolves those, not localhost — and prefills the fixed regtest
   wallet password. Lets you unlock a node from `make start-channels` on :3001
   in one click.

2. BTC deposit max — use inbound_balance_msat (receivable liquidity) across
   usable channels instead of next_outbound_htlc_limit_msat (our send limit),
   and label it 'Max via Lightning' so it's clear the cap is LN-only; on-chain
   deposits stay unlimited. (Zero-amount invoice is already auto-generated on
   BTC select.)

3. Deposit history — add a 'Pending invoices' status filter that isolates
   unpaid zero-amount inbound Lightning invoices (off-chain, Pending, 0 sat,
   BTC).

tsc + vite build green. NEEDS ON-DEVICE VERIFICATION (node connect/unlock,
channel liquidity, invoice generation can't be exercised without a live node).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(wallet-remote): handle 'docker' regtest type in submit + node-url copy

The submit handler and the node-url description/placeholder still treated the
regtest connection type as binary (local vs bitfinex), so selecting 'Local
Docker Regtest' fell through to the Bitfinex branch — wrong LSP/maker defaults
on save and remote-flavored help text. Both now handle 'docker'.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
testConnection reported any 403 as 'Authentication failed', but
rgb-lightning-node returns 403 for a LOCKED node and 401 for a genuine
auth failure. Connecting to a not-yet-unlocked node (e.g. the docker
regtest node) wrongly failed the connection test. Now: 401 -> auth error;
403 with name 'LockedNode' -> node reachable (success), unlock proceeds
on the next step.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The account-creation path (handleTermsAccept) re-checked /nodeinfo with the
same 403->'auth failed' logic, so creating an account against a reachable but
locked node failed with 'Authentication failed'. Now it mirrors the connection
test: 401 = auth error; 403 'LockedNode' = reachable, create the account and
route to the unlock screen (instead of the dashboard) so the node can be
unlocked with its password.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
bitwalt and others added 21 commits July 6, 2026 16:47
…k step

The deposit modal always opened on Step1 (asset picker), so a BTC deposit
needed an extra asset-select + 'Continue' click before the address/invoice
was generated. Now it opens directly on Step2 (which already auto-generates
the on-chain address + zero-amount LN invoice), defaulting to BTC or the
asset the deposit was launched for. Back returns to the picker to switch
assets.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… default

Unpaid zero-amount BTC Lightning invoices (e.g. the one auto-created when the
deposit screen opens) cluttered the deposits history. They're now excluded
from the default list and only shown via the 'Pending invoices' filter.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… step)

Reverts the skip-Step1 change: the asset picker (BTC vs RGB) stays. The real
issue was that the BTC address/QR/invoice block was gated on `address` — the
RGB-only field that is never set for BTC — so the auto-generated
onchainAddress/lnInvoiceStr were produced on mount but never displayed,
making it look like nothing generated. Gate the BTC block on
onchainAddress||lnInvoiceStr instead, and show a spinner while generating.
So: pick BTC -> address is generated and shown immediately, no extra click.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Use the largest next_outbound_htlc_limit_msat across all channels for the BTC
Lightning deposit max, rather than max inbound_balance_msat.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Removed the (non-functional, 'Coming soon') Auto Time-Lock row and its now-unused
Timer import from Security & Backup.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…148)

* feat(ui): general UI polish — splash, channel flows, history, modals

- Splash screen: remove card-in-card double border; softer orbs with purple+green colors
- Buy Channel (order-new-channel): fix LSP confirm modal clickability (pointer-events-auto); center modal; fee selector styled to match Withdraw modal; Channel Lock Duration selector matches settings style; Step5 status screens match Create Channel card pattern with particle animations
- Open Channel (create-new-channel): fee selector styled to match Withdraw modal; fee rate label → "Fee Rate"; Step4 success screen adds particle animations, title → "Channel opening completed"
- Deposit RGB modal: fix Lightning double-click (inline component anti-pattern); fix Onchain border clip; rename "On-chain" → "Onchain"
- Channels list: replace Bitcoin logo img with Lucide Bitcoin icon (green)
- History: redesigned filters and sidebar nav across all sections
- Various modal and layout fixes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(ts): remove unused imports (ZapOff, IconButton) — fix CI type-check

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(ui): unblock content clicks, localize close-channel labels, surface LSP errors

- Layout/styles: #modal-portal covered #content-area at z-50 and, being
  pointer-events:auto by default, blocked all clicks/scrolls on the page
  whenever no modal was open (all ~33 modals now portal into it). Add
  `#modal-portal:empty { pointer-events: none }` so the empty overlay is
  transparent to input but modals still work once portaled in — no need to
  touch every modal overlay.
- i18n: forceClose / forceCloseChannel / closeChannel had raw English in
  de/es/fr/it/ja/zh; translate them (aligned with the cooperativeClose /
  forcedClose card labels). Restore Italian marketMaker.orders.activeTitle
  ("Ordini Limite Pianificati").
- order-new-channel: default-LSP auto-select failures were swallowed
  silently; show a toast with the reason while keeping the manual fallback.
- styles: wire the zap-icon hover pulse to the actual `.close-channel-btn`
  (the `.zap-btn` selector matched nothing, so the animation never fired).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(ui): stop tall modals from being clipped by the content area

Modals now portal into #modal-portal, which is absolute inset-0 inside
#content-area (a region shorter than the viewport whose overflow-hidden
clips its children). The scroll wrappers cap their height in viewport units
(max-h-[85vh]/[90vh]); on windows shorter than ~1000px that exceeds the
available space below the sticky top bar, so the modal's header/footer got
clipped.

Cap the modal scroll region to `calc(100vh - 7rem)` — the space actually
available below the top bar plus overlay padding — so tall modals scroll
internally instead of overflowing. Scoped to `#modal-portal .overflow-y-scroll`,
which is used only by the modal wrappers (nested lists use .overflow-y-auto),
so it fixes all current and future modals in one place.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(ui): restore step indicators + fix Peer Connection screen

- Reintroduce the wizard step progress indicator (removed in #142) as a
  reusable, data-driven ChannelWizardSteps component, shown in both the
  Open Channel (4 steps) and Buy Channel (5 steps) flows. Labels reuse
  existing translated keys — no new i18n.
- Open Channel → Peer Connection (Step1): the two flex-1 cards lacked
  min-w-0, so a 66-char peer pubkey (flex min-width:auto) blew the layout
  past the viewport and the existing `truncate` never took effect. Add
  min-w-0 so the cards shrink and the pubkey truncates.
- Peer rows now show a middle-truncated pubkey (start…end) instead of a
  clipped left-anchored string, so peers stay recognizable.
- Suggested-node button is now a labelled "KaleidoSwap LSP · Recommended"
  card with a chevron affordance instead of a bare logo tile.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* style: prettier-format Step1 (fix CI Check Formatting)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(ui): restore slider+input outbound selection in Buy Channel (Step2)

Since v0.5.0 the Buy Channel wizard's Step 2 replaced the shared
LiquiditySlider with four hand-rolled slider blocks, and the RGB-asset
outbound lost its numeric input entirely — you could only drag a slider,
and since AssetQuoteDisplay keys off clientAssetAmount the quote rarely
appeared.

Restore the v0.5.0 pattern by reusing the existing LiquiditySlider
(numeric input + slider + inbound/outbound readout + min/max) for both the
BTC and asset outbound selections, matching what BuyChannelModal still
uses. This:
- brings back typing an exact outbound amount (BTC and asset), alongside
  the slider and the quick % / MAX chips;
- makes the asset quote reachable again (type an amount -> quote shows);
- collapses two bespoke slider blocks into the shared component, removing
  the duplicated markup.

Bound to the same form fields (clientBalanceSat, clientAssetAmount) so
order submission is unchanged. Money-path UI — needs on-device check
against a live LSP before merge. The Market Maker "buy asset" path reroutes
into this wizard, so it inherits the fix.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* refactor(ui): declutter LiquiditySlider — drop duplicated outbound/inbound row

The widget showed the same values twice: the two summary cards ("Available
to send now" = outbound, "Can receive" = inbound) already carry the numbers,
then an "Outbound / Inbound" row above the bar repeated them.

Remove that row and instead legend the slider bar with small color dots on
the two card headers (outbound color on the send card, inbound color on the
receive card). Shared component — also cleans up the BuyChannelModal.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(ui): drop redundant per-step titles, enlarge step indicator

The step progress indicator already names the current step, so the big
centered <h3> title at the top of each wizard step was redundant. Remove it
from Open Channel Step 1–3 and Buy Channel Step 1–3 (the Step 4/5 result
screens keep their status headings). Bump the ChannelWizardSteps circles
(h-10) and labels (text-sm) so the indicator reads as the step heading.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(ui): add InfoHint tooltips to Buy Channel fields

Add a small reusable InfoHint (ⓘ trigger wrapping the shared Tooltip) and
attach it to the jargon-heavy labels in Buy Channel Step 2 — Channel
Capacity, Outbound Balance, and asset Amount — so users get plain-language
context on hover without cluttering the form. The BTC/asset outbound
LiquiditySliders already carry inline hints.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(ui): InfoHint tooltip collapsed to a narrow column

The Tooltip popover only had a max-width, so its shrink-to-fit width was
computed against the tiny icon wrapper and collapsed to ~1 word per line,
shooting the tall column up over the step indicator. Give it a fixed width
(w-64) and open it to the side (position="right") so it renders as a proper
readable box beside the field instead of overlapping the stepper.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: bitwalt <walter@kaleidoswap.com>
Co-authored-by: bitwalt <walter@kaleidoswap.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
… screen (#149)

* fix(kaleido-mind): style model pickers, drop redundant loading banner, fix modal race, restyle start screen

- Restyle the model <select> pickers to match History's filter dropdowns
  (leading icon, chevron, focus ring) in brain-launcher and start-brain-modal.
- Remove the duplicate "Loading model · X%" banner above the Outlet — Brain
  and BrainLauncher already show loading state inline.
- Lift a shared `starting` flag into useMind() so any startProvider() caller
  suppresses the offline "Start KaleidoMind" nudge modal immediately, closing
  the race window before the first provider_loading event that made the
  modal flash open at random.
- Drop the bordered card around the "Start your brain" screen and its
  loading state so it sits directly on the background, and restyle the
  loading state to match Market Maker's connecting animation (glow, glass
  icon panel, gradient text, splash progress bar) with brain-specific
  copy/icon.

* chore: update pnpm-lock.yaml

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Emile <emile@kaleidoswap.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: bitwalt <walter@kaleidoswap.com>
Skip saving channel orders that reached a failed/expired terminal state
with no payment made, and always store a fallback access token from the
BuyChannelModal so the history page can resolve status/amounts. Prevents
empty "Unknown" rows from cluttering the Channel Orders history.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Render mnemonic words in high-contrast content-primary instead of the
washed-out secondary/tertiary tokens, align numbers in a fixed-width
mono column, and make the Copy button full-width.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… prompt

Merge the LSP URL field into the "Maker & LSP Settings" section (they
usually point to the same endpoint), add a "Match default Maker URL"
shortcut and hint, and default the LSP URL to the default maker URL.

Also fix the save handler falsely reporting "node settings changed" on
maker/LSP-only edits: the nodeSettingsChanged check now compares against
the same normalized baselines used to seed the form, so it no longer
prompts a node restart when only maker/LSP URLs change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The reachability monitor now polls adaptively: 10s while healthy, 3s
while unreachable or unknown (startup), so the app reconnects on its own
within a few seconds instead of waiting on a slow tick or a manual retry.
The "Node is offline" modal shows a "reconnecting automatically" hint so
users know it's actively retrying.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bring the list-channels card back to the always-expanded layout: show
outbound/inbound amounts and labels without hover, add a per-section
header with the asset icon + ticker (BTC and RGB), and keep the footer
actions always visible.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
# Conflicts:
#	src/components/BuyChannelModal/components/PaymentSection.tsx
…tion

Expand the 0.5.0 entry beyond the KaleidoMind hackathon scope to cover the
full dev promotion: Tailwind v4 migration, history redesign, deposit/withdraw
modal redesign, Change Password, docker-regtest preset, all RGB asset schemas,
node reconnection, locked-node handling, and the Windows agent runtime build.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…-flow tweaks, i18n

WIP: MarketMakerFormPanel now takes an onchainBtcBalance prop (wiring in
MarketMakerTradingPage still pending — does not typecheck yet). Also includes
deposit Step1, order-new-channel, and locale updates.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Wire the existing onchainBtcBalance state through to the form panel, which
requires it to display the available on-chain BTC when trading without
channels. Resolves the TS2741 missing-prop error.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Full Korean locale translated from en.json (52/52 top-level keys, structure
and placeholders verified), registered in i18n config and the language
selector (🇰🇷 한국어).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…wizard

The buy-channel flow (order-new-channel) reset the user's configured
LSP/maker to the hardcoded network default on mount, silently prompting a
connection to a different LSP than the one set in Settings. Prefer the
account's default_maker_url/default_lsp_url and only fall back to the
network default when unset, and only rewrite the store when the base URL
actually changes — no more clobbering the configured maker connection.
Same fix applied to Step1's auto-init path.

Add a compact LSP indicator pill (status dot + host + node pubkey + copy)
across wizard steps 2–5 so the provider being ordered from stays visible.

Default the channel's total asset capacity to the asset max when a
preselected buy amount is passed (Step2), keeping inbound headroom.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add Kaleido Mind (the built-in AI assistant) and the Node/Mind capability
modes to the overview and feature list — previously undocumented. Note in
the overview, features, and Windows build instructions that Mind depends
on a local AI runtime and may not be available on Windows yet; trading and
node features are unaffected.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- order-channel: show aggregated cost + fee breakdown grand total on step 2,
  add step-2 guidance, brand the order-creation loading state (no black page),
  and pre-select a payment method preferring Lightning
- dashboard: treat the uninitialized balance queries as loading so the total
  shows a placeholder instead of flashing "0"
- node: add a user-facing "Reconnect node" button in the profile menu via a
  shared useNodeReconnect hook (also reused by the offline overlay)
- docs: fix broken documentation links (FAQ, node hosting) to real pages

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@bitwalt

bitwalt commented Jul 10, 2026

Copy link
Copy Markdown
Member Author

Superseded by #153 — that branch fast-forwards cleanly (this one conflicted due to the squash-merge history divergence).

@bitwalt bitwalt closed this Jul 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants