Earn Mode
Earn Mode is a policy: a switch, a set of conditions, and a set of limits. It's enforced where it runs — in the browser today (see Earn Mode in the browser), or by the optional desktop app later. Each shows only the conditions and limits it can actually enforce.
The model is EarnModePolicy in shared/src/earn-mode.ts.
Conditions
All enabled conditions must be true before anything is contributed.
| Condition | Meaning | Default |
|---|---|---|
| Idle | No keyboard or mouse input for N minutes | On, 15 minutes |
| Plugged in | The computer is on external power | On |
| Battery | Battery at or above N%. Treated as met on devices without a battery | On, 50% |
| GPU usage | The owner's own GPU use is below N% | On, 20% |
| Active hours | Local time is inside a window, which may cross midnight | Off, 23:00–07:00 |
Earn Mode itself is off by default. Nothing contributes until the person turns it on.
Evaluation
evaluateEarnMode(policy, inputs) returns a check per enabled condition (met, unmet or unknown) and a single ready flag.
readyis true only when Earn Mode is on and every check ismet.- An unknown reading never counts as met. If the device can't tell whether it's idle, Earn Mode waits.
- When any condition stops being met while contributing, contribution must stop promptly and the state change must be reported.
The website's Earn Mode page runs this same function against a hypothetical computer so people can try the rules.
Limits
While contributing, Idlecash stays within these bounds:
| Limit | Range |
|---|---|
| CPU share | 10–100% |
| GPU share | 10–100% |
| Storage allocation | 0–2,000 GB |
| Bandwidth | 0–1,000 Mbps |
Resource groups (compute, storage, bandwidth) can also be switched off entirely. Storage and bandwidth are off by default and marked "coming later" in the product until supported workloads exist for them.
States
| State | Meaning |
|---|---|
off |
Earn Mode is switched off |
waiting |
On, but a condition isn't met |
ready |
All conditions met; waiting for a workload |
contributing |
A workload is running within the limits |
paused |
Temporarily paused by the owner |