The Lounge (/lounge) is Levee's community view: who is active, what they just did, and how the points stand. It has no chat. Everything it shows is on chain, signed by a wallet, or read from the points ledger, and every address in it links to that address's profile.
Points leaderboard
GET /points/leaderboard ranks every address with more than zero points. It computes the totals the way GET /points/:address does: 1 point per dollar of volume and 5 per dollar of fees earned, and volume counts double for 7 days after you post an idea. The rule and what earns points are in Fees and referrals.
Addresses on equal points share a rank and the next rank skips past them (1, 2, 2, 4). Ties are listed in address order. The ranking is rebuilt from the whole ledger at most once a minute, so a new point can take up to a minute to move a rank.
The page shows the top ten and can open the top fifty. With a wallet connected, your own row is marked and tagged "You". When you rank below the rows shown, your rank and points are written under the table. Each row links to that address's profile and has a Follow button.
| Name | Allowed | Default | Effect |
|---|---|---|---|
limit | 0 to 200 | 50 | rows returned; 0 returns only your own row |
address | 0x address | none | adds that address as `you`, wherever it ranks |
The answer carries rows, you (null without points), ranked (how many addresses have points) and asOf (unix seconds of the ranking).
Live activity
GET /lounge/feed merges the newest rows of what the API and the indexer already store, without any indexer change:
| Line | Where it comes from |
|---|---|
| Idea | the API's theses table: the market, the side and the first 200 characters |
| Deposit, withdrawal | indexer vaultEvent rows of kind deposit or withdraw, named after their vault |
| Pool launch | indexer ammPool rows of kind damm: a token launched from Launch, or a Levee pool opened for an existing token |
| Graduation | indexer graduation rows once the token has a managed vault |
| Limit order filled | indexer rangeOrder rows with status filled, with the amount the order sold |
The API reads the newest 40 of each source and keeps the newest 120 lines in all. One build answers every request for 10 seconds. Amounts are priced as the points ledger prices them (USDG at $1, WETH and ETH at the ETH mark, stock tokens at their market); a token nothing prices shows its amount without a dollar value. Levee's own contracts are never named as the one who acted: a vault depositing into its sleeve is left out, and a pool created through the launch contract shows no creator.
The page asks again every 15 seconds and stops while the tab is hidden; it asks once more when you come back. New lines fade in once. If one source does not answer, the others are still listed and the page says some on-chain activity is still loading.
Everyone / Following. Following sends follower=<your address>, and the API keeps only the lines whose actor you follow. The kind pills (Ideas, Vaults, Launches, Limit orders) narrow the list on the page.
| Name | Allowed | Default | Effect |
|---|---|---|---|
limit | 1 to 120 | 40 | lines returned, newest first |
follower | 0x address | none | only lines from the addresses it follows |
Top ideas this week
The ideas posted in the last 7 days (GET /theses), best result so far first; ideas without a result yet follow, newest first. Each shows its author's place on the Ideas track records (GET /theses/leaderboard) and opens the idea's own page.
Profiles
/lounge/u/<address> shows one address: its ideas with their results, its track record (rank, ideas, fees realised and PnL from the Ideas leaderboard), its points, rank and where they came from, how many addresses follow it and how many it follows, how many addresses it has referred (referredCount from GET /referral/:address, read from ReferralRegistry events), and its recent lines in the feed. Authors on the Ideas board and rows of the leaderboard link here. Profiles are rendered on request and kept out of search engines.
Follows
A follow is a public edge from one address to another, kept in the API's Postgres (follows: follower, followee, created at; migration 0002). Every change is one POST /follows carrying a signature from the follower's wallet over
FollowUpdate { address account; address[] follow; address[] unfollow; string nonce; uint256 ts }
under the domain the ideas and perp orders use ({ name: 'Levee', version: '1', chainId }). The addresses are in the message itself, so your wallet shows exactly whom you follow. @levee/core's buildFollowTypedData builds it on both sides. It costs no gas and moves no funds.
| Name | Allowed | Default | Effect |
|---|---|---|---|
follow + unfollow | 1 to 100 addresses | - | per update; one address cannot be in both |
following | up to 500 addresses | - | per address, after the update |
ts | ±300 s | - | from the API clock, like the perp envelope |
nonce | 16 to 64 bytes | - | random, used once per address |
| Code | Status | When |
|---|---|---|
invalid_address | 400 | the body has no 0x address |
invalid_follow_list | 400 | a list is not addresses, or one address is in both |
empty_follow_update | 400 | nothing to follow or unfollow |
too_many_addresses | 400 | more than 100 addresses in one update |
self_follow | 400 | an address follows itself |
too_many_follows | 400 | the update would pass 500 follows |
unauthorized | 401 | no envelope, or the signature is not from address |
stale_ts | 401 | ts more than 300 s from the API clock |
nonce_used | 409 | the nonce was already used by this address |
Before the Lounge, Follow on the Ideas board kept its list in the browser. Those follows still show, and the first signature you give sends them with it; after that the browser copy is cleared. "Keep them with your wallet" sends them on their own. Signed out, Follow opens the wallet connection.
apps/api/src/lounge/leaderboard.tsrankPoints and the one-minute rankingapps/api/src/lounge/feed.tsthe feed sources, labels, prices and the 10-second buildapps/api/src/routes/follows.tsGET and POST /follows: the checks in orderpackages/core/src/follows.tsthe FollowUpdate message both sides buildapps/web/lib/lounge/useFollowing.tssigning a follow and moving the browser listapps/web/app/[lang]/(app)/lounge/ActivityFeed.tsxthe 15-second poll and the Following switch