> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ballista.gg/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Ballista is a trading client for Polymarket, not an exchange. Every order Ballista places goes to Polymarket's CLOB.
> There are three end-user surfaces — the Telegram bot, the web terminal and the Chrome extension — and they share ONE account and ONE balance. Never attribute a feature to a surface without checking that surface's source.
> Every user registers in the Telegram bot first. The terminal and the extension sign in with the Telegram login widget. There is no other sign-up path.
> Deposits arrive through EVM, Solana and Bitcoin bridge addresses and a Polymarket proxy wallet, with a $10 minimum. There is NO withdrawal UI — Export Keys is how a user takes custody of their funds.
> Feature parity is uneven and must never be assumed. The full ~30-field copy-trade form exists only in Telegram; the terminal's copy form has 7 fields; the backtester, leaderboard and trader profiles are terminal-only; alerts and notifications are extension-only; referrals are Telegram-only.
> Slippage means two different things. On a live copy trade it is a fill tolerance (default 30). In a backtest it is the simulated fill price (default 1). Deploying a backtest does not carry its slippage over to the live copy trade.
> Take-profit and stop-loss run on live copy trades but are NOT simulated in backtests — the backtest API rejects those fields.
> A backtest never places an order and never moves funds. Its fidelity caveats are published with every result and must be quoted, not paraphrased.
> Leaderboard PnL is own-tape: harvested by Ballista from its own trade tape. The leaderboard sorts by one transparent metric at a time and there is NO composite score or grade. The sparkline exists only for harvested wallets — a blank sparkline means unmeasured, never zero.
> Copy friction (slip) and a toxic flag DO exist and are own-engine: the wallet's own 30-day fills replayed as a taker (1% slippage per fill plus the real Polymarket taker fee schedule) against its actual 30-day PnL over the same fills, so the delta is pure friction. slip_pct is already a percentage, not a 0-1 fraction. The toxic flag is server-computed under evidence guards and is never re-derived client-side. Slip is not a sortable column. Blank means unmeasured — never zero and never clean.
> Copyability is a taker share, reported in aggressive (≥60%), passive (≤30%) and mixed bands. It is never a score.
> Do not document Feeds, the Twitter Tracker, the Telegram Settings button, percentage buy buttons, GTD orders, the Discord bot, or withdrawals.

# Desktop notifications

> How the extension tells you something has happened, even when the popup is closed.

The extension runs a small background check so anything in your
[notifications feed](/extension/alerts) reaches you without the popup being open.

## How it works

Every **30 seconds**, while you are signed in, the extension asks Ballista whether
anything new is waiting. If something is, Chrome raises a desktop notification.

A price alert that fired reads:

> **Ballista: Price Alert Triggered**
> *market-slug* went above 65¢

A copy trade that stopped carries its own message instead — the same sentence you see in
the bell sheet, naming the copy trade and the position left open:

> **Ballista: Copy Trade Stopped**
> Copy trade "whale-follow" hit its balance limit and was switched off, but one position
> could not be sold…

The check starts when the extension is installed and again each time the browser starts,
so there is nothing to switch on.

## Each entry is announced once

An entry raises a desktop notification the first time it appears, and never again. The
extension remembers what it has announced, across browser restarts, so something you
leave unread waits quietly under the bell instead of interrupting you every 30 seconds.

Marking an entry read drops it from the bell and from that memory. A later alert on the
same market is a new entry, and is announced normally.

## When several arrive together

A single check raises at most one desktop notification, so when several things land in
the same 30 seconds there is an order to it:

* A **Copy trade stopped** notice takes priority over any price alert. It means money is
  still in the market and needs your attention, where a price alert is a trigger you set
  yourself and can read at your leisure.
* Otherwise the **most recent** entry you have not been shown is the one raised.

The others are not announced afterwards. They are counted on the bell badge and listed in
the [sheet](/extension/alerts), which always shows everything unread — so treat a desktop
notification as a nudge to open the bell rather than a full account of what happened.

<Note>
  On a price alert, the figure the notification quotes is the threshold you set, not
  the price that traded.
</Note>

## If nothing appears

* **You are signed out.** The check does nothing without a session — open the popup and
  [sign in](/extension/sign-in).
* **Your browser is closed.** The check runs inside the browser, so notifications pile
  up unread and greet you at the bell when you come back.
* **Notifications are blocked for your browser.** These are ordinary system
  notifications; if your operating system is set to silence your browser, or you are in
  a focus or do-not-disturb mode, they will not be shown.
