Seedelf-Wallet

A usability review of the built wallet, round two

A diagnosis: §1 to §8 are the review as it was written, and §9 says what the fix round did with each finding. It follows chunk 23’s first review (16c6539) and the fix round built on it, and looks at the wallet as it stands after both. Each finding has an ID (FR-1, ST-4, …) so a plan can point at it.

The brief was adversarial: treat every screen as guilty until proven usable, for someone who has never seen the wallet, hasn’t read the README, doesn’t know blockchain terms, clicks whatever looks like the next step, and leaves at the first sign they’ve made a mistake. So this is a list of problems. Where something works, it’s said only when that explains a finding.

Severity. P0 stops an important workflow. P1 is serious confusion or a likely failure. P2 is noticeable friction. P3 is polish. Nothing tested was a hard P0: every workflow could be finished by someone who already knew the way. The worst are P1s where a new user would most likely fail, give up, or believe they’d lost money.

Calls already open. Some findings land on product calls the first round left to the owner: renaming Make public, opening a new wallet on Public, Swap on Home, UTxOs behind Advanced, two decimals, a password on the wallet’s own sends, and the loading frame after create (L-1). Those are marked (open call). They’re here because they still hurt, not because the call was wrong to leave.

How it was tested

Since round one, and not repeated here: the strength hint is translated; the account picker has its own row; reviews carry “Total leaving” and a “balance after”; Home’s disabled actions say why, inline; browser Back works in a tab; private Send catches an ordinary address and links Make public; the phrase grid isn’t under a sticky foot; and private Send’s refusal now has a rebuild action. The new problems below are mostly where those fixes stop: the rebuild exists on private Send but not on swaps, mixes or site sessions, and “Total leaving” counts ADA but not tokens.


1. Top 10 UX failures

  1. A new wallet gets contradictory instructions, and the obvious path ends in the wrong advice (GS-1, GS-2, GS-3).
    • Get started says “Create your Seedelf: your public account pays for it, before any money is made private”.
    • Under the disabled Create button on the Private tab, the reason says “Make some ADA private first: these are paid from your private balance”.
    • Following the Public tab’s “Create a Seedelf” link with an empty wallet ends at: “Your private balance is empty. Make some ADA private first; the Seedelf is paid from there.”

    That’s the exact opposite of the advice that sent the user there, and it never names the real blocker, an empty public account.

  2. Restoring a wallet hides the words you type, then shows a blank screen (FR-1, FR-2). In the side panel the restore grid stays four columns of 46 px boxes, so “abandon” reads “aban” and “together” reads “toge”. After “Restore wallet” (and “Create wallet”) the screen goes blank except for the test-network banner: no header, no spinner, no words.
  3. A pending payment looks like a loss (HM-1, HM-2, HM-3).
    • After sending 10 LINK and 1.16 ₳ from 10,408 ₳, the public balance reads 69.475311 ₳, and LINK and the tUSDM-named token vanish until it confirms.
    • Making money private shows no “incoming” anywhere.
    • One public transaction in flight disables every private action too.
  4. Refusals end in dead ends, and one control says it’s sending when it isn’t (DX-1, PY-1).
    • Swaps, mixes and site-session funding still show round one’s error: “giveme.my, which lends the collateral, refused this transaction: Transaction Fails Validation. Its UTxOs may have been spent since the review: refresh, then review it again.” There’s no refresh, Send stays live, and pressing it says “That session was started already.”
    • On private Send, where the rebuild does exist, pressing “Refresh and review again” shows “Sending…” on the button while it only rebuilds.
  5. Site windows can be signed without seeing who gets paid (CW-1, CW-2).
    • At 400×605 the sticky password, Decline and Sign block covers the “Pays” list, and the amber “Signing ties them together on chain” warning is under it.
    • Choosing “A private session” shows a disabled Review and no amount field: it’s below the fold, and nothing says why.
  6. Cancel a site once, and it’s silently refused for up to a minute and a half (CW-3). After a Cancel or a closed window, the site’s next enable() calls were refused at once with “The user declined.” No window opened and the wallet showed nothing. A user who cancelled by mistake and clicks “Connect wallet” again sees nothing happen.
  7. Lovejoin hides whether mixing can happen, and when the money comes back (LJ-1, LJ-2).
    • The page shows a cost and an active Review. Only after Review does an alert at the very bottom say the pool “has 0 boxes to mix with … Mix fewer, or less deep”, when the user is already at the minimum of one box.
    • “Back later: each box on its own, after 1 to 6 hours” leaves out that boxes only come back while the wallet is unlocked.
  8. Staking’s destructive actions look routine, and progress shows on the wrong control (ST-1, ST-2, ST-3).
    • Pressing “Stop staking” or “Retire as a DRep” greys the whole page for about 10 s, with “Building…” on Withdraw rewards, off-screen.
    • Pressing Yes/No/Abstain on a proposal greys all three for about 8 s, with no sign of which one was pressed.
    • Stop staking’s review ends on the same teal Send as a payment, and so does every other staking, voting and swap review.
  9. Governance can’t be read (GV-1, GV-2).
    • The proposal list is rows of “Info action · Open until epoch 320, which ends 22 Oct 2026” that differ only in type and date.
    • A proposal says “Koios has no title or summary for it”, and its text is behind an ipfs:// link Chrome can’t open.
    • A DRep casts a “public and permanent” vote without being able to read what they’re voting on.
  10. What a Seedelf is, and who can pay one, is never said where it matters (GS-4, RX-1).
    • The only definition sits behind the ⓘ on Create a Seedelf: “A Seedelf is a name you can give out. Anyone can pay it…”.
    • Receive says, mid-paragraph, “Anyone with Seedelf Wallet can pay the name”.
    • The user will give the 5eed… code to a friend on Eternl, or to an exchange, and it can’t work.

Just outside the ten:


2. Workflow review

Each workflow: what the user wants, what the screens ask, where they diverge, and what had to be guessed.

First run

Create a wallet

Restore a wallet

Getting started

Receive

Pay someone from the public account

Pay someone from the private balance

Create a Seedelf

Make private

Activity and UTxOs

Staking

Voting power and governance

Swap

Lovejoin

Connect and sign for a site

Several accounts

Lock, unlock, forgot password, remove wallet


3. Screen-by-screen review

Welcome

FR-3 · P2 · A network choice on the first screen.

FR-9 · P3 · Copy and icon.

Create: the recovery phrase

FR-4 · P2 · Three blocks of text before the words, two of them about undefined things.

FR-5 · P3 · The primary button is below the fold at 1280×720.

FR-6 · P2 · Confirm words: the number reads as content, and a bad word is shown by colour alone.

FR-10 · P3 · Password step. Works (“Use at least 12 characters (5 so far)”, “Strong.”, “The passwords don’t match.”).

FR-2 · P1 · A blank screen after Create wallet and Restore wallet. (open call, L-1)

Restore and Check recovery phrase

FR-1 · P1 · The word grid cuts off words in the side panel.

FR-7 · P2 · “The phrase checksum is wrong; check the words and their order.”

FR-11 · P3 · The word count defaults to 24 everywhere. Check recovery phrase opens on 24 words for a 12-word wallet, although the wallet knows the length.

Home: a new wallet

GS-1 · P1 · Two opposite orders on one screen.

GS-2 · P1 · The Create link from the Public tab ends in the wrong advice.

GS-3 · P2 · A new wallet opens on the tab where nothing works. (open call: open on Public)

GS-4 · P1 · “Seedelf” is defined only behind an ⓘ on Create a Seedelf.

GS-5 · P3 · Back goes to a place the user didn’t come from. Private Receive → “Show my public address” → Back lands on Public Home, not on the private Receive screen.

Home: balances, header and status

HM-1 · P1 · A pending payment collapses the balance.

HM-2 · P2 · Nothing shows money in flight.

HM-3 · P2 · One transaction in flight locks both sides.

HM-4 · P2 · A submit that Koios didn’t answer reads as a hold-up of hours.

HM-5 · P2 · A failed refresh contradicts itself.

HM-6 · P2 · After an action, Home opens on Private and stale.

HM-7 · P2 · The chrome above the balance grows to half the panel.

HM-8 · P2 · Tokens: the warning is inconsistent, and titles are fingerprints.

HM-9 · P2 · Hide balances stops at Home. With balances hidden, Send still says “28 ₳ in your private balance”, Make private says “66.475311 ₳ available (includes 57.475311 ₳ of rewards)”, and reviews show full amounts. Activity and UTxOs do mask. If hiding is for screen-sharing, every screen has to honour it.

HM-10 · P2 · Destinations are split by tab. (open call: UTxOs behind Advanced, Swap on Home)

HM-11 · P3 · Status words describe mechanism.

HM-12 · P3 · Public Home’s strongest button is Make private. Send and Receive are outlined; the filled teal is Make private. It’s deliberate (private by default), but a user who wants to pay will press the bright one. Nothing says what it does until the next screen.

Receive and your Seedelfs

RX-1 · P1 · Private Receive doesn’t lead with who can pay it.

RX-2 · P2 · Removing a Seedelf sits on the Receive screen.

RX-3 · P2 · Remove a Seedelf asks a question the wallet says it can’t answer.

RX-4 · P3 · Public Receive.

Send (public)

PY-8 · P2 · The sticky Review button covers the form’s last fields.

PY-9 · P2 · Validation fires early, late or not at all.

PY-10 · P2 · Error messages name the wrong thing.

PY-4 · P2 · The review raises the amount and says so in small print.

PY-5 · P2 · Totals leave out what else leaves.

PY-6 · P2 · “Staking rewards collected” appears on payments nobody asked to collect.

PY-7 · P2 · Reviews and their details sheet speak operator.

PY-12 · P3 · Smaller Send issues.

Private Send and Make public

PY-1 · P1 · “Refresh and review again” says “Sending…”.

PY-2 · P2 · Paying an ordinary address from private is still called “Make public”. (open call)

PY-3 · P2 · Private Send has no Max. Make public has one. Sending a whole private balance to a Seedelf means guessing the fee.

PY-13 · P2 · Field help on Make public speaks to the vendor, not the user.

The disclosures are right; the words aren’t (“a public server learns which handle you looked up”; “up to 20 separate amounts at once”).

PY-14 · P3 · Make public’s review.

PY-15 · P3 · Private Send’s always-on timing note. “Sending right after making money private is easy to match by timing” shows on every private Send, including for money that arrived weeks ago. Show it only when a Make private is recent.

Create a Seedelf

PY-11 · P2 · The form’s words are mechanism.

Make private

Covered by PY-4, PY-5 and HM-2. The form itself is simple and clear.

Activity and UTxOs

AC-1 · P2 · Activity can’t name the other side.

AC-2 · P2 · Activity’s error has no way back. “Koios is having trouble right now (500 for account_txs)” in a red card with a large gap above it, no Try again, and no “Updated”.

AC-3 · P3 · Activity details.

AC-4 · P2 · UTxOs: one icon, two meanings, and silent changes. (open call: behind Advanced)

Staking and governance

ST-1 · P1 · Building progress shows on the wrong control, or nowhere.

ST-2 · P2 · Every staking, governance, swap and mix review ends on “Send”.

ST-3 · P1 · Stopping staking and retiring as a DRep look like any other row.

ST-4 · P1 · The pool list cuts off its own data and warnings at 360.

ST-5 · P2 · Every sort puts pools that pay nothing first.

ST-6 · P2 · Rewards are counted in the balance, then shown as if extra.

ST-7 · P2 · The staking page answers questions nobody asked first.

ST-8 · P2 · An oversaturated pool gets almost no friction. TPREP at 458 % full: the warning (“every delegator’s rewards shrink”) has no numbers, “Stake with TPREP” stays the primary button, and the review drops the warning. Say “about 4.6× over: you’d earn about a fifth”; keep it on the review.

ST-9 · P1 · With no spendable ADA, staking actions fail with the wrong reason.

ST-10 · P2 · Staking errors.

ST-11 · P2 · Back from a staking review loses the choice. Voting power resets to “Always abstain”, so the search and pick must be redone. The pool review’s Back skips the pool detail and clears the search.

ST-12 · P3 · Staking polish.

GV-3 · P1 · “Your own DRep” without being one: a disabled Review and a hidden reason.

GV-1 · P1 · Proposals can’t be told apart.

GV-2 · P1 · A proposal can’t be read before voting on it.

GV-5 · P2 · DReps can’t be judged from the list.

GV-6 · P2 · Each vote is a round trip through Home.

GV-7 · P2 · Becoming a DRep.

GV-8 · P2 · Unexplained governance terms. “Info action” and “Treasury withdrawal” have no gloss. “Always no confidence” is explained with “constitutional committee”, and its review has no warning that it’s a standing vote against the governing committee.

GV-9 · P3 · The DRep profile’s directory switch. “Ask DRep directories not to list it” is on by default, beneath copy saying a profile lets “others find it”. The private default is intended; the copy should reconcile the two.

dApps and swaps

DX-1 · P1 · A refused swap, mix or site-session funding is a dead end.

DX-2 · P1 · The swap review admits, in passing, that it can’t check what you’ll get.

DX-3 · P2 · The swap review is three screens of equal-weight text, and its costs don’t add up.

DX-4 · P2 · The swap form hides the important settings.

DX-5 · P2 · Swap sessions: Stop outlives the swap, and the end never says what arrived.

DX-6 · P2 · Swap is four taps deep. (open call: Swap on Home) Home → dApps (a plain row at the fold, under Tokens) → Minswap → New swap. The user has to know swapping lives under “dApps”.

DX-7 · P2 · Session names count failures. Every failed try uses up a number. The first site session was “Private session 4”, and the mix was “Private session 3”. Name sessions by purpose (“Swap 10 ₳ → MIN”, “dapp.example”).

DX-8 · P3 · dApps polish.

Lovejoin

LJ-1 · P1 · Whether mixing can happen shows only after Review.

LJ-2 · P1 · “Back later: Each box on its own, after 1 to 6 hours” leaves out the condition.

LJ-3 · P2 · The cost is the biggest thing on the page, without context or a balance check.

LJ-4 · P2 · “Waves” are never defined where the choice matters.

LJ-5 · P2 · A mix has no home. The page has only “Your boxes in the pool: None”, with no list of mixes in progress, failed or done. The failed “Private session 3” appeared on neither Lovejoin, Home nor dApps. During loading and failure the page still says “None”, with Review enabled.

LJ-6 · P2 · Mainnet’s seed offer pulls attention from mixing.

LJ-7 · P2 · Where publicly mixed boxes end up is unclear. The Public tab says “What the mixes don’t use comes back to your public account”. The note under both tabs says each box “comes back into your private balance on its own”.

Connector windows and sites

CW-1 · P1 · Sign a transaction: the recipient and the linking warning are under the password.

CW-2 · P1 · Connect, private session: the amount field is below the fold.

CW-3 · P1 · A cancelled site is refused silently.

CW-4 · P2 · A locked wallet’s window has no way out, and teaches a bad habit.

CW-5 · P2 · Which account a site gets is stated but can’t be changed where it matters.

CW-6 · P2 · Site connections live in two places, and the session page tells the wrong story.

CW-7 · P3 · Connector polish.

CW-8 · P2 · Settings → Sites and Collateral explain themselves in protocol terms.

Public accounts

PA-1 · P2 · Adding an account is a hunt.

PA-2 · P2 · The account picker shows where it means nothing.

PA-3 · P3 · Public accounts’ text. Two paragraphs (“Your private balance is shared…”, “Look for the next account and Check it each ask Koios about one account…”) explain query privacy before the user has an account to add. One sentence plus the ⓘ would do.

Settings, lock and removal

SE-1 · P2 · Settings is one long page, and starts with its riskiest control. (round one’s SET-1) 2,350 px at 360 (2,464 in Spanish), seven sections, opening on the network switch. Long paragraphs:

An index of sub-pages with Network further down would read as a menu.

SE-2 · P2 · The network switch shows Mainnet as chosen before it is. Pressing Mainnet marks it pressed while the header still says PREPROD and the footer “Preprod”. The confirmation (“Stay on Preprod” / “Switch to Mainnet”) is inline and clear, but the control says it’s already done. Leave Preprod pressed until confirmed.

SE-3 · P3 · Settings row labels.

SE-4 · P2 · Remove wallet and Forgot password explain an internal concept.

FR-8 · P2 · Removing the wallet lands on a new wallet’s phrase.

SE-5 · P3 · Lock and unlock work.

Languages

Spanish and Japanese held their layout on Home, Make public and Settings at 360 px: no horizontal overflow, nothing clipped by the measurement. Numbers stay in English format (“1,234.56”), the known gap.


4. Navigation and information architecture

The two-balance model is right, and it’s still never introduced.

The private balance has too many names, and so does the public account.

Each new name makes the user wonder whether it’s a new place.

Tabs decide where features live.

A user who wants “everything I’ve done” or “swap from my public money” has no route.

Verbs name mechanisms.

Every action ends on Home. Payments, Seedelf creation, withdrawals, votes and registrations all return to Home’s Private tab, with the success shown only there (HM-6, GV-6). The user loses their place, and in governance, where acts come in batches, they walk five screens back for each.

Back has three behaviours.

Expert pages are first-class. UTxOs is on Home; Collateral and “Account number” are top-level Settings entries; the transaction details sheet is one tap from every review. They belong behind an Advanced door (open call).

The tab is the panel, wider. At 1280 px every screen is a ~490 px column centred in white space. Activity needs scrolling at 720 px high while two-thirds of the window is empty. Nothing uses the width, for example balance and activity side by side.


5. Visual system problems

V-1 · Sticky feet still cover content. The rule from round one held on the phrase grid but not elsewhere:

Errors stacking in the foot make it grow to a third of the panel. The rule needs to cover every screen: a last block padded by the foot’s height, and errors beside what failed.

V-2 · Progress lives on the wrong element (ST-1, PY-1). The pressed control should carry its own progress label, and nothing else should change its label.

V-3 · Destructive actions have no visual class. Stop staking, Retire as a DRep, Remove a Seedelf and “Forget it” use the normal row or normal teal button. Only Remove wallet is red. One danger style (red text button → red-outlined review button) would mark all of them.

V-4 · Boxes inside boxes.

One level of container per screen; lists use dividers.

V-5 · The teal shield box means “privacy note” and “warning” at once. It carries reassurances (“A Seedelf’s name is public… What’s paid to it isn’t.”) and disclosures the user should act on (“This is an ordinary Cardano address: anyone can see what it receives”). Amber is used for some disclosures and not others. Pick one: teal for explanation, amber for “this exposes you”.

V-6 · Truncation in the wrong place.

Identifiers truncate in the middle, warnings never truncate, and inputs never clip their own content.

V-7 · Numbers.

V-8 · Icons with two meanings, or none.

V-9 · Ghost buttons that look disabled. “Check it” and “Add it” (Public accounts), “Name it”, and the small grey pills read as inactive until hovered. A secondary button needs a visible edge.

V-10 · Vertical budget in the panel. Brand row, account picker, test-network banner, alerts, tabs and the “Updated” line take 270–350 px of a 640 px panel before any balance (HM-7). At 360×480 the first screen is all chrome.

V-11 · Badges glued to names. “LOGICYours”, “TPREPOversaturated”, “…5et0yyKeeps all rewards”: no gap between a name and its badge.


6. Terminology problems

Term as shown Where Why it’s a problem Suggested
Seedelf (undefined) Home, Get started, Receive, phrase step The product’s core noun, defined only behind an ⓘ Define once, early: “a private payment name only Seedelf Wallet can pay”
Seedelf “name” (the hex) vs “tag” Receive, Send, Create The visible word isn’t the one that works “Seedelf address” (share this) and “label”
Make public Private Home, Send’s redirect Says nothing about paying anyone “Pay an address” (open call)
Send (on staking, voting, swap, mix, funding reviews) Every review Nine different commitments, one verb that means “money leaves” The act: “Stake”, “Withdraw”, “Stop staking”, “Cast vote”, “Start swap”, “Start mix”, “Fund session”
Sending… (while rebuilding) Private Send’s refusal Says money is moving when it isn’t “Building a new review…”
mint, “Seedelf mint sent” Status banner Mechanism “Creating your Seedelf…”
stealth mint Create a Seedelf Jargon “Pay privately”
burns the Seedelf’s token Remove a Seedelf Mechanism “Removes the Seedelf”
Koios; “tells Koios which one”; “(500 for account_info / pool_info / drep_info / tip / account_txs / credential_utxos)” Field help, every error A vendor and its endpoints “a public server”; “Can’t reach the network service. Try again.” Endpoints under Details
giveme.my; “lends the collateral” Every private review, swap errors Plumbing on the commit screen Drop from reviews; keep in Settings → About and the privacy policy
collateral (three meanings) Settings, session reviews, giveme.my One word for three things “Contract deposit” (Settings); “refundable deposit” (sessions)
UTxO(s), “up to 20 UTxOs”, “Spends 1 UTxO”, “UTxOs spent 1” Home, Max help, details, collateral review Cardano’s accounting unit “coins” or “separate amounts”
checksum Restore, Check recovery phrase Developer word “These words don’t make a valid recovery phrase”
Cardano account Insufficient-funds errors A third name for the public account “public account”
Seedelf balance Lovejoin’s seed error A fourth name for the private balance “private balance”
change Insufficient-funds errors Accounting term “the rest that comes back to you”
Reading the chain… Home, reviews Mechanism “Updating…”
build it again from the chain as it is now Private refusal Developer phrasing “Something changed. Make a new review.”
Signed: 2 signatures so far Transaction details, before Send Implies it’s already sent “Ready to send”
a key that stakes; payment key Transaction details, sign windows Key internals “your public account”
Valid until slot 135504880; Raw CBOR; Script data hash; mem · steps Transaction details Expert data Under “Advanced details”; slot as a time
Everything (as a row label) Make public’s review with Max Not a label “Amount (all of it)”
one-time account; private session N Swap, connector, Remove wallet A concept never introduced; the number counts failures “temporary account for this swap/site”; name sessions by purpose
Bring it back; Forget it; Stop Session pages Vague “Return to private balance”; “Remove from list”; “Cancel swap and return funds”
boxes; waves deep; mixes; Seed the pool Lovejoin, Settings Mixer internals “10 ₳ mixing units”; “Light / Standard / Strong”; “Help start the pool (gives you no privacy)”
batcher Swap timeline, Stop dialog DEX internals “Minswap’s order filler”
Saturation / % full Staking, pool list Two names, unexplained One: “How full (over 100 % pays less)”
Margin; Cost per epoch; Pledge Staking, pool list Operator economics “Pool’s cut”; “Fixed fee every 5 days”; “Owners’ own stake”
epoch 320; Inactive since epoch 189 Governance, DReps A unit users don’t count in Dates
DRep (first use) Staking Governance jargon “voting representative (DRep)” on first use
Info action; Treasury withdrawal; constitutional committee Governance Unglossed “Opinion poll (no on-chain effect)”; “Spending from the treasury: X ₳ to Y”; “the governing committee”
Its hash (blake2b-256); at most 128 bytes DRep profile Implementation detail “File fingerprint (goes on chain)”; “keep the address under ~120 characters”
Your rewards unlock either way Inactive DRep Locked rewards are never explained “You can still withdraw your rewards”
Review stopping; Review retiring; Review the vote / Review your vote Review titles Gerunds and near-twins “Review: stop staking”; “Review: retire as a DRep”; “Review: who votes for you”; “Review: your vote”
CIP-30 Settings → Sites A standard’s number Drop it
Lovejoin On, 2 waves deep Settings row Names the wrong switch “Mix session returns: On · Standard”
Account number (placeholder 1338) Public accounts A derivation index, with a joke placeholder Under Advanced; no placeholder
Signs as: Your address Sign message window Which one? “Signs with Account 1”
sends, net Sign transaction window Accounting term “sends in total”
choosing one asks nobody anything; searching it asks no one Language note, DRep search Developer reassurance in odd English “stays on this device”
preprod (lowercase) Errors The rest of the UI says Preprod “Preprod”

7. Missing UX states

Loading

Errors

Empty states

Pending

Success

Disabled states without a reason

Up-front affordability checks are missing on:

Each builds for 8–10 s and then fails.

Destructive actions

Onboarding


The smallest set of changes for the largest improvement, in order.

  1. Outright bugs, each bounded:
    • the restore grid’s columns (FR-1);
    • “Sending…” on a rebuild (PY-1);
    • Create’s reason on the private hero, and the empty-wallet Create form (GS-1, GS-2);
    • the stale #create hash after removal (FR-8);
    • the pool list’s clipping (ST-4);
    • staking’s progress on the wrong button (ST-1);
    • the network switch showing Mainnet early (SE-2).
  2. One refusal pattern everywhere. Private Send’s “Refresh and review again” becomes the rule for every review that can be refused: swap, mix, connector funding (DX-1). Error copy goes with it: no service names, endpoints, “UTxOs” or “checksum” in a message; every error has an action; the raw text sits under Details (HM-5, ST-10, AC-2, FR-7).
  3. Pending accounting. Show the expected balance after and any incoming amount, marked pending. Keep tokens listed. Lock only the side in flight, and say why on every screen that disables (HM-1–HM-4).
  4. Connector windows put what’s paid and every warning above the password. Focus the private amount on selection, and tell the user (and the site) about the decline cooldown (CW-1–CW-4).
  5. Verbs and danger. The review button says the act. Stop staking, Retire, Remove a Seedelf and Forget it get one danger style and a consequences list (ST-2, ST-3, V-3).
  6. The first-run model.
    • One closing onboarding screen: two balances, what a Seedelf is, who can pay one.
    • Get started’s next step is always the primary action.
    • Private Receive leads with “only Seedelf Wallet can pay this”.
    • A new wallet opens on Public (open call) (GS-3, GS-4, RX-1).
  7. Totals that count everything: tokens in “Total leaving” and on buttons; rewards shown as moved, not “collected”; raised amounts marked on the row (PY-4–PY-6, ST-6).
  8. Lovejoin’s truth on the page: pool status before Review, the unlock condition on the return, one cost figure, a balance cap on the stepper (LJ-1–LJ-3).
  9. Governance that can be read: distinguishable rows, a working link to the text, treasury amounts, the vote’s own progress, and staying on the proposal after voting (GV-1, GV-2, GV-6).
  10. Settings as an index, with an Advanced door for UTxOs, Collateral and accounts by number (open call) (SE-1, AC-4, PA-1).

Then: Activity that names the other side (AC-1), the pool sort (ST-5), the swap review’s three-row summary (DX-3), and one place for site connections (CW-6).

The usual rules apply to each change:


9. The fix round

What was done with each finding, on web-wallet/style-flow-3 after the review. Fixed means the change asked for, or one that meets the same need; partly says what’s left; left says why. The (open call) findings stay the owner’s.

Onboarding, restore and Settings

ID   What changed
FR-1 Fixed The word grid takes as many columns as keep an 8-letter word whole: two in the side panel, three from about 384 px, four in a tab.
FR-2 Fixed, in words The splash says “Reading your balances…”, and the password step says “Setting up your wallet…” or “Restoring your wallet…” while it works. Its timings and 8 s cap are untouched: that’s C2 and L-1 (open call).
FR-3 Left The network choice on the welcome screen is a product call.
FR-4 Left Moving the portability note needs the closing onboarding screen (§8, 6).
FR-5 Fixed Hide phrase beside “I’ve written it down”.
FR-6 Fixed “Word 7” is a label above each confirm box; a word off the list says so under its box at once.
FR-7 Fixed No “checksum” anywhere: Check recovery phrase says what Restore says.
FR-8 Fixed The #create/#restore hash goes once a wallet exists, so Remove wallet lands on the welcome and its “Wallet removed from this browser.”
FR-9 Fixed The welcome’s tab note fits Restore too.
FR-11 Fixed Check recovery phrase opens on the wallet’s own word count (a new worker request, phrase-words, which reads the length while unlocked and stores nothing).
SE-2 Fixed The network switch stays on the current network until the move is confirmed.
SE-3 Fixed The Sites and Lovejoin rows say what their On means; the rewards setting says why to turn it off.
SE-4 Partly “Show recovery phrase” is a link, and “one-time accounts” is plain words. No link to the dApps page from there.
PA-1 Fixed Add Account N once the next is found unused; your own account number is behind a toggle, with no placeholder.
PA-2, PA-3 Left Where the picker sits is a layout call (HM-7); Public accounts’ paragraphs are privacy notes. Since: the picker is Home’s Public heading (chunk 23).
SE-1 Left Settings as an index (open call).
CW-8 Fixed Sites’ copy drops “CIP-30”; Collateral leads with its status and purpose. A session’s 5 ₳ is “Kept aside for contracts” in every review.

Home, Receive, Activity and Create a Seedelf

ID   What changed
GS-1 Fixed Create has its own reason, in Get started’s order.
GS-2 Fixed With neither side able to pay, Create’s Review is disabled with “Fund your public account first”, and the public account is chosen unless only the private balance can pay.
GS-3 Left Opening on Public (open call). Since: the owner kept Home opening on Private (5 October 2026, the blind test’s Left for the owner).
GS-4 Partly Get started’s second step says what a Seedelf is and who can pay one, and the ⓘ no longer says “Anyone can pay it”. The onboarding intro needs the closing screen.
GS-5 Fixed Back from the public address returns to the screen that offered it (private Receive, Create, Staking).
RX-1 Fixed Private Receive’s first line: “Only someone using Seedelf Wallet can pay this. Anyone else needs your public address.”
RX-2 Fixed Remove is behind Manage on each Seedelf’s card.
RX-3 Fixed Each side’s card says in a line what it links. When the wallet can’t tell who paid, nothing is chosen, as privacy review §3.2 decided, and the note says the private balance is the safer guess. The fix round first chose it; its own review kept the choice the user’s, since either side can make a link they didn’t choose.
RX-4 Fixed The public address’s disclosure is amber, with a link to your Seedelfs’ names.
HM-1, HM-2 Fixed, bounded The worker counts what the wallet’s own recent transactions are bringing back (background/incoming.ts, no request), so a pending payment no longer collapses the balance: each side says what’s on its way, and tokens coming back stay listed. The forms spend only what’s on chain. No pending row in the public Activity.
HM-3 Partly Every screen that disables for a transaction in flight says why. Which side the hold locks is the owner’s call.
HM-4 Fixed The banner leads with “not confirmed yet: don’t pay it again”, has Check now, and the far horizon (dated when it isn’t today) is under Details.
HM-5 Fixed One timestamp, Details inside the alert, and the alert clears on the next good reading.
HM-6 Fixed Home opens on the side a transaction spent from, and keeps the tab across reloads (until a lock).
HM-7, HM-10, HM-12 Left Layout and open calls; Make private as the bright button is deliberate.
HM-8 Left Marking every unlisted token would mark almost every token on a testnet wallet: a product call.
HM-9 Fixed Hidden balances are hidden on the forms too (asides, Max, notes), and on the swap, Lovejoin, DRep and top-up lines. Reviews still show what’s sent, on purpose: it’s read before sending.
HM-11 Fixed “Seedelf creation sent”, and “Updating…”.
ST-6 (Home) Fixed “Includes X ₳ of staking rewards” under the public balance, and says when payments don’t spend them.
AC-1 Fixed Addresses are cut in the middle. Staking rows were already named from their certificates: the plain “Sent” rows were the fake chain’s.
AC-2 Fixed Activity’s error has Try again and the service’s words under Details.
AC-3 Partly Titles wrap, “Already in your private balance” explains itself, and Save as CSV says how many rows it saved.
AC-4 Fixed A pin, not the padlock, for keeping a UTxO apart; a confirmation; and whose address the detail shows.
PY-11 Fixed The private option is no longer “A stealth mint”, and the tag’s label says anyone can read it.

Payments and reviews

ID   What changed
PY-1 Fixed A refusal’s foot stays until the new review is in, saying “Building a new review…”, and the new review says it was updated.
PY-2 Left Renaming Make public (open call).
PY-3 Left Max on private Send needs a core builder that pays one Seedelf everything (like sweep_from), then WebAssembly and the form’s Max. Since: built (transfer_most).
PY-4 Partly The Amount row says “raised from 0.5 ₳”. Saying the minimum on the form needs a worker request.
PY-5 Fixed Totals and Make private’s button count the tokens; an own-address warning names its recipient.
PY-6 Fixed “Staking rewards moved into your balance”, with a line on the setting.
PY-7 Partly The details sheet says “not sent yet”. The giveme.my sentence stays: who sees a transaction is a note the screens keep.
PY-8, V-1 Fixed A focused field scrolls clear of a sticky foot (the page’s scroll padding follows the foot’s height); errors in the foot scroll within it. Session pages, the sign windows and Remove wallet’s list have feet that follow the body.
PY-9 Fixed Text that isn’t a number disables Review with its reason; every disabled Review says why; a new token box isn’t red before it’s touched. Contacts aren’t searched from To yet.
PY-10 Fixed A mainnet address on Preprod, a stake or script address, and too little ADA are said in the user’s words, with how much can be sent where the wallet can work it out.
PY-12 Partly Plainer Seedelf name rule, a note cut at 64 characters says so, Max’s placeholder fits.
PY-13, PY-15 Left Naming Koios and the timing note are disclosures the screens keep.
PY-14 Fixed “Amount (all of it)”, and token rows labelled.
V-7 Fixed A no-break space before every ₳, in the screens and the three languages.

Staking and governance

ID   What changed
ST-1 Fixed The pressed control carries its own progress (“Preparing your Yes vote…”).
ST-2 Fixed Each review’s button says the act (Stake with TPREP, Withdraw 57.48 ₳, Stop staking, Register as a DRep, Cast No vote), and its title names it.
ST-3, V-3 Fixed Stop staking, Retire as a DRep and Remove Seedelf’s review use the danger style, with what ends listed. This reverses round one’s plain row for Stop staking.
ST-4 Fixed Pool rows give margin, cost and the sorted value a line of their own, and badges never cut; the pool ID is cut in the middle.
ST-5 Partly Pools that pay nothing sink to the end of every sort. A return-based sort needs data the list doesn’t have.
ST-6 (Staking) Fixed The withdrawal says the balance stays the same, but for the fee.
ST-7 Fixed The page leads with the pool, and that the ADA stays spendable; the operator figures are under Pool details; switching pools says the old one’s rewards keep coming.
ST-8 Fixed An oversaturated pool says how far over, and what that does to rewards, on its review too.
ST-9 Fixed No spendable ADA is caught before a build, with Receive and Make public; withdrawing and retiring never mention a deposit.
ST-10 Fixed Read failures say so plainly, with the service’s words under Details and Try again; a registered DRep never falls back to “Be your own DRep”.
ST-11 Fixed Back from a review keeps the choice and the search.
ST-12 Partly One saturation figure, badges apart from names, an icon per voting option, dates beside epochs where they’re known. Search by pool name needs names the list doesn’t have.
GV-1 Fixed Each row has a short ID, the day it was proposed, the title when there’s one, and a treasury withdrawal’s amount.
GV-2 Fixed Read its full text opens an IPFS text through Blockfrost’s gateway, the NFT images’ one, in a tab, with a line saying what Blockfrost sees; any other address is only offered to copy, as an NFT’s image elsewhere is. A treasury withdrawal shows its amount and recipients. The vote note says a vote stays on chain, a replaced one too.
GV-3 Fixed The reason sits under the option, and the foot’s button becomes Become a DRep.
GV-5 Partly The inactive warning comes first and stays on the review. Status on every row needs a request per row.
GV-6 Fixed After a vote the page stays on the action, which says it’s on its way, and the list marks it.
GV-7 Fixed The deposit is checked before Review; the DRep’s duty to vote or update is said; editing the profile keeps a pasted address.
GV-8, GV-9 Fixed An ⓘ for each kind of action; Always no confidence says it’s a standing vote against the committee; the directory switch’s copy agrees with itself.

dApps, swaps, Lovejoin and the connector

ID   What changed
DX-1 Fixed A refused swap, mix or session funding gives way to one Build it again (a fresh session), or says where to look when it may have gone out; the service’s words are under Details, and Back clears the alert.
DX-2 Fixed The minimum Minswap vouches for is a warning of its own. Checking it would mean reading each DEX’s order datum.
DX-3 Partly Slippage on the review, the swap’s cost in rows that add up, and the Lovejoin switch says when it can’t apply. Not the three-row summary.
DX-4 Fixed “Slippage: 1%” on the form, amber from 5%, no placeholder that looks set, and Max says what stays aside.
DX-5 Fixed Stop goes once the order is filled or refunded; a finished swap says what was received; a turned-away funding says why.
DX-6, DX-7, DX-8 Left Swap on Home (open call); a session’s number is its account’s index, which never repeats. Since: Swap stays behind dApps (the owner, 5 October 2026); DX-8’s unchecked quote was an open question in post-release-roadmap.md, and chunk 29 checks it: a quote for another amount or pair is refused.
LJ-1 Partly The pool’s state shows before Review, which is disabled with the reason. A one-tap shallower mix needs a depth per mix (LJ-4).
LJ-2 Fixed “Back … while Seedelf Wallet is unlocked”, on the page and every review.
LJ-3 Fixed One cost figure everywhere (the 0.95 ₳ estimate; Settings showed the measured 0.877 ₳), and the stepper stops at what the balance pays for.
LJ-4 Left A depth per mix: each Lovejoin build would take one, stored with the mix as swaps’ is.
LJ-5 Partly Loading and a failed read are said, not “None”. No list of mixes.
LJ-6, LJ-7 Fixed Seeding is a secondary link, “private balance” throughout, and each tab says where what’s left goes.
CW-1 Fixed The sign windows’ password and Sign follow the request, so Sign is reached past who’s paid and every warning.
CW-2 Fixed Choosing a private session brings its amount into view and focuses it; the disabled button says “Enter an amount”.
CW-3 Fixed A declined site waits 10 s, then 60 s, then 5 min for declines in a row (10 quiet minutes, or a connect, start it over), and the site hears when it can ask again.
CW-4 Fixed The locked window has Decline and no restore link. The password at Sign stays: it’s a setting.
CW-5 Partly With several accounts, the windows say which signs. One account stays “your public account”, as round one decided.
CW-6 Partly Every disabled action on a session’s page says why, and a disconnected site isn’t said to stay connected. One list of sites is a structural call.
CW-7 Fixed “1 of N” with Decline all; “Total leaving” for “sends, net”; the private option as short as the public one.

The fix round’s own review

A cross-area review of the merged changes found, and the round fixed:

Left for the owner