Earning
Bliss (BLS) is the contribution ledger behind earning on Eustress. Studio reports the time you spend building, a witness service scores it, and at UTC midnight your day's score earns a share of that day's BLS and, once you have verified your identity and connected Stripe, a share of the treasury's USD drip.
01Overview
How Earning Works
Earning has three moving parts. Studio measures the time you spend building
and sorts it into contribution types. The witness, a Cloudflare Worker at api.eustress.dev, checks each submission, weights it and adds
it to your score for the current UTC day. At 00:00 UTC a scheduled run closes
the day that just ended: it credits BLS in proportion to each contributor's
score, then pays out a slice of the USD treasury by the same score.
The two payouts are separate flows cut from one score. The dollars you receive are your share of that day's treasury drip, not a conversion of your BLS, and a USD payout leaves your BLS balance untouched.
BLS and Tickets
| Bliss (BLS) | Tickets (TKT) | |
|---|---|---|
| How you get it | Earned from your daily contribution score | Bought with USD at /tickets |
| Precision | 2 decimals (1 BLS = 100 minor units) | Whole Tickets |
| Where it is kept | An append-only ledger the witness publishes | A balance on your account |
| Becomes dollars? | No. Dollars come from the treasury drip | No |
BLS is earned; Tickets are bought, or received from a sale. The witness has no exchange between them, and neither one converts to dollars. Dollars reach contributors one way: the treasury's daily drip.
What Runs Today
| Part | Today |
|---|---|
| Contribution tracking in Studio | Built, on by default |
| Scoring, limits and co-signing | Built, in the witness |
| Daily BLS emission and the public ledger | Built, runs at 00:00 UTC |
| USD drip to Stripe Connect | Built, needs identity verification and a connected account |
| Buying Tickets, funding the treasury | Built |
| Spending Tickets in a marketplace | Sale rule built in the witness, no listings yet |
| Spending BLS | Burn endpoint built, nothing spends BLS yet |
| Full node duties, the Bliss chain | Designed, not built |
The witness is a single service run by Eustress, and its ledger is off-chain: a balance is a record the witness keeps and publishes, not a token on a blockchain.
02Studio Setup
Signing In
Earning needs a session with the witness. Sign in with the identity file you
downloaded when you registered on eustress.dev (eustress-<username>.toml). Studio reads its public_key and private_key, signs a challenge
from the witness with the Ed25519 key and receives a session token. At launch,
Studio signs in again with your most recent identity.
Studio still signs you in locally, but it cannot answer the witness's challenge, so it submits nothing and the badge says so. Load the complete file registration downloaded. The session token itself lasts 72 hours and Studio does not renew it while running, so after three days in one session, open your identity again or restart Studio. Time you worked meanwhile stays in the local file and is sent after you sign in.
The Bliss Badge
The Bliss badge sits beside your account badge in the ribbon and shows your
balance to 2 decimals. Click it for the balance, a Pending line, the node mode and your bonus multiplier. While you are earning, Pending
reads +N pts today: the score the witness has credited for the
current UTC day plus Studio's estimate for work it has not sent yet. When earning
is blocked, the Pending line says why:
| Pending line begins | Meaning |
|---|---|
| Sign in to earn BLS | No identity is signed in. |
| Identity not verified | Studio has no session from the witness: the file lacks a private key, the witness was unreachable at sign-in, or it rejected the identity. |
| Not syncing | Three submissions in a row failed for a reason other than sign-in. Work is saved locally and retried. |
| Bliss disabled | Earning is turned off in settings. |
Each credited submission logs a line in Output, such as Bliss: +15.0 pts co-signed (Development). Unsent time is saved
to ~/.eustress_engine/bliss_tracker.toml every 30 seconds and on
exit. The balance in that file is only a display cache that the next heartbeat
overwrites; the ledger itself lives with the witness.
Light and Full Nodes
The badge dropdown offers two node modes under NODE MODE. Light Node is the default, at 1.0x. Full Node multiplies the score of every co-signed
submission by 1.1. Studio saves the choice as bliss_node_mode in ~/.eustress_engine/settings.json and restores it at launch.
The witness never takes the mode from a submission. It uses the mode Studio last reported in its heartbeat, which Studio sends every 90 seconds, so a switch counts from the next heartbeat. When Bliss is enabled, Studio also starts a small local node service on port 7777 that answers health and identity checks. Earning does not route through it: the tracker talks to the witness directly.
The Full option describes chain storage and block production. Those duties belong to the Bliss chain, which is designed but not built, so today both modes run the same local service and differ only in the multiplier.
Turning Earning Off
Earning is on by default. To turn it off, close Studio, set bliss_enabled to false in the settings file and
start Studio again. Studio then skips the local node, submits no work and the
badge reads Bliss disabled. It still tallies active seconds in its
local file, and sends them if you turn earning back on.
{
"bliss_enabled": false,
"bliss_node_mode": "Light"
}03Earning BLS
What Studio Measures
Studio counts a moment as work only when its window has focus and you pressed a key, clicked, scrolled or moved the mouse in the last 60 seconds. It files each such moment under one contribution type, taking the most valuable signal first:
| Signal in the last 120 seconds | Type | Weight |
|---|---|---|
| You edited text in a script tab | Development | 3.0 |
| You made a change that lands on the undo stack | Creation | 2.5 |
| Neither: navigating, inspecting, testing | ActiveTime | 1.0 |
Undo and redo are not new work; only a new undoable change is. Every 5 minutes Studio submits what it has gathered, in chunks of at least 60 seconds and at most one hour, up to 6 chunks at a time, so an offline backlog drains steadily after you reconnect.
Scores and Weights
The witness turns each submission into a score measured in weighted minutes:
An hour of scripting on a Light node scores 3.0 x 1.0 x 60 = 180. The weights come from the witness's own table, which lists more types than Studio sends. A type outside the table is rejected.
| Type | Weight | Sent by Studio |
|---|---|---|
Development | 3.0 | Yes |
Creation | 2.5 | Yes |
Education | 2.2 | No |
Collaboration | 2.0 | No |
Optimization | 2.0 | No |
QualityAssurance | 1.8 | No |
Moderation | 1.5 | No |
Documentation | 1.5 | No |
ActiveTime | 1.0 | Yes |
Custom | 1.0 | No |
Sales add a second kind of score, value score, covered under Selling for Tickets.
Limits the Witness Enforces
A submission is a claim, and the witness is the only trust boundary. Whatever a client sends, it bounds what any one account can earn:
- Known types only. A type outside the weight table is rejected.
- One hour per submission. Duration is clamped to 1 to 3,600 seconds.
- 120 submissions an hour per account.
- Each piece of work once. Studio hashes your account, the day, the type, the duration and a chunk counter into every submission, and the witness refuses a hash it has seen in the last 2 days.
- ActiveTime needs presence. Credited ActiveTime cannot exceed the time the witness saw you online through heartbeats, and one heartbeat adds at most 150 seconds of presence.
- A daily ceiling. Effort score stops at 3,200 per account per UTC day. Sixteen hours of Development on a Full node comes to 3,168.
- The bonus is observed. The 1.1x comes from the heartbeat mode, never from the submission.
When a limit trims a submission to nothing, Studio puts that time back in its local tally and offers it again at a later flush.
The witness stamps each accepted submission with a SHA-256 digest of your account, the contribution hash and the time. It records that the witness accepted the submission under the rules above, which cap what any account can earn in a day.
04Daily Distribution
Emission Schedule
BLS started from a supply of 100,000,000. Each year the supply grows by an emission rate that halves every 4 years and never falls below 0.5%.
| Whole years since genesis | Annual rate |
|---|---|
| 0 to 3 | 5% |
| 4 to 7 | 2.5% |
| 8 to 11 | 1.25% |
| 12 to 15 | 0.625% |
| 16 and later | 0.5% (the floor) |
Genesis is the date of the first distribution, and a year counts only when 365 whole days have passed. A day's emission ceiling is the current supply times the annual rate, divided by 365. At the genesis supply that is 100,000,000 x 5% / 365, about 13,698.63 BLS. Supply grows by exactly what each day mints, so the ceiling creeps up with it.
The Effort Gate
The ceiling is a maximum, not a promise. A day mints its ceiling scaled by how much work the network did:
A day whose contributors scored 1,440 or more in total mints the whole ceiling. A day at 720 mints half, and the other half is never created. Supply tracks the work that happened rather than the calendar, while each contributor's share of what is minted stays proportional to score.
The Public Ledger
Balances are an append-only ledger of integer entries in minor units (1 BLS = 100), and a balance is the sum of its entries. After each nightly run the witness snapshots the whole ledger to storage. Three read endpoints need no sign-in and answer any origin, so anyone can re-derive a day's emission by hand:
| GET on api.eustress.dev | Returns |
|---|---|
/api/ledger/summary | Supply, total distributed and burned, circulating BLS, the treasury balance, the emission model and the last 60 distributions |
/api/ledger/distribution/{date} | One day's record: ceiling, total score, utilization, and each recipient's score and credit, by account id |
/api/ledger/history/{account id} | One account's balance, day by day |
Signed in on the website, /bliss/history shows your own Wallet Ledger: balance, credited days, the average per credited day, a cumulative chart and a row for each credited day. /bliss shows the network's live figures, including the treasury balance, supply and the day's emission ceiling, refreshed every 20 seconds.
05USD Payouts
The Treasury
The treasury is a USD balance the witness keeps for contributors. Two things add to it:
- Ticket sales. Half of each purchase's net revenue, after the payment channel's fee (see Where the Money Goes).
- Direct funding. Anyone can fund it from the Fund the Treasury section of /bliss, one-time or monthly. The witness adds the full amount of each completed checkout; for a monthly subscription that is the first payment, because the witness does not record renewals yet.
Only the daily payout takes money out, and only by what Stripe actually transferred. The dollars sit in Eustress's Stripe account until a transfer pays them out. Funding the treasury is a gift to the contributor pool: it earns the funder no BLS and no Tickets.
The Daily Drip
After the BLS distribution, the same midnight run pays out a fixed fraction of the treasury:
| Mode | When | Daily drip | Split |
|---|---|---|---|
| Normal | Treasury above 15% of its high-water mark | 0.276% of the treasury | By score |
| Scarcity | Treasury at or below 15% of its high-water mark | 0.136% of the treasury | By score, with the top 25% of contributors counted double |
The high-water mark is the treasury's highest balance. Deposits raise it, and after each payout run it decays 0.171% a day toward the current balance, so one large deposit cannot hold the system in scarcity forever. A $10,000 treasury drips $27.60 in normal mode. With no new deposits and every day's drip paid out, a balance halves in about 251 days.
The drip is divided by the same day score as BLS, among contributors who have a connected Stripe account and are not banned. Without a connected account your score still earns BLS but takes no part in that day's split. Each transfer is rounded down to the cent, one under $0.50 is skipped and stays in the treasury, and a day whose whole drip is under $0.50 pays nothing. Every transfer carries an idempotency key built from the date and your account, so a retried run cannot pay you twice.
Identity Verification
Payouts go to verified adults. Registering on eustress.dev includes identity verification as step 2 of 3, and the witness checks that record again before it creates a payout account.
- Photograph the front of a government photo ID, and the back when it has one. JPEG, PNG, WebP and PDF files up to 12 MB are accepted, and the witness checks that each file's bytes match its type.
- On a desktop without a good camera, scan the QR code and finish on your phone at /verify within 30 minutes. Your name and date of birth stay on the server and never travel through the code.
- The witness sends the images to xAI's Grok model, which checks the document, reads your name and date of birth and screens the application in one call. If that check cannot run, the application is rejected and flagged for manual review rather than approved.
The minimum age is 18, raised where the local age of majority is higher: 19 in Canada and South Korea, 20 in Thailand, and 21 in Singapore, Indonesia, the United Arab Emirates and Egypt. The date of birth on the document decides; if it cannot be read, verification stops rather than falling back to the date you typed. An account the payout gate finds under age is told the date payouts unlock.
Connecting Stripe
Signed in on eustress.dev, open /bliss and choose Connect Bank Account. The witness checks your verification and age, then creates a Stripe Connect Custom account in the country recorded when you verified, with the date of birth read from your document. It passes your ID images to Stripe and sends you to Stripe's hosted onboarding to add what Stripe needs to pay you, such as a bank account. When you finish, Stripe returns you to /bliss.
Your account joins the split at the next midnight run. A transfer Stripe refuses is skipped, and that amount stays in the treasury.
06Tickets
Packages
Tickets (TKT) are bought at /tickets through Stripe Checkout, in five packages. Larger packages add bonus Tickets:
| Package | Price | Tickets | Bonus | Total |
|---|---|---|---|---|
| Starter | $4.99 | 400 | 0 | 400 |
| Standard | $9.99 | 800 | 80 | 880 |
| Mega | $19.99 | 1,600 | 240 | 1,840 |
| Super | $49.99 | 4,000 | 1,000 | 5,000 |
| Ultra | $99.99 | 8,000 | 2,800 | 10,800 |
Tickets are credited when Stripe confirms the payment through a signed webhook. The witness refuses a webhook whose signature does not verify or is more than 5 minutes old, and processes each checkout session once.
Where the Money Goes
The witness takes the payment channel's fee off the top, then splits the rest evenly between the treasury and the platform:
| Channel | Fee taken first |
|---|---|
| Web (Stripe) | 2.9% + $0.30 |
| iOS, Android, Steam | 30% |
Every purchase today goes through web checkout. On the Standard package:
price $9.99
channel fee $9.99 x 2.9% + $0.30 = $0.59
net $9.99 - $0.59 = $9.40
to the treasury 50% of net = $4.70
to the platform 50% of net = $4.70Selling for Tickets
The witness already carries the rule a sale follows. When a buyer spends Tickets on a creator's product, the creator receives 70% of the price, rounded down to a whole Ticket, and the platform keeps the rest. The creator also earns value score: 0.5 per Ticket received, added to that day's score with no daily ceiling. A sale of 1,000 Tickets gives the creator 700 Tickets and 350 value score, which counts toward both the day's BLS and its USD drip.
The marketplace API returns no listings, so /marketplace has nothing for sale and Tickets bought today stay in your balance. Tickets convert to neither BLS nor dollars.
07What's Next
Proof of Work
Contributions will be anchored to artifacts the witness can check for itself, such as a published Space or a pushed commit, so Development and Creation scores rest on the work they describe.
Marketplace and Spending
Listings will arrive at /marketplace and sell for Tickets under the 70/30 rule
above, with value score for the creator. Inside experiences, MarketplaceService will connect to the same catalog; in Luau and
Rune it is a placeholder today, where PromptPurchase opens nothing
and PlayerOwnsGamePass returns false. Features that spend BLS will
use the witness's spend endpoint, which burns BLS rather than moving it, so the
emission schedule stays the only source of new BLS.
The Bliss Chain
The decentralization plan moves the ledger onto the Bliss chain, run by independent nodes. Today's emission and treasury rules will become the chain's mint rule, BLS will gain peer-to-peer transfers, nodes that store published Spaces will earn from a storage contribution type, and Full nodes will take on real duties.
Build in Studio. The witness keeps the count.