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.

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 v3WETH → 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.

110 of 481 / 5
110 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 201h 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 200h ago
BTC went above 77,000 200h ago
Cancelled a limit order on ZEC 201h 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

201h 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.