Learn/Earning

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.

Time17 min readLevelIntermediateUpdatedUpdated Sep 2026

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.

Studiotime, by typeevery 5 minWitnessweights, limitsscoreDay scoreper UTC day00:00 UTCBLSshare of emissionUSDshare of the drip
Studio reports work and the witness scores it. At midnight UTC one day score sets two separate shares: BLS from the day's emission and dollars from the treasury's drip.

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 itEarned from your daily contribution scoreBought with USD at /tickets
Precision2 decimals (1 BLS = 100 minor units)Whole Tickets
Where it is keptAn append-only ledger the witness publishesA balance on your account
Becomes dollars?No. Dollars come from the treasury dripNo
Info
Two currencies, kept apart

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

PartToday
Contribution tracking in StudioBuilt, on by default
Scoring, limits and co-signingBuilt, in the witness
Daily BLS emission and the public ledgerBuilt, runs at 00:00 UTC
USD drip to Stripe ConnectBuilt, needs identity verification and a connected account
Buying Tickets, funding the treasuryBuilt
Spending Tickets in a marketplaceSale rule built in the witness, no listings yet
Spending BLSBurn endpoint built, nothing spends BLS yet
Full node duties, the Bliss chainDesigned, 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.

Advanced
An identity file without its private key cannot earn

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 beginsMeaning
Sign in to earn BLSNo identity is signed in.
Identity not verifiedStudio 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 syncingThree submissions in a row failed for a reason other than sign-in. Work is saved locally and retried.
Bliss disabledEarning 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.

Info
What Full does today

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.

~/.eustress_engine/settings.json (excerpt)
{
  "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 secondsTypeWeight
You edited text in a script tabDevelopment3.0
You made a change that lands on the undo stackCreation2.5
Neither: navigating, inspecting, testingActiveTime1.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:

score = weight x node bonus x minutes
Node bonus: Light 1.0, Full 1.1

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.

TypeWeightSent by Studio
Development3.0Yes
Creation2.5Yes
Education2.2No
Collaboration2.0No
Optimization2.0No
QualityAssurance1.8No
Moderation1.5No
Documentation1.5No
ActiveTime1.0Yes
Custom1.0No

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.

Advanced
A co-signature is a receipt

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%.

100,000,000
Initial supply
5%
First-year rate
4 years
Halving period
0.5%
Floor, forever
Whole years since genesisAnnual rate
0 to 35%
4 to 72.5%
8 to 111.25%
12 to 150.625%
16 and later0.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:

minted = ceiling x min(1, total day score / 1,440)
1,440 is 8 hours of Development: 8 x 60 x 3.0

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.

Your Share

After midnight UTC the witness reads every contributor's score for the day that ended: effort score from co-signing plus any value score from sales. Your credit is your fraction of the minted pool, rounded down to a hundredth of a BLS:

Worked example, at the genesis supply
ceiling       13,698.63 BLS     100,000,000 x 5% / 365
day score     720               all contributors together
utilization   720 / 1,440     = 0.5
pool          6,849.31 BLS
your score    180               one hour of Development, Light node
your credit   180 / 720       = 0.25 of the pool  ->  1,712.32 BLS

Rounding every credit down keeps the total inside the pool, and the leftover fractions are never minted. Banned accounts receive nothing. Each day is recorded once, so a rerun of the job credits nobody twice.

Tip
Credit lands after midnight UTC

Work you do today is scored today and credited by the run at 00:00 UTC that closes the day. Until then it shows as Pending on the badge.

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.devReturns
/api/ledger/summarySupply, 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:

ModeWhenDaily dripSplit
NormalTreasury above 15% of its high-water mark0.276% of the treasuryBy score
ScarcityTreasury at or below 15% of its high-water mark0.136% of the treasuryBy 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.

  1. 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.
  2. 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.
  3. 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.
Info
Age is read from the document

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:

PackagePriceTicketsBonusTotal
Starter$4.994000400
Standard$9.9980080880
Mega$19.991,6002401,840
Super$49.994,0001,0005,000
Ultra$99.998,0002,80010,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:

ChannelFee taken first
Web (Stripe)2.9% + $0.30
iOS, Android, Steam30%

Every purchase today goes through web checkout. On the Standard package:

$9.99 Standard package, web
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.70

Selling 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.

Info
No storefront uses it yet

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.

Loading Eustress Engine...