What UPTIME is
A panel earns by being watched. Presence is measured on the server, in fixed five-minute intervals, and the fee revenue for each interval is split between the panels that were actually present for it.
There is no hashing and no work. The only scarce thing being measured is a browser tab that a person is keeping on screen, and the only way to hold weight in the split is to keep that tab visible while holding 100,000 $UP.
The whole loop
- You sign a message with your wallet. Nothing is transferred and no transaction is approved.
- The tab reports in every 10 seconds while it is visible. The server credits the time it observed.
- At the end of each five-minute interval, your credited time is divided by everyone's credited time. That fraction is your share.
- Trading fees buy NVIDIA xStock. Closed intervals become claimable in one transaction; you pay the gas.
Note
The contract is not published yet, so panel weight, the interval pool and claimable rewards print — everywhere on this site. Those fields turn on the moment the contract address is set, and nothing is estimated in their place before then. See Rewards in NVDAx.
Related: Quick start · Measuring presence · Intervals and share
Quick start
Three steps and roughly thirty seconds.
1. Install a Solana wallet
Phantom or Solflare as a browser extension. A panel is just a wallet address — there is nothing to register and no account to make.
2. Open the panel and sign
Go to Status and press Connect panel. Your wallet will ask you to sign a short text message that names your address, a one-time nonce and a timestamp. Signing proves the key is yours. It moves no funds and approves no transaction.
3. Leave the tab alone
That is the whole job. While the tab is visible it reports in every 10 seconds and your held time accumulates. You can watch it climb in the Session figure and in the uptime bar.
Note
Hiding the tab, minimising the window, locking the screen or reloading the page all end the session. There is no automatic resume — you sign again to rejoin. Time you already held stays in the ledger.
Doing it from the console
Everything the button does is also available from the browser console. Press F12 on the panel page and run:
uptime.start()
See Console commands for the rest.
Related: Sessions and drop-outs · Panel weight and the gate
Measuring presence
Presence is what the server observed, not what the client claimed. Every figure on this site comes out of that record.
The heartbeat
While the tab is visible it sends a ping every 10 seconds. Each ping carries the session id and whether the document is currently visible; it carries no timing claim of its own. The server looks at its own clock, measures the gap since your last ping, and credits that gap.
| Setting | Value | Why |
| Heartbeat | 10 s | Often enough to be accurate, cheap enough to run all day. |
| Credit cap per ping | 20 s | A client that stalls and resumes cannot backfill the time it was gone. |
| Drop threshold | 30 s | Three missed pings and the session is closed. |
Why the cap matters
Suppose a tab freezes for four minutes and then sends one ping. The observed gap is 240 seconds, but only 20 are credited — the cap. The remaining 220 seconds are simply not earned by anyone. In practice the 30-second drop threshold will already have closed that session, and the ping is refused outright.
Interval boundaries
Intervals are fixed windows on the wall clock, so a credited gap can straddle one. The server splits it to the millisecond and files each part in the interval it actually belongs to. A ping landing 3 seconds after an interval opened credits 3 seconds to the new interval and the rest to the one that just closed.
Related: Intervals and share · HTTP API
Sessions and drop-outs
A session is opened by a signature and closed by absence. Both ends are recorded.
Opening
The server issues a nonce, you sign the message containing it, and the signature is verified against your public key. A nonce is single-use and expires after two minutes, so a captured signature cannot be replayed to open a second session.
What ends a session
| Cause | What the log says |
| Tab hidden or minimised | tab left the viewport |
| 30 seconds without a ping | no ping for 30s |
| Page reloaded or closed | closed by panel |
| Signed in again elsewhere | superseded by a new session |
There is no resume
Every drop-out is written to Incidents with its cause and how long the panel had held before it happened. The record is permanent. What you already earned stays in the ledger — a drop-out costs you the time after it, not the time before.
Related: Incidents · Troubleshooting
Intervals and share
Your share of an interval is your held time divided by everyone's held time in that same interval.
share = your presence (ms) / network presence (ms)
Worked example
Three panels are up during one five-minute interval, which is 300,000 ms long:
| Panel | Held | Share |
| A — up the whole interval | 300,000 ms | 54.5% |
| B — joined halfway | 150,000 ms | 27.3% |
| C — dropped out after 100 s | 100,000 ms | 18.2% |
| Network presence | 550,000 ms | 100% |
Panel A is credited 300,000 / 550,000 of that interval's pool. Nobody is paid for the empty capacity — if only one panel is up, that panel takes the whole interval.
Reading the uptime bar
The bar on Status is 90 intervals, newest on the right, and each segment is coloured by how much of that window you held.
| Segment | Meaning |
| Held | 98% of the window or more. |
| Partial | Between 50% and 98%. |
| Dropped | Under 50% — you were there, but barely. |
| No data | No session at all in that interval. |
The percentage on the black glass is held time over observed time, counted from your first recorded interval onward. Intervals from before you ever connected are not held against you.
Related: Ledger · Measuring presence
Panel weight and the gate
Weight qualifies you. Presence sizes you.
A wallet holding at least 100,000 $UP is a qualified panel. Holdings are read from the mint on-chain at the moment the session opens, using the wallet's token accounts under both the Token and Token-2022 programs.
The three states
| State | What it means |
| Qualified | At or above the gate. The session carries weight. |
| Below gate | The session still runs and still logs presence, but carries no weight in the split. |
| Unknown | The chain could not be queried. This is not the same as a confirmed zero, and the site says so rather than guessing. |
Note
With no contract published there is nothing to read, so weight shows — and the state is pending contract. Sessions, presence and the ledger all work normally in the meantime.
Related: Rewards in NVDAx · Intervals and share
Rewards in NVDAx
The pool is a real NVIDIA xStock balance, not a points system.
Where the money comes from
- Trading fees accumulate to the protocol wallet.
- They are swapped for NVDAx — NVIDIA xStock on Solana, a Token-2022 mint.
- The balance bought inside an interval is that interval's pool.
- When the interval closes, each panel's share of the pool becomes claimable.
| Field | Value |
| Reward asset | NVDAx · NVIDIA xStock |
| Mint | — |
| Token program | Token-2022 |
| Price source | Jupiter, keyless |
| Claim | One transaction, all finalised intervals. Gas is yours. |
What is not live yet
No contract means no fee revenue, which means no pool. Rather than showing a plausible-looking zero or a projection, the interval pool and claimable balance print —. The NVDAx price shown around the site is live and read from the market right now — it is the one number here that does not depend on launch.
Related: Panel weight and the gate · Ledger
Console commands
The panel page exposes the same actions as the buttons. Press F12, open the Console tab, and type.
| Command | What it does |
| uptime.start() | Connects the wallet if needed, signs, and opens a session. |
| uptime.stop() | Closes the session. Held time stays in the ledger. |
| uptime.status() | Returns what the server currently sees for this panel. |
What status returns
> uptime.status()
{
panel: "7jfG…uDe1",
live: true,
sessionUptimeMs: 184000,
weight: null,
weightStatus: "pending-ca",
interval: 5960939,
panelsLive: 3,
nvdaxUsd: 219.55
}
weight: null with weightStatus: "pending-ca" is the expected answer before launch — see Panel weight and the gate.
Related: HTTP API · Quick start
HTTP API
Every figure on this site is one of these calls. They are open — you can audit the numbers without trusting the page.
| Endpoint | Returns |
| GET /api/config | Ticker, contract, gate, reward mint, interval and heartbeat timings. |
| GET /api/network | Panels live, current interval, network presence, and the last 12 intervals. |
| GET /api/price | NVDAx in USD, with the timestamp of the quote. |
| GET /api/wallet?pubkey= | One panel's full record: session, 90 intervals, incidents, log. |
| GET /api/session/nonce?pubkey= | A nonce and the exact message to sign. |
| POST /api/session/open | Verifies the signature and opens a session. |
| POST /api/session/beat | The heartbeat. Credits the observed gap. |
| POST /api/session/close | Ends the session and files the drop-out. |
Any panel's record is public
Append a wallet to the panel page to read it without connecting anything:
/status?panel=<pubkey>
The page opens read-only, showing that panel's uptime, ledger and incidents exactly as its owner sees them.
Related: Measuring presence · Console commands
Troubleshooting
"No Solana wallet was found"
No wallet extension is installed in this browser, or it is disabled for this site. Install Phantom or Solflare, reload the page, then press Connect panel.
My session keeps dropping
Something is hiding the tab. The usual causes are switching to another tab, minimising the window, the screen locking, or the browser throttling a background tab. Keep the window visible and awake — that is the entire product.
Panel weight shows a dash
Before launch this is expected: there is no contract to read. After launch a dash means the chain could not be queried, which is deliberately shown differently from a confirmed zero.
My ledger is empty
The ledger only lists intervals in which the server credited you presence. A session that has not yet survived a full interval will show the open interval and nothing else.
I signed but nothing happened
If the nonce is older than two minutes it is rejected and you have to start again. Press Connect panel to get a fresh one.
Related: Sessions and drop-outs · Incidents
Glossary
- Panel
- A wallet with an open session. Named after the households in an audience measurement panel — you are counted because you are present, not because you did work.
- Presence
- Milliseconds the server observed you holding the tab, inside a given interval.
- Interval
- A fixed five-minute window on the wall clock. Not a per-user timer.
- Share
- Your presence divided by the network's presence in the same interval.
- Weight
- Your $UP balance read on-chain at session open. It qualifies you for the split; it does not size your share.
- Gate
- The 100,000 $UP minimum for a session to carry weight.
- Incident
- A recorded drop-out, with its cause and how long you had held.
- Pool
- The NVDAx bought with trading fees during an interval.
- Finalised
- An interval that has closed, so its split is settled and claimable.
Related: What UPTIME is