Components

Guides · Live markets · Templates

The pieces our templates are built from. Every card below is the real component running in your browser on live Mithril data, not a picture of one. Copy the import and it works the same way in your build.

Nine of them exist to be truthful when the data is thin: withholding a rate the sample cannot support, refusing to average two sources that disagree, saying what a sample left out. Survivorship bias, and what an interface should do when it does not know.

Design style

Switch the style and the cards below change with it — radius, border weight, shadow model, typography and colour move together.

1MarketsModule

Live crypto markets, keyless, with an action on every row. Price, 24h volume and the change since yesterday, and Details opens funding, oracle and open interest inline.

Loading live markets…

2MarketsModule

Commodities and equity perps are the same component, not a second one. One /api/public/pacifica call returns gold and silver alongside NVDA, TSLA, SKHYNIX and MU, so the only difference is the assetClass you pass.

Loading live markets…

3StocksModule

715 tokenised stocks from /api/public/stocks, searchable by ticker or company. Details shows what each one tracks and the networks it trades on. Ticker chip first, the issuer's own logo revealed only once it has actually loaded.

Loading tokenised stocks…

4FxCandleChart

Candles, moving averages and Bollinger bands, drawn from 300 real one-minute EUR candles with no key. CandleChart does the drawing and always could; what it never had was a source it could reach on its own.

Loading candles…

5PieChart

Share of a whole. It prints how many values it dropped rather than discarding them silently, and “no data” and “every value is zero” are different states rather than both being a blank circle. Past six slices becomes Other. Shown here on real 24h volume.

Loading 24h volume…

6QuickActions

One-tap actions that answer on the same screen. Each button runs a real lookup against our own feed and prints the result underneath. The last one is not built yet and says so, which is the sanctioned way to ship an unfinished action.

Quick actions · BTC

Every answer here is a live number from our own feed, not a sample.

7StrategyPanel

A recovery ladder, and what it actually costs. Change the first stake, the multiplier or the money available and every row recomputes, including the step where the run ends. It leads with the bill rather than the promise.

Recovery ladder

Every number below is computed from these settings.

Ladder needs
1,270
You can fund
6 of 7 steps
Last stake
640.00
#110.0010.00 totalfunded
#220.0030.00 totalfunded
#340.0070.00 totalfunded
#480.00150.00 totalfunded
#5160.00310.00 totalfunded
#6320.00630.00 totalfunded
#7640.001,270 totalout of money

A doubling ladder does not lower risk. It trades many small losses for one rare large one, and the run ends at the first step you cannot fund, which here is step 7. Placing these orders is not wired up in this build. It needs an app key, which is not available here.

8WalletConnectPanel

Connect a browser wallet with no dependencies at all, and read the address, chain and balance. Nothing is signed and nothing moves. For builds that already use wagmi, EvmWalletConnect gives you RainbowKit's modal and chain switching instead.

Wallet

Checking for a wallet…

Creating your agent wallet and funding it from this wallet or by card is the next step, and it is what removes the last deposit link. It needs a credential that is not provisioned yet, so it is not shown here as a button that cannot work.

9CryptoIcon

Token logo by symbol, with a lettered chip when no art exists.

BTCETHSOLHYPEDOGE

10SignalGauge

A signed score from -1 to 1 as a needle, with the verdict and the vote breakdown under it.

BTC 4h
SELLBUY
BUY
237
ETH 1h
SELLBUY
SELL
642

11YieldModule

50 real staking and lending opportunities from /api/public/yield, sorted by rate, with an action on every row. A pool you cannot enter is marked Closed rather than quietly listed, and Details says the rate moves rather than implying it is fixed.

Loading yields…

12StatTile

Label, value, and an honest empty. A missing value renders as “n/a”, never as 0, because “we could not load this” and “this is zero” are different facts and printing the first as the second is how a dashboard lies quietly.

Mark
$80.28
▲ 2.59%steady
Volume
$15,300,000
▼ 4.10%thin data
Open interest
n/a
The feed did not return it

13EmptyState

Says why it is empty. The reason is a required prop, so there is no way to render this without saying why there is nothing to show, and if there is something the reader can do it sits right here.

No positions open on this account.Positions appear here as soon as one fills.

14ErrorPanel

What went wrong and what to do about it. The fix is a required prop and the raw code is folded away, because INSUFFICIENT_MARGIN tells a person nothing and an error with no fix is a dead end.

That order was larger than this account can cover.
Add funds or lower the size, then try again.

15LoadingSkeleton

Shaped like the thing that is coming, so the layout does not jump when data lands. A spinner says wait; this says wait, and here is what for.

16TrendBadge

A direction and how sure we are, with no fake precision. The same percentage from three points and three thousand look identical and mean different things, so confidence is part of the badge. Nothing to compare against reads “no basis”, never 0%.

▲ 2.59%steady▼ 6.49%thin datano basis

17NumberCell

A number that lines up and never invents precision. Tabular figures so a live column stops jittering as digits change, and a missing value is a dash rather than a zero, because a zero is a claim.

XAU$4,670
XAG$68.99
FUNDING$0.0421
OPEN INTERESTn/a

18Sparkline

A series small enough to live in a table cell. No axes and no labels, because it answers one question and anything else steals the room it needs. Under two points it shows “n/a” rather than a flat line that reads as no movement.

n/a

19UsdSizeInput

USD is what you type and the asset amount is derived underneath, never a second field to edit. This is where the money mistakes happen: people think in dollars and order books think in coins. With no price the derived line says so rather than printing 0, because a zero here becomes a real order.

Size1,000 available
$USD
≈ 3.1141 HYPE

20VenuePicker

The venues, and an honest word about the two that cannot do the agent flow. Paradex and Extended stay listed and selectable, and the reason prints the moment they are chosen rather than two screens later. Hiding them would be a different kind of lie.

Venue

21TimeRangePicker

Only the intervals our feeds actually serve. Offering 1s because it looks complete produces an empty chart and a user who thinks the product is broken; anything unsupported is disabled with the reason on hover rather than quietly missing.

22CopyField

One tap to copy a key or an address, masked until asked. It has one hard rule that must survive every future edit: it never logs, sends or stores the value. A key in a console is a key in a screen recording.

Your app key
mt_app…0000
Agent wallet
0xEXAM…dEaD

23WhereToNext

Where a person goes when there is nothing left to wait for. It renders nothing at all when there is nothing worth offering, because a titled empty box takes up the space where an answer would go.

24OrderTicket

Prices a real order end to end, size, fee, total, and disables the confirm with the reason in plain words on screen rather than in a tooltip. It is UsdSizeInput, VenuePicker, NumberCell and ErrorPanel assembled, which is why the primitives were built first. Nothing here sends anything.

HYPE

Mark $80.28
Size1,000 available
$USD
≈ 3.1141 HYPE
Venue
Buy HYPE3.1141
Order value$250.00
Fee (0.045%)$0.11
Total$250.11

Placing orders is not wired up in this build. It needs an app key, which is not available here.

25ConnectPanel

The three ways in, each honest about what it can do today. The agent option is shown and explained with its button disabled and the reason on screen, because a dead option is worse than a named absence, and it names the venues that have no agent flow at all rather than letting someone pick one and find out later. It never collects a key.

How do you want to connect

All three are listed, including the one that is not ready. A dead option is worse than a named absence.

Your own wallet

Connect a browser wallet. You keep the keys and approve every action yourself. Nothing is signed by us.

An agent walletNot yet

We create a wallet the app can trade from within limits you set, so you are not approving every order by hand.

Creating an agent wallet needs a credential that is not available yet. The other two work today.

Paradex and Extended have no agent flow at all, so they would need your own keys either way.

An exchange account

Use an account you already have. The build asks for it in its own settings, never here.

26HedgePanel

Two legs sized as one thing, because a hedge only means anything as a pair. It leads with what the pair leaves you exposed to rather than showing two green ticks and letting you do the subtraction, and it says plainly that neutral on price is not neutral on funding, counterparty or liquidation.

Hedge HYPE

Mark $80.28
Price exposure
none
The legs cancel, so the price of HYPE no longer moves this position.
Leg 1 · long
Long size
$USD
≈ 6.2282 HYPE
Long venue
Leg 2 · short
Short size
$USD
≈ 6.2282 HYPE
Short venue
Leg 1: long on Pacifica6.2282 HYPE
Leg 2: short on Hyperliquid6.2282 HYPE

Opening both legs is not wired up in this build. It needs an app key, which is not available here.

Even when the legs match, this is not risk-free. Funding still accrues on both sides, each venue holds your money separately, and either leg can be closed out on its own, which leaves the other one exposed.

27SwapPanel

A quote, the route it would take, and a line drawn on screen marking where our estimate ends and your wallet's signature begins. The figure at that line is the minimum received rather than the quote, because that is the number a person is actually agreeing to. An unknown route says so instead of drawing a confident straight line.

Swap USDC for ETH

You receive
0.041076 ETH
At 0.000412 ETH per USDC, after a 0.3% cost.
Route
USDC → WETHUniswap v3→WETH → ETHunwrap
Your wallet signs from here

Everything above is our estimate and changes nothing. Pressing the button asks your wallet to sign a real transfer, which we cannot reverse.

Least you will accept0.040871 ETH

Signing is not wired up in this build. It needs a connected wallet, which is not available here.

28PositionsTable

What is open, what it is worth now, and a way out on every row rather than a trip to the venue. Unrealised is computed from entry, mark and size rather than trusted from a feed field, because venues disagree about what theirs includes. A position with no mark shows “n/a” and says the price is missing, since rendering 0 would claim it had not moved.

Open positions

3 open
HYPElong
6.2282 HYPE · Pacifica
Mark
$80.28
Unrealised
$38.49
ZECshort
0.4 ZEC · Hyperliquid
Mark
$777.11
Unrealised
$14.12
MONlong
120 MON · Pacifica
Mark
n/a
Unrealised
n/a

No current price for MON, so we cannot say what this is worth. It has not necessarily stayed flat.

Closing is not wired up in this build. It needs an app key, which is not available here.

29FundingTable

The rate, what it is per year, and which side pays in words rather than a plus sign, because sign conventions differ between venues. A raw 0.0125% means nothing until you know it is charged hourly; the annualised figure is what decides whether a carry is worth holding.

Loading funding…

30SpreadScanner

Where the traded price has drifted from the index, ranked by basis points. Honest about what it is: we have one public venue, so this is mark against oracle on Pacifica rather than the cross-venue scan the brief asked for. Labelled as what it is instead of dressed up as arbitrage.

Loading spreads…

31AssetSearch

One box across perps and tokenised stocks at once, because a person hunting TSLA in the markets-only search concludes we do not have it. No results names which feeds it asked, so you can tell “we do not list it” from “we could not check”.

Loading both feeds…

32VenueHealth

Is the data actually arriving, and how old is it. Unknown is a real state and it is not green: before the first response we do not know the venue is up, and a green tick by default is the failure this exists to remove. Re-probes every 30 seconds.

Pacifica · checkingno timestamp

33LeverageSlider

Leverage, and how far the price can move before you are gone. The distance leads and the multiplier follows, because 50x tells you what you can buy and 2% tells you what it costs, and 2% is a move most assets on our own feed have made this week.

Leverage20x
A 5.0% move against you ends this position · around $76.27 HYPE

34FeeBreakdown

What a trade actually costs, itemised, with the total being the sum of exactly what is shown so a reader can check it by hand. A fee we know is zero prints 0; one we cannot compute prints “n/a” and says the real cost is higher.

Taker fee0.045%$0.11
Funding, first hour$0.00
Network costvaries by chainn/a
Total of what we can price$0.120.046%

1 line could not be priced, so the real cost is higher than this total.

35TimeAgo

How old a number is, in words, and loud once it is stale. A price from four minutes ago rendered identically to one from four seconds ago is how a person trades on a figure that has already moved. Staleness is not styling here, it is the point.

as of just nowas of 40s agoas of 5m ago · staleno timestamp

36FundingCountdown

How long until the next funding charge. Funding lands at a moment rather than continuously, so “in 4 minutes” changes whether a position is worth opening now. A timestamp we cannot read prints unknown, never 00:00, because a zeroed clock reads as charging now.

next funding in 40:59next funding in 1:29next funding unknown

37OrderBook

Bids, asks, the spread in both absolute and basis points, and depth bars, now on a real book. Each level shows how many orders sit behind it, because nine BTC from one account is a wall that vanishes in one cancel and nine BTC from forty is a floor, and every book renderer draws them identically.

Waiting for the first book from the venue.Pass bids and asks from a connected client and this fills in.
no timestamp

38DepthChart

Cumulative size either side of the mid, on a live book. Cumulative is the right shape precisely because it answers what a fill would cost rather than where the best price sits.

Waiting for the first book from the venue.Pass bids and asks and the curve fills in.
BTCno timestamp

39TopMovers

What actually moved, both directions, with the window named. A movers list showing only gainers is a marketing surface; the fall is the half that matters when you hold it. Against yesterday's close, and it says so, because “up 6%” over an unstated period is not a fact.

Loading movers…

40OpenInterestTable

Volume is what changed hands; open interest is what is still held. A market heavy on one and thin on the other is being traded through rather than owned, and only the pair tells you which. Sortable, built on DataTable rather than a fourth hand-rolled table.

Loading open interest…

41CompareMarkets

Two markets on the same rows at the same moment, because comparing by scrolling between cards is how people talk themselves into a trade. Where either side is missing, both show a dash: half a comparison is worse than none, since the eye completes it.

Loading markets…

42PositionSizer

Starts from what you are prepared to lose rather than from a size, and derives the position from your stop. A stop of zero is refused rather than divided by, because the implied position is infinite and rendering that as a big number tells someone to bet everything.

Position$1000.00
That is12.4564 HYPE
Stop at$76.27

43RiskSummary

How much room is left before liquidation, in words. Any missing input makes it unknown rather than zero and rather than green, and no bar is drawn at all: a health bar that reads full because a field was absent is the most dangerous thing on a trading screen.

Room left
comfortable
Equity
$1000.00
Used
$400.00
Free
$600.00
Room left
close to liquidation
Equity
$1000.00
Used
$900.00
Free
$100.00
Room left
unknown

We are missing at least one of equity, used collateral or the maintenance minimum, so we cannot say how much room is left. This is not the same as having plenty.

Equity
$1000.00
Used
$400.00
Free
n/a

44OrderHistory

Everything, not only the fills. Cancelled and rejected rows are the ones a person is actually hunting for, so they carry their reason, and where the venue gave none it says that rather than leaving the cell blank, because a rejection without a reason is a bug report we never receive.

Order history

Everything, not only the fills. A missing order is usually a cancelled one.

OrderPriceWhat happenedWhen↓
BTC buy 0.01n/arejectedthe venue gave no reason22:53
ZEC sell 0.4812.40cancelledyou cancelled it21:53
HYPE buy 6.280.10filled20:53

45AlertRule

Reads the rule back as a sentence and says where the alert would arrive, including when the answer is nowhere yet. Delivery is part of the rule rather than a setting elsewhere: an alert with no destination is a note to yourself, and it should say so before it is saved.

Tell me whenHYPE

HYPE is 80.28 now. This fires if it goes above 80.28, a move of 0.0%.

We have nowhere to send this yet. Email alerts need an account, which is not connected in this build.

46ConfirmAction

A second press for anything that cannot be undone, naming the consequence rather than asking “are you sure”. The armed state resets after five seconds, so a stale armed button can never be pressed by accident minutes later.

Closing needs an app key, which is not available in this build.

47Notice

One line of feedback that does not vanish before it is read. Toasts auto-dismiss, which is right for “copied” and wrong for anything needing action, so nothing dismisses itself unless a caller asks. The word carries the meaning, since colour alone fails for some readers.

DoneYour order filled at 80.12.
CarefulFunding turns positive in 4 minutes.
ProblemThe venue rejected that order and gave no reason.

48DataTable

Sortable rows with an honest empty and no invented cells. Missing values sort last in both directions, because ascending should not reward a row for having no data, which is exactly what treating null as zero does.

MarketOpen interest↓
BTC812,000,000
ETH402,000,000
MONn/a

49SymbolPicker

Pick a market from the live list, searchable, so what is pickable is exactly what is tradable and the two cannot drift. If the feed fails it says so and keeps your existing choice, because clearing a selection on a network blip is worse than a stale list.

Marketloading

50PercentInput

A percentage that cannot be typed into nonsense. Out-of-range values are clamped and it SAYS SO, because a field that quietly turns 500 into 100 has changed your intent without telling you and you will believe the number you typed.

Slippage
%

Try typing 500 to see what it does with an out-of-range value.

51ToggleGroup

A segmented control where an unavailable option is disabled with its reason rather than hidden. Hiding it is how a person concludes we do not support something we simply cannot offer today, and the reason goes under the group rather than in a tooltip nobody on a phone can reach.

Order type

52BalanceList

What is held, with a total that admits what it skipped. A token we cannot price silently vanishes from most portfolio totals, the person's money did not disappear, our number did, so unpriced holdings stay listed and the total says how many it left out.

Balances

$7915.30
BTCBTC0.042$3373.90
ETHETH1.8$4541.40
MONMON120n/a

1 holding is missing from that total because we have no price for it. You hold it either way.

53RefreshControl

Refresh, and the time of the last SUCCESS rather than the last attempt. A failed refresh does not move the clock, because the data on screen is still from the earlier success and that is the age the reader needs. Wired here to the real pacifica feed.

not loaded yet

54KeyValueList

Labelled facts where absence is a dash and never a blank, since a blank reads as a design choice and a dash reads as missing. A row can carry why it is missing, which beats merely knowing that it is.

Mark
$80,331
Funding
-0.0035%
Open interest
the venue did not return it
Venue
Pacifica
Next funding
n/a
Oracle
$80,345

55FilterChips

Filters that carry their counts, so an empty result is never a mystery about whether the filter broke. A zero-count chip is shown and disabled rather than hidden: hiding it makes the category look unsupported, disabling it says we have this and there is nothing in it right now.

56Pagination

Pages, and honest about a total it does not know. Feeds often return a page without saying how many exist, so total is nullable: unknown reads “of at least” and keeps Next live. A confident wrong total is worse than an admitted unknown because it stops people looking.

1–10 of 481 / 5
1–10 of at least 10, more behind thispage 1

57AddressField

An address, readable and copyable, with no explorer link on purpose. Every build reaches for “view on Etherscan” and that is a hard fail: the action happens in our interface. The middle is elided rather than the tail, because the last four characters are the only part anyone actually verifies.

Agent wallet
0xEXAM…00dEaD
Not connected
No address connected.

58InfoHint

An explanation you can reach without a mouse. We ban tooltip-only reasons across this library because a hover target does not exist on a phone, so this is a press that expands in the flow and pushes the layout. Less elegant than a floating tooltip and considerably more likely to be read.

59FillCostPanel

What your order actually costs, walked through the real book. Top of book is the price of the first coin, not the price of a two million dollar order, and a quote taken from the best bid looks identical in a screenshot while teaching the reader nothing. It also says when the book ran out, which is the thing most worth knowing before sending.

What BTC really costs at size

loading
Side
Loading the book…

60BookCompare

Which venue is cheaper for YOUR size, stated in dollars. Comparing best prices is close to meaningless when two venues show the same top of book and differ by real money once an order walks the levels. It refuses to name a winner when only one venue answered, because a comparison missing a side is not a comparison.

Walking both books…

61LiveBookAnalysis

One book fetch, five readings of it. Dropping the pure readers on a page separately would mean five fetches, five clocks and five chances to show numbers from different moments: two panels disagreeing because they polled a second apart is a bug a reader cannot diagnose. Hosts LevelStrength, LiquidityGauge, BookImbalance, SizeLadder and SlippageCurve.

Loading the book…

59TransactionStatus

Pending, confirmed, failed, and a fourth state most builds never write: we have lost track of it. That is not pending. Pending means we know it is in flight, and rendering unknown as pending is how someone watches a spinner for an hour after their transaction already failed.

Sent, waiting to settle

The network has it. This usually takes seconds but can take longer when the chain is busy.

3 of 12 confirmations
0xEXAMPLE00000000000000000000000000000000000000000000000000000dEaD
We have lost track of this

We stopped hearing back about it, so we cannot tell you whether it settled. Check your wallet before sending it again.

It did not go through

The pool moved past the price you accepted, so nothing was swapped and nothing was spent.

60ApprovalStep

The permission a swap needs, and what it actually grants. Every wallet offers unlimited as the convenient default and almost no interface says in words what it means: that contract may move that token, in any amount, until you revoke it. Exact is the default here and unlimited carries its sentence.

Before this trade, the router needs your permission to move 250.0000 USDC.

You will be asked to approve again next time. That is one extra signature per trade and no standing permission.

Signing is not wired up in this build. It needs a connected wallet.

61MarketHours

The token trades all day, the company does not. Out of hours there is no underlying price forming, so a tokenised stock is priced by its book rather than tracking anything and can drift from the last close. That is the most surprising fact about the asset and no interface I have seen states it.

checking market hours

62ActivityFeed

What happened, newest first, with the gaps admitted. A feed starting an hour ago looks complete and a reader assumes nothing happened before it, so this says how far back it can speak for. A silently shorter list is the dangerous failure: an error banner gets noticed, a missing ten entries looks like a quiet hour.

Activity

covers back to 948h ago

One page of history failed to load. Entries may be missing from this list, so treat a quiet stretch as unknown rather than as nothing happening.

Bought 6.2282 HYPE at 80.12 947h ago
BTC went above 77,000 947h ago
Cancelled a limit order on ZEC 947h ago

63NetworkPicker

The chains, with unsupported ones disabled rather than hidden, and testnets marked in one word. A person who thinks they are on mainnet and is not will send real intent to a chain where nothing is real, and the reverse mistake costs actual money.

Network

64QuotaMeter

What is left, and no bar at all when the limit is unknown, because a full bar drawn from a missing field is the same lie as a health bar. It leads with what remains rather than what was used: “80% used” and “200 left” are the same fact and only one answers the question being asked.

Left880 credits
120 of 1000 used
Left90 credits
910 of 1000 used
Leftn/a

We do not know the limit, so we cannot say how much is left. This is not the same as having plenty.

65ExportButton

Take the data away, and be told what did not come with it. A CSV of what is on screen is the page you are looking at after filters, not the dataset, so the real row count is shown before the click. Values containing a comma are quoted properly, because a shifted column is a corrupt file that opens fine.

2 rows, exactly what is on screen.
Filtered rows and anything past the current page are not included.

66ShareState

A link that reopens what you are looking at, and names what it carries before you copy it. A share button that silently encodes filters is a small surprise; one that silently encodes an account or an amount is a leak, so private keys are excluded rather than trusted to be harmless.

Carries symbol, range, venue.
Leaves out account, which never travels in a link.

67HealthBanner

Says a feed is down before the user works it out from five broken cards. It starts silent rather than green: before the first probe answers we know nothing, and a green banner on load is the same lie as a health bar drawn from a missing field. It reports only what it measured.

Above: a deliberately broken probe. The real one renders nothing, because our feeds are answering.

68CommandPalette

Everything reachable from the keyboard, including the things that are not ready. An unavailable action is listed and disabled with its reason rather than filtered out, because a palette that hides what it cannot do teaches the user the app cannot do it. Press cmd K.

69LiquidationPrice

The price at which the position stops being yours. Builds show leverage and entry and almost never the number those two produce, which is the only one that decides whether a position survives the week. Labelled roughly, because the exact figure needs the venue's maintenance margin and fees.

Liquidated at roughly
$64.63
A 19.5% move down ends this position in HYPE.

Roughly, because the exact figure depends on this venue's maintenance margin, its fees and any funding you have already paid. Treat it as the neighbourhood, not the line.

Liquidated at roughly
$77.47
A 3.5% move down ends this position in HYPE.

Roughly, because the exact figure depends on this venue's maintenance margin, its fees and any funding you have already paid. Treat it as the neighbourhood, not the line.

70BreakEven

The price you actually need, not the price you paid. People close at entry and are surprised to be down: you pay to get in, to get out, and funding for every hour between. Funding is shown as a drift per day rather than folded into one figure, because a single number hides that it moves.

You break even at
$80.88
Entry was $80.28. The difference is two lots of fees plus the funding you have already paid.

Break-even moves against you by $0.1766 a day at the current rate. The longer you hold, the better the price you need.

You break even at
$80.74
Entry was $80.28. The difference is two lots of fees plus the funding you have already paid.

Funding pays you here, so break-even improves by $0.1766 a day at the current rate. Holding helps.

71FundingProjection

What holding this costs over a day, a week and a month. A per-hour rate is read once and forgotten, so a carry that looks free is quietly expensive by Friday. It states plainly that this is today's rate carried forward and not a prediction, because funding resets and can flip sign.

Funding on this position
Over a day$-54.00
Over a week$-378.00
Over a month$-1620.00

You pay this at the current rate. This is today's rate carried forward, not a prediction. Funding resets every period and can flip sign, so treat it as the cost of the position as it stands rather than a bill you have agreed to.

Funding on this position
Over a day$54.00
Over a week$378.00
Over a month$1620.00

You are on the receiving side at the current rate. This is today's rate carried forward, not a prediction. Funding resets every period and can flip sign, so treat it as the cost of the position as it stands rather than a bill you have agreed to.

72MaxPosition

The biggest position the account can open, printed next to the move that would end it. Every venue has a MAX button and none of them mention that the largest position is also the one liquidated by the smallest move.

At 3x you can openceiling $50000 at 50x
$3000.00

A 33.3% move against you ends it.

Opening the maximum is also opening the position that the smallest move closes. The number above is what the account can support, not what it should carry.

At 25x you can openceiling $50000 at 50x
$25000.00

A 4.0% move against you ends it. That is inside a normal day for most of these markets.

Opening the maximum is also opening the position that the smallest move closes. The number above is what the account can support, not what it should carry.

73RiskDisclosure

What can go wrong here, in words a person can act on. Not a legal notice, which is written to be scrolled past. Each entry is the mechanism rather than the jargon, and it expands in the flow rather than in a modal, because a modal teaches people to dismiss.

A small move can close the whole position

Borrowing to trade means a move against you of a few percent can end it entirely, and the higher the multiple the smaller that move is. At twenty times, five percent is enough.

Holding costs money every hour

These markets charge a fee between the two sides that resets constantly. A position that goes nowhere for a week can still cost you, and the rate can flip while you hold.

The price you see is not the price you get

A large order walks through the book and fills at an average worse than the top. On a quiet market that difference is small; on a thin one it is not.

Each venue holds your money separately

Money at one venue is not available at another, and a venue having problems is a risk of its own regardless of whether your position is right.

74SessionSummary

What you did here, before you close the tab. Fees and funding are their own lines rather than netted into the headline, because folding them in is how a session that lost money reads as a session that made a little. Missing a figure means no total rather than a guessed one.

This session

5 of 7 filled
Before costs$142.50
Fees$-11.20
Funding$-3.40
After costs$127.90

This session

3 of 4 filled
Before costs$88.10
Feesn/a
Funding$-2.10
After costsn/a

We are missing at least one of the figures above, so there is no honest total to give you. The lines we do have are shown rather than a number we would have to guess at.

75OrderTypeGuide

What each order type does and what it costs you, with the ones this venue does not offer listed and marked rather than hidden. Someone who picks limit because it sounds safer and watches it never fill has learned the wrong lesson about the product rather than about limit orders.

Order types

Each one buys something and costs something. The cost is the half a ticket leaves out.

Market

Fills immediately at whatever the book is paying.

You accept the price you get, which on a thin book can be well past the one you saw.

Limit

Fills only at your price or better.

It may never fill. If the market moves away you are left holding nothing, which is a position of its own.

Stopnot here

Turns into a market order once the price reaches your trigger.

The trigger is not the fill. In a fast move you can be filled a long way past it.

Not offered on this venue yet, so the ticket has no stop option.

76PortfolioPie

What the account is exposed to, which is the same data as a balance list and a different question: two holdings can look balanced in a list and be ninety percent one asset by value. A holding it cannot price is a named hole rather than a silently omitted slice.

  • ETH47.7%
  • BTC34.2%
  • SOL18.0%

1 holding is missing from this chart because we have no price for it. The shares above are of what we could value, not of everything you hold.

77WatchList

The markets someone cares about, kept on their device, and it says so. Without that line an empty list on a phone reads as the app losing their data rather than as a list that never travelled. Degrades to an in-memory list when the browser refuses to store.

Watching

2
BTCBTC
ETHETH

This list is kept on this device only. It will not follow you to your phone, and clearing site data clears it.

78SavedViews

Name a set of filters and come back to it, the companion to ShareState: that one sends a view to someone else, this one keeps it for you. It refuses to overwrite a name that already exists and says why, because silently replacing a saved view is a small theft.

Saved views

No saved views yet.Name the filters you are looking at and they come back next time.

Saved on this device only. These will not follow you to another browser, and clearing site data clears them.

79CostToTrade

Everything one round trip costs, added up in one place. The parts live on four different screens on every venue, so people compare a 0.045% fee against a 0.02% one and pick the wrong venue by a wide margin. A line it cannot price blocks the total rather than counting as zero.

One round trip costs

on $25000
Taker fee in0.045%$11.25
Taker fee out0.045%$11.25
What the book costs you$4.10
Funding, first day$2.70
Withdrawalvaries by chainn/a
Total of what we can price$29.300.117%

We could not price withdrawal, so the real cost is higher than the figure above. A total that quietly leaves a line out makes a venue look cheaper than it is.

80VenueCompare

The same trade on each venue, ranked on fee plus what the book costs you rather than on the headline fee. It shows the parts so the ranking is checkable, and a venue that did not answer is listed as not answering rather than dropped, because a comparison that silently excludes one is a comparison of whoever was up.

The same $25000 trade, by venue

Ranked on fee plus what the book costs you, not on the headline fee.

1Hyperliquidfee $11.25book $4.10$15.35
2Pacificafee $8.75book $9.40$18.15
?Asterdid not answer

Hyperliquid is cheapest on this size, by $2.80.

81PositionHealth

How much room one position has left, which is what a person checks before adding. No bar at all when the mark is missing, same rule as RiskSummary and QuotaMeter: a health bar drawn from an absent price is the most dangerous thing on a trading screen.

Room left
comfortable
Entry
$80.28
Now
$79.40
Liquidated
$64.63
long
Room left
close to liquidation
Entry
$80.28
Now
$68.20
Liquidated
$64.63
long
Room left
unknown

We have no current price for this market, so we cannot say how much room is left. That is not the same as having plenty.

Entry
$80.28
Now
n/a
Liquidated
$64.63
long

82KeyStatus

Whether this build can do anything, said once at the top as a state rather than twelve apologies down the page. A reader meeting “needs an app key” for the fourth time concludes the product is broken rather than that this build is read-only. It never renders a key, asks for one, or links away to get one.

Reading live data, not trading

Everything here works and nothing can be placed. Connecting an account is what turns the actions on, and until then the panels say so rather than hiding.

The connection has expired

Prices here are still live. Anything you place would be rejected, so those actions are off until you reconnect.

Connected

Actions on this page will reach the venue.

83ChangeSummary

What moved since you last looked, because a dashboard shows the present and assumes you remember the past. A row that appeared since the last look is marked new rather than shown as a change from zero: a change from zero is a number, and “this did not exist before” is a fact.

Since you last looked

948h ago
BTC0.65%
ETH-2.96%
MONnew since then

84RetryPanel

For the failure that keeps failing. It shows the attempt count and switches the button off after the cap, because a person pressing retry a fourth time has learned nothing while the interface already knows it has failed three times. Same reasoning as the credit guard: never wire a spending action to a trigger broader than what it can fix.

The market list did not load.
This is usually a blip. Try again.

85StaleBadge

Marks one figure that has stopped updating, next to the figure. A table where nine rows are live and one froze twenty minutes ago looks entirely healthy, and the frozen row is the one somebody trades on. It marks rather than hides, because a stale price is still the last thing we knew.

BTC $77,506 fresh, no badge
ZEC $777.11 stale 12m
MON $1.84 never updated

86SortHeader

A column header that sorts and prints its own rule. Every hand-rolled sort treats a missing value as zero, which silently promotes the empty rows to the top of an ascending sort. Two words in the header stop a reader wondering why the blanks are winning.

87DensityToggle

How much fits on screen, remembered per device. A table at comfortable spacing shows eight rows on a laptop and twenty when compact, and which is right depends on whether the reader is scanning or reading. It says the setting is local, so a phone starting at comfortable is not filed as a bug.

Kept on this device. Another browser starts at comfortable.

88InlineEdit

Change a value in place without losing what you typed. While the field is focused the incoming value is held back, and if it changed underneath you that is said rather than silently applied on save. When both changed, the reader decides whose number wins, which is the only honest resolution.

89PriceInput

A price field that knows the market's tick size, so an invalid price is caught before the click rather than rejected after it with a code nobody reads. When it snaps a number it says so, because a field that silently moves what you typed has changed your order without telling you. The nudge buttons step by exactly one tick.

Pricetick 0.5

0.00% above the current price.

90AmountInput

The other half of every rejected order. It rounds DOWN to the step and says so, and an order below the venue minimum is refused rather than raised: quietly raising a size spends more of someone's money than they asked to spend, so the number is left alone and the problem is named.

Amountmin 0.01 BTC
BTC

91ConnectionBadge

Live, reconnecting or stalled, and never a lie in green. A streaming panel that silently lost its socket looks identical to one that is up and quiet, so “connected but quiet” is its own state: it reports how long it has been silent and lets the reader judge rather than assuming the feed is fine.

liveconnected but quietnothing for 90s, which may be a slow market or a dead socketreconnectingnothing for 40s, which may be a slow market or a dead socketnot receivingno message has arrived yet

92OrderPreview

The whole order in one sentence, before it goes. A ticket is six fields and the thing you are about to do exists only in your head; reading it out loud catches a wrong side or a stray decimal in a way six correct-looking fields never do. An incomplete order gets a list of what is missing rather than a sentence with a gap, because a gap reads as complete to someone skimming.

You are about to

buy 0.050000 BTC at $77,506 on Hyperliquid.

That is about $3875.30 before fees.

You are about to

sell 0.050000 BTC at whatever the market is paying.

A market order takes the price the book gives it, which on a thin market can be well past the one on screen.

This order still needs a size, so there is nothing to confirm yet.

93BalanceRequired

Whether this order can be paid for, checked while you are still typing rather than after the click. It counts the fee, because “you have enough” that ignores it is wrong exactly at the boundary, which is the only place the answer matters. A balance we cannot see is said out loud rather than assumed fine.

This costs, with fee$3876.74
You have$4000.00

Covered, with $123.26 left over.

This costs, with fee$4001.80
You have$4000.00

Short by $1.80. Lower the size or add funds; the fee is included above, which is why an order for exactly your balance is always short.

We cannot see this account's balance, so we cannot tell you whether this order can be paid for. That is not the same as it being fine.

94TimeInForce

How long the order lives, with what each choice actually does shown for the selected one rather than in a help page. People pick until-cancelled because it is the default and are surprised by a fill three days later. Options this venue cannot offer are listed and disabled with the reason.

How long it lives

Rests on the book until it fills or you remove it. It can fill days later at a price that made sense when you set it and does not now.

95ReduceOnly

The switch that stops a closing order opening the opposite side. Someone sells to close a long, gets the size slightly wrong, and is now short. The explanation is about what happens WITHOUT it, because “reduce only” is jargon that hides the point. Off and disabled when there is no position, since it would never fill.

96PositionSide

Which way you are, with what it means beside it. Long and short are read fluently by people who know them and guessed at by everyone else, and a guess here is the most expensive guess in the product. It names the loss as well as the gain, in the same size, because choosing a side is choosing both.

If BTC goes up, you gain. If it goes down, you lose.

97CancelAll

Pulls every resting order and says exactly how many that is. Cancel-all on a screen showing three orders might cancel eleven, because the screen is filtered and the action is not. When those numbers differ it shows both, since a person in a hurry deserves to know the button reaches further than their filter.

Cancelling needs an app key, which is not available in this build.

Your filter shows 3, but 11 are resting. This button reaches all of them.

Nothing is resting, so there is nothing to cancel.

98FundingCost

What funding has ALREADY cost this position, which is the number missing when someone closes at entry and finds themselves down. It shows the rate that produced it so the figure is checkable, and a period with no recorded rate counts as unknown rather than zero, because treating a gap as nothing understates the bill in the direction that flatters us.

Funding so far
$-7.00

Over 3 periods, most recently at 0.0080%. You paid this.

1 period has no recorded rate, so the real figure is further from zero than this. They are left out rather than counted as nothing.

102HoldingsTable

What you own, what it cost and what it is worth. PositionsTable is perps; this is the ordinary holdings page nothing covered. An unpriced row refuses its value rather than showing zero, a row with no cost basis refuses its return rather than reporting the lot as profit, and the total refuses ITSELF if any row is unknown - a total that quietly skips what it could not price looks complete and is not.

Holdings

4 holdings
BTC
0.42 BTC · Bitcoin
Value
$32890.20
Return
27.96%
ETH
6.1 ETH · Ethereum
Value
$14749.80
Return
-16.33%
SOL
55 SOL · Solana
Value
$9427.00
Return
n/a

We do not know what you paid for this, so the return is blank rather than counted as all profit.

XAU
1.2 XAU · Gold
Value
n/a
Return
n/a

No current price for XAU, so we cannot say what this is worth. It has not necessarily stayed flat.

Total valueNot totalled: 1 of 4 holdings has no price

103ConcentrationWarning

Says out loud when one holding IS the portfolio. PortfolioPie already draws the split, and a pie is exactly the shape that makes 70% in one asset look like a nice big slice. It states the share and the plain arithmetic - if this halves, the whole thing falls by X - and stops there. It never says sell or diversify, because we are not licensed to.

BTC is 57.6% of this portfolio.

If BTC halves, the whole portfolio falls about -28.8%, whatever everything else does. That is the arithmetic, not a recommendation.

104AllocationTarget

Where the portfolio drifted from what you intended. Drift is signed, because over-weight and under-weight are opposite situations that share a magnitude, and it is stated in money as well as points - "4.2 points" means nothing next to "$1,840 more than you meant to hold". Targets that do not sum to 100 are refused rather than normalised, because normalising produces plausible numbers from a broken setup.

Target allocation

BTC40.0% target53.8% now

Over target by 13.8 points, which is $8423 more than you intended to hold.

ETH30.0% target24.1% now

Under target by 5.9 points, which is $3600 less than you intended to hold.

SOL20.0% target15.4% now
USDC10.0% target6.7% now

105IncomeSchedule

What is due to be paid and when, with the certainty attached to every row. A declared payment and a projection from a floating rate are not the same kind of number, and printing them in one column silently promises the guess. The headline total sums only what is declared - adding projections would make the most confident figure on screen out of the least reliable inputs.

Income due

3 upcoming
stETHdeclared
Staking reward · due 12 Sep
$41.20
USDCdeclared
Lending interest · due 15 Sep
$18.75
SOLprojected
Staking reward · due 18 Sep
$26.40
Declared, with a fixed amount$59.95
Projected, and can still move$26.40

The two are kept apart on purpose. Projected amounts come from rates that can change before payment, so they are not added into the declared figure.

106PerformanceSummary

Return over a period, and WHICH return it is. Simple and money-weighted differ enormously for the same account and almost no app says which it is showing. With a deposit in the period the simple figure would count your own money as profit, so it is refused outright rather than footnoted - that is a wrong number, not a caveat.

Performance

past 30 days
Money-weighted return
15.71%
$7967.00 after taking deposits and withdrawals out of the change.

You added $5000.00 during this period, so the simple change in balance is not a return - it would count your own deposit as performance. This figure measures the money actually at work instead, assuming the movement landed mid-period.

107MaxDrawdown

The worst fall this went through, measured from the RUNNING high rather than the first value - measuring from the start reports a small fall for a series that rose then collapsed. Recovery is stated separately, because a recovered 30% drawdown and an ongoing one share a headline and are very different situations. A series with gaps is refused rather than skipped over.

Worst fall

past year
Peak to trough
-41.3%
from $61200 down to $35900

Still -3.8% below its high, so this fall has not been recovered yet.

108WithdrawalReadiness

How much you could actually take out today. Available leads and the total is the footnote, which is the reverse of every dashboard - showing the big number first is how the misunderstanding gets built. Every locked portion says why and until when, and an unknown release date is shown as unknown rather than as "soon".

What you can withdraw

Available now
$13600.00
out of $24800.00 held in total
Staked, unbonding
Releases 19 Sep
$8000.00
Margin held against an open position
No fixed release date, and we will not guess one
$3200.00

109CurrencyToggle

Switch display currency, with the rate and its age travelling alongside the choice - a converted figure has a second source of error the original never had. A currency we cannot price is disabled rather than converted with the last rate that worked, which would silently turn the page into "prices as of some unknown Tuesday".

Show amounts in
$24800.00

110Dialog

The general-purpose modal the library never had, so every build wrote its own and shipped the same three faults. Escape always works, focus moves in and returns to whatever opened it, and the backdrop does NOT dismiss by default - a misplaced click must not discard a size and a limit price someone just typed.

111Toast

Transient confirmation that does not evaporate when it matters. Successes clear themselves; errors never do, because the thing an error describes did NOT happen and leaves no other trace on screen. A four-second error toast is how someone comes to believe an order was placed. Hover pauses the timer, and errors announce assertively.

The success clears itself. The failure will not, on purpose.

112EdgeVsCost

Puts the move you are aiming at and the cost of aiming at it in one sentence. Both numbers are harmless alone and shown separately on every trading UI there is; together with a verdict they say something no single tile can, which is that winning every trade still loses. A break-even over 100% is stated in words, because printing "142%" in the same style as "61%" invites someone to think they can get close.

Is the move bigger than the cost?

You are aiming at
5.00 bps
one round trip costs
9.12 bps
There is no win rate that makes this work.

Break-even would need 141.2% of trades to reach the target, and there is no such thing as more than 100%. The trade is smaller than the cost of doing it, so winning every single one still loses money.

113CoverageGap

The denominator, which is the finding. Eight results looks like an answer until you know whether eight is out of ten or out of 233. Skipped rows are counted separately, because a ratio that quietly drops the ones it could not read overstates coverage. It reports the share plainly rather than colouring it, since a strategy that works on 3% of markets may be exactly right if those are the 3% you can trade.

A positive funding spread holds on 8 of 193 markets (4.1%)

40 more were never examined, because those venues did not return a funding field. The real universe is 233, so treat the share above as a share of what we could read, not of everything.

The denominator is here because a small share is not automatically bad and a large one is not automatically good. Whether these markets are the ones you can actually use is a judgement this page cannot make for you.

114NotProvided

The third state every data panel needs and almost none have. Asking, answered, and not available - an empty chart reads as "nothing happened" and a stuck spinner reads as "broken", and both are wrong when the truth is that the venue does not publish the field. It names the field AND the source, so a reader knows where to look next and the next developer does not hunt for a bug in our code.

Not available from this source
Aster's public depth API does not publish per-level order counts.

This is a gap in what the source returns, not an error on this page and not a value of zero. Nothing is being hidden and nothing failed.

We do have size at each level, which is a different measurement.

115SampleTooSmall

Withholds a rate the sample cannot support, rather than footnoting it. 67% from three trades is a true division and a worthless claim, and a caveat under a big number does not work because the number is what gets remembered. Below the threshold the count becomes the headline and the percentage does not appear. Above it, a rough interval is shown, because a reader who sees only "60%" will plan as though it were exactly 60%.

win rate
2 of 3 trades

Not shown as a percentage. 3 trades cannot support a win rate - the division would be correct and the number would still tell you nothing. It appears once there are at least 30.

win rate
60.0%

From 24 of 40 trades, which puts it roughly between 44.8% and 75.2%. That range is a crude one, and it is here because planning against the single number treats a spread as a certainty.

116SourcesDisagree

Two feeds, two answers, and deliberately no average. The disagreement IS the information - it is the arbitrage, or it is a stale feed - and a mean is a price no venue will trade at, shown with more confidence than either input deserves. One source answering is reported as one source, not as agreement, because a feed agreeing with itself is not confirmation.

What each source says

2 of 3 answering
Hyperliquid
read just now
81519.50 USD
Binance futures
read just now
81702.00 USD
Aster
n/a

They differ by 0.22%, within the 0.5% we treat as ordinary feed noise. Still shown separately rather than merged.

Aster did not answer, so it is absent rather than agreeing.

117AssumptionsPanel

Which inputs we measured and which we guessed. A fee from a published rate card and a slippage someone typed as a placeholder render identically and carry the same weight in the total, and only one is true. "Some figures are estimates" is unactionable because the reader cannot tell which. The total refuses itself when an input is unknown, since a sum that drops the unknown row looks complete and understates the cost.

What one round trip costs

Spread crossedmeasured
Ask minus bid on the live book.
0.12 bps
Taker fee inassumed
Published base rate. Your tier may be lower.
4.50 bps
Taker fee outassumed
Published base rate.
4.50 bps
Slippage beyond top of bookunknown
Depends on your size, which we do not know.
n/a
Cost per round trip, partial9.12

1 of 4 inputs is not known, so this total is missing one and is lower than the real figure. It is not the answer, it is the part we can stand behind.

118FreshnessGate

Replaces a stale number instead of annotating it. StaleBadge is right for a price you can still judge; this is for figures where acting on an old value is worse than acting on none - a margin requirement, a size limit, a liquidation level. Past the limit the age becomes the headline and the value disappears, which is deliberately more disruptive than a badge, because the point is to stop an action rather than inform one.

Margin required
$2400.00

Read 18s ago, inside the 60s this is good for.

Margin required
5 min old

Not shown, because a margin figure goes out of date after 60s and acting on a stale one is worse than acting on none. The value comes back as soon as the source answers again.

119OverfitRisk

How many knobs were turned to produce a backtest. Six parameters fitted against forty trades is a drawing, not a strategy, and nothing in a backtest UI ever says so. It also counts the SEARCH: the best of 500 combinations looks good even from noise, and reporting only the winner hides that denominator. No score and no traffic light, because there is no threshold that makes a backtest true and a green badge would manufacture the confidence this exists to withhold.

How much searching produced this
Free parameters
6
Fitted against
41
Per parameter
7

Roughly 7 observations for every knob that was turned. There is no threshold that makes a backtest true, so this is stated rather than scored.

500 parameter sets were evaluated before this one was chosen, so this is the best of 500 draws. A best-of-many looks good even when nothing real is there, and only the winner is usually reported.

Nothing was held back, so every observation here was used to choose the parameters. There is no out-of-sample result on this page.

120UnitCheck

Refuses to subtract two numbers that are not the same kind of thing. A funding rate per 8 hours next to one per year, bps next to percent, APY next to APR - each looks plausible and the conclusion is wrong by orders of magnitude. It will not silently normalise, because conversions carry assumptions; where the caller has converted, the row is labelled as converted rather than passed off as measured.

Hyperliquid funding0.0011 % per 8h
Aster funding12.0400 % per year

These are not the same kind of number. One is in % per 8h and the other in % per year, so no difference is shown. Subtracting them would produce a figure that looks right and is wrong, which is worse than showing nothing.

Hyperliquid fundingconverted from % per 8h1.2045 % per year
Aster funding12.0400 % per year
Difference, both in % per year10.8355 % per year

121SurvivorshipNote

What is missing from the sample, said where the result is. A list of what exists today is not a history: "top performers over the past year" computed from currently-listed markets excludes everything delisted or gone to zero, which are precisely the losses. The bias persists because the missing rows leave no trace in the UI. It does not correct the figure, since correcting would need the data we do not have.

What is not in this
46 markets are missing from this

It is computed from the 187 that still exist, out of 233 over the past year - 80% of the original set. The rest are gone because they were delisted or stopped being quoted during this period, and those are disproportionately the bad outcomes. The figure above is therefore better than the real one, and we have not adjusted it, because adjusting would need the data we do not have.

124DataGapInSeries

A line that stops at a hole instead of crossing it. Given [100, null, null, 130] every charting library skips the nulls and joins 100 to 130, drawing a smooth climb that nobody observed, in the same weight and colour as the moves that did happen. On a price or funding series that diagonal is usually a feed that stopped, and a reader sizes a position against an artefact of the renderer. The line breaks at each gap, the hole is shaded, and the count is printed. It never interpolates, and it does not draw a dotted "possible path": a dotted line is still a line, and readers remember the shape rather than the texture. A zero is an observation and stays in the line; only a null is a hole.

funding, 24h

3 of 10 points of hourly funding are missing, in 1 gap. The line stops at each one rather than crossing it: a straight run across a hole is a move nobody observed.

125RoundedToZero

A number that is not zero must not read as nothing. A funding rate of 0.00004 shown at two decimals is "0.00": there is no null, no missing marker, nothing for a reader to notice, and it says the thing did not happen. It did, and eight hours of it compounds. This is the mirror of SpuriousPrecision, and the pair is the explanation: too many digits invents certainty, too few invents ABSENCE, which is the more dangerous of the two because it looks like a fact rather than a flourish. It shows the value at the precision where it stops being zero and says it did so, in the open rather than in a tooltip, because a reader who has already concluded nothing happened does not hover. A genuine zero is left alone: decorating it would teach readers to ignore the marker on the numbers that matter.

funding, 1h
0.00004%

At 2 decimals this reads 0%, and it is not zero. Shown to 5 instead, which is where it stops disappearing. A small number of funding that compounds is not the same as nothing happening.

123SpuriousPrecision

A number printed to the digits its sample supports, rather than to the digits the division produced. "14.28571%" from seven days is a true division and a lie about what we know, and a reader cannot tell a figure resolved to six decimals from one resolved to none because both render in the same weight. The rule is that a result is never finer than the step between values it could take: with 400 observations that step is 0.25 points, so a decimal would offer 12.1% when only 12.00, 12.25 and 12.50 can occur. It never ADDS digits, because asking for fewer than the evidence allows is the caller's business.

7d win rate
14%

Cut from 5 decimals to 0. 7 observations can only resolve this to 0 decimals, so the digits after it moved with the arithmetic rather than with seven days of trades.

122WalletConnect

Connects a wallet, including on a phone, with nothing registered by anybody. Where a provider is injected it connects through it; where none is, it does not say "no wallet found" and stop, it offers a link that reopens this page inside the wallet's own browser, which is where injection happens. WalletConnect v2 is deliberately not used: it needs a project id, and a generated app cannot register for one. Measured on 15 Sep: of ten builds whose prompt asked for a wallet, zero carried a deep-link target and three published apps were desktop-only.

Open this page in your wallet app to connect:

A wallet is needed to connect. Open this page over https in a wallet app.

126ChangeFromTinyBase

A percentage change carries no information about what it was computed from, and that is the whole problem. Two signups becoming five is plus 150 percent, and it renders identically to two hundred becoming five hundred. One of those is a business result and the other is three people. The number is arithmetically correct in both cases, which is why nobody catches it: there is nothing wrong to notice. This shows the change with the base beside it, and when the base is under the threshold it declines to lead with the percentage at all and gives the two raw counts instead, because at that size the counts are the honest summary and the ratio is decoration. A change from zero is not rendered as infinite growth or as a large number; there is no percentage change from zero, so it says so.

signups, week on week
2 to 5

That is 150%, and it is not the headline: a base of 2 cannot carry a percentage of signups. The counts are what changed.

127AnnualisedFromDays

Annualising is compounding a window you observed across a year you did not. Nine days at 4.2 percent becomes roughly 450 percent a year, and the figure is real arithmetic sitting on the assumption that the next forty windows look like the one you measured. For a strategy that ran nine days that assumption is the entire claim, and the annualised number hides it behind a single confident figure. This prints the annualised value only above a minimum window, and always beside the raw return and the day count that produced it. Below the minimum it shows the observed return and refuses the extrapolation rather than dressing it up. Negative growth is not annualised at all: compounding a loss past total loss produces a number with no meaning, so it returns nothing instead of a figure that would have to be explained away.

annualised
4.20% over 9 days

Not annualised for return: 9 days compounded to a year turns one good day into hundreds of points of yearly return, and the result would be repeated as though it were a rate anyone has been paid. The observed figure is above.

128OutlierPull

A mean is a claim about the typical case, and one large value can make it a claim about nobody. Four trades around twelve and one at four hundred and eighty give an average of a hundred and five, a figure no trade came close to. The reader takes it as the usual size because that is what an average means to a reader. This compares the mean against the median and measures how much of the total one value accounts for; when a single value carries more than the allowed share it says so and shows both numbers, so the mean is never the only figure on screen. The share is computed over magnitudes rather than the signed sum, because a set with offsetting positives and negatives can have a total near zero and would otherwise report every value as dominant.

average trade size
13.00 USD median

The mean is 106.00 USD, and one of the 5 values of trades is 91% of the total. An average that one row owns describes that row, not the rest.

129PartialPeriod

Month to date beside last month is a comparison between nine days and thirty, and neither number says which is which. Revenue looks halved. The chart is falling. Nothing is falling: the month is not over. This marks the running period as incomplete, shows how much of it has elapsed, and offers the projection to a full period as a clearly separate figure rather than as the headline, because the projection assumes the rest of the month resembles the part you have. The elapsed fraction is capped at one so a period that has overrun its nominal length does not project backwards, and when the elapsed or full length is unknown it shows the raw figure with the incompleteness stated rather than inventing a fraction it cannot support.

revenue, month to date
11200.00 USDmonth still running

This covers 30% of the month of revenue, so it is not comparable with the complete ones beside it. At this rate the full month would be 37333.33 USD, which assumes a flat rate and is an estimate rather than a forecast.

130TruncatedAxis

A chart with a truncated axis is not a lie and not a neutral choice. Five sessions between 101.1 and 101.6 drawn from a zero baseline is a flat line, and drawn from 101 it is a mountain range. Both are the same 0.5 percent. The reader does not see the axis; the reader sees the shape, and the shape is the argument. This draws the series and states in the open whether the axis starts at zero, alongside the actual percentage move, so the shape and the size are visible together. The point is not that truncation is forbidden: a half percent move in a price is often the thing worth seeing, and forcing every chart to zero flattens real signal into nothing. The point is that the reader is told which chart they are looking at.

price, 5 sessions

Drawn from 101.10 USD to 101.60 USD, not from zero, so the height of this shape is the axis as much as the move. The whole range of price is 0.49%.

131CountedTwice

Break a total into sources and the parts will often sum to more than the whole, because a user who arrived by email and by referral is in both buckets. The breakdown looks complete, every bucket is individually correct, and the total at the top of the page no longer matches the total in the chart. Whoever notices assumes one of the queries is wrong. This takes the buckets with their item identifiers, counts the distinct union, and when the parts exceed the whole it says so and names which items are in more than one bucket. Naming them is the part that matters: a warning that the buckets overlap is a puzzle, and a list of the three users who are in two places is something a person can act on.

signups by source
3 signups in 4 places
  • email2
  • referral2

1 of the signups are in more than one bucket, so the buckets sum to 4 and the whole is 3. The parts cannot add to 100% and they are not being rescaled to pretend they do.

132SmoothedNotObserved

A seven day trailing average is a statement about seven days, and on day three there are not seven days. The usual handling is to average whatever exists so far, which draws a line all the way to the left edge and makes the first points look like observations when they are averages over two or three values with completely different variance. This returns nothing until the window is full and leaves that stretch of the chart empty, with the raw points drawn underneath the smoothed line throughout. The reader sees where the smoothing begins and sees what was smoothed away. An empty leading window looks like a defect to someone used to the other convention, which is the intended effect: the absence is the honest rendering of a figure that does not exist yet.

daily volume, 7 day average

The solid line is what was observed. The dashed one is a 7-period trailing average, which nobody measured: it lags by design, so at the right-hand edge it is still describing a move that has finished. It starts at point 7 because an average of fewer than 7 is a different number wearing this one's name, and it covers 4 of 10 points.

133DualAxisImplication

Two series on two axes will cross wherever the two ranges are chosen to make them cross, and the crossing reads as a relationship. Price and volume on a shared chart with independent scales can be made to track each other or to diverge purely by the axis bounds, and no reader checks the bounds. The correlation is manufactured by the drawing. This renders both series with each axis range stated next to its name, so the scaling choice is visible rather than implicit, and it does not claim a relationship anywhere in its output. It is deliberately not a fix for the dual axis problem, because there is no fix: the honest version of this chart is often two charts. What it does is stop the scaling from being invisible.

price against volume

price is drawn from 101.00 USD to 105.00 USD; volume from 12.00 to 55.00. Two ranges were CHOSEN, so these lines can be compared in direction and never in size: a different pair of ranges makes the same two series agree or diverge. No correlation is given, because a number would make the implication precise without making it true.

134AsOfMismatch

A row that recomputes one figure every beat and carries another forward is quoting two different moments as one fact. This happened in my own merged code: a health row printed the verdict fresh and the count from whenever it was last measured, so a process two commits behind when the count was taken went on reporting two while it drifted to twenty. That is not a missing number, it is a wrong one wearing the authority of a measurement, and because the gap only ever widens it always understates, which is the flattering direction and the one nobody questions. A null announces its ignorance. A stale integer does not. So the figure is keyed to the state it was measured against and refused when that no longer matches. The distinction from FreshnessGate matters: that one asks whether a value is too old in absolute terms, and two values here can both be seconds old and still describe different worlds.

commits behind
n/a

Last measured against 1644b2d, and this is now 3829546. The figure would be from a state that has moved, so it is withheld rather than carried forward.

135CheckedNotChanged

A timestamp on a row usually records when a process last LOOKED, and is read as when the thing last HAPPENED. Those are opposite facts and the wrong reading is the reassuring one: a freshly stamped row looks like a live system whether or not anything has moved in a week. I relied on exactly this to convince myself a nightly detector was alive, and the column I read refreshes on every run for every row the run can still see, so it would have said the same thing about a detector that had found nothing since the summer. Showing both dates makes the gap the point. Checked five minutes ago and unchanged for nine days is a healthy system with nothing to report. Checked nine days ago is a dead one. Print one date and those are the same row.

night watch detector
last checked
394h ago · stale
last changed
592h ago · stale

Checked recently and unchanged for 8 days. A quiet the detector and a dead one both look like this if only one date is shown.

136EmptyPeriodsShown

Group the rows you have by hour and you get a bucket for every hour that has rows. The hours with nothing produce nothing, so they are invisible to the very query meant to tell you whether empty hours are ordinary. I nearly reported a dead telemetry beacon on this: a counter flat, zero events for fifty-five minutes after thirty-nine the hour before, and a first pass that listed six in the morning through noon while silently omitting two in the morning, which was also empty. Walking the range instead and looking each hour up found two zero hours in twenty-four. Precedent found, no escalation. This is not the same as a gap inside a series, where the hole is present in the data as a null and can be refused; here the key was never created, so there is nothing to be null. Periods we looked at and found empty are drawn as floor marks. Periods outside the data's reach get nothing at all, because claiming zero for a window we never covered is the same fabrication one level down.

events per hour

4 of 8 hours had nothing in them, drawn as floor marks rather than left out. The axis comes from the range, not from the rows, so an empty hour is visible instead of absent.

137MedianNeedsSpread

A median is a promise about the middle, and on a long-tailed quantity at small n it is a promise the data cannot keep. I measured a latency at nine records and got 1221 milliseconds; at thirteen the same measurement read 751. Four observations moved it by 470, which means it was not measuring the effect, it was measuring which four arrived. Both figures were correct medians and neither was a reading. This is not the sample-size question that applies to a rate, where the issue is confidence in a proportion. The instability here comes from SPREAD: two hundred tightly grouped points give a solid median and forty points across three orders of magnitude do not. So the quartiles and the count sit beside it, and when the middle half is wider than the median itself the range leads and the single figure is demoted, because at that point the one number is hiding most of the distribution rather than summarising it.

beacon armed at
404ms to 1497ms

The middle half, over 14 records. The median is 851ms, shown second because 14 is too few for one number to hold still: a handful more can move it a long way.

138BoundedCounter

A count held in a capped container stops rising when the container fills, and a watch keyed on the count reads that as the events stopping. It is the opposite: entries are arriving fast enough to push older ones out. I relayed a false all-clear built on exactly this, that refusals had stopped and slots were free, when the most recent refusal was forty seconds old and the log had simply reached its ceiling. A capped count is flat when nothing is happening and flat when everything is, which are the two readings a monitor most needs to separate, and the flat line is the tell rather than the evidence. So at the cap the figure is reported as a floor rather than a number, and the age of the newest entry is shown beside it, because once the total is pinned that timestamp is the only thing still carrying information.

scheduler refusals
at least10000

The container holds 10000 and is full, so this is a floor and not a count: it stays here whether refusals have stopped or are arriving faster than ever. The newest arrived 394h ago · stale, which is the part still carrying information.

139SumOfRounded

Four shares of 24.9 percent round to 25 each and print as a tidy 100. Three shares of 33.33 print as 33.3 and add to 99.9. Nobody has made an arithmetic error: rounding each part on its own and then reading them as a set is the error, and the reader's first assumption is that a category was dropped or a number is missing. The usual fix is worse than the problem. Pushing the difference into the largest slice makes the column add up and makes exactly one row wrong, silently, forever. Naming the residual keeps every part true and tells the reader why the total does not match, which is a smaller lie than a slice that has been quietly adjusted to hide it. This is not the too-many-digits problem: the digit count here can be exactly right, and the defect appears only when the rounded parts are put next to each other or next to a total.

share of volume
Paradex
33.3%
Extended
33.3%
Hyperliquid
33.3%
shown total
99.9%

The parts are each rounded to 1 decimal and add to 99.9% against a true 100%, a difference of 0.1%. Nothing is missing. The difference is not pushed into the largest row, because that would make the column add up and one row wrong.

140DistinctNotEvents

An hour of traffic showed 39 events and read as a busy hour. It was 8 visitors, and two of them accounted for 28 of the rows. The count was right and every sentence built on it was wrong. This matters most exactly where it is least visible, at low volume, where one enthusiastic session doubles the number and a quiet week can be made to look busy by a single person refreshing. It is not the outlier problem, which is about a mean dragged by one value and answered with a median. There is no average here at all. The defect is the unit: events answer how much happened, people answer how many wanted it, and a product decision almost always needs the second while the convenient query returns the first. So both are shown, always, with the busiest contributor's share beside them, because the ratio alone cannot say whether the activity is spread or concentrated in one enthusiast.

landings this hour
8visitors, from 39 events

One of them accounts for 38% of the events, so the events count describes that one visitor more than the group.

141DefinitionChanged

A metric's definition changes and the series keeps its name, so the chart shows a clean step that every reader attributes to the product. It is the most convincing kind of false finding, because a step is exactly what a real change looks like and the explanation arrives ready made. This is not hypothetical here: our own acceptance measure stopped gating on a field that is about 85 percent null, and any before and after across that date is comparing two different questions while looking like one series. So the line is broken at each revision and the revisions are listed underneath in the reader's own terms. Comparing across one is not forbidden, because sometimes it is the only data there is. It is made visible, so a reader chooses to do it rather than doing it without noticing.

acceptance rate
  • 2026-09-03: stopped gating on build_success, which is ~85% null
  • The line is broken at each change because the two sides answer different questions. Comparing across one is sometimes the only data there is; this makes it a choice rather than an accident.

142DenominatorMoved

A failure rate halves and the room congratulates itself. Failures were flat; traffic doubled. Or a conversion rate jumps because a filter started excluding the visitors who were never going to convert. The rate is arithmetically correct at both ends and the sentence built on it, that we halved failures, is false. At the volumes we actually run at, this is most of the movement in any rate we publish, because the denominator is a handful of people and it swings by more than the behaviour does. This is not the tiny base problem, which asks whether the base can carry a percentage at all; the base here can be perfectly large. The question is which side moved, and a rate cannot answer it because it discarded that by construction. So both sides are shown and the dominant one is named, and when the numerator is flat the rate is reported as a fact about traffic rather than about the thing being counted.

build failure rate
10.0% to 5.0%
failures
10 to 10
attempts
100 to 200

The failures barely moved. The rate changed because the attempts did, so this is a fact about attempts rather than about failures.

143RankWithinNoise

A leaderboard is an ordering, and an ordering is a claim that each row is genuinely above the next. On the counts we usually have, that claim is unsupported: twelve against eleven is a coin landing, and the table states it as a rank with all the authority of a sorted column. Somebody then moves effort to whatever sits on top. This is not the small sample problem applied to one figure, where a single rate is withheld. Each row here may be measured perfectly well. What the data cannot support is the order between them, which is a different claim and the one the reader actually takes away. So rows that cannot be separated share a rank and are marked as tied, and they keep their counts, because greying the numbers away would hide that they were measured at all. The interval is the crude one on a count, which is honest about being crude and still far better than assuming sorted means ordered.

stalls by rule
  1. =1R7 repeated ask12
  2. =1R2 frustration11
  3. =1R5 no output4

The top rows cannot be told apart at these counts, so they share a rank rather than being ordered. Acting on which is "first" would be acting on the sampling.

Add as a preferred source on Google