paperroute_transparency

How PaperRoute earnings are computed

This document is the public, authoritative description of the payout math. The constants here are the same constants the code runs (apps/web/src/lib/earnings-constants.ts); if they ever disagree, that's a bug — tell us.

The formula

Every minute your device is actively used (not idle, not locked) and part of your wallpaper is actually visible, you earn:

cents = RATE × exposed_megapixels × (1 minute / 60)

where:

Constant Value Meaning
RATE_CENTS_PER_ACTIVE_EXPOSED_MPX_HOUR 2 Cents (your 50% share) per active-exposed-megapixel-hour
DAILY_ACTIVE_MINUTES_CAP 480 Earning stops after 8 active hours per device per UTC day
EXPOSED_MPX_CAP 16.5888 Exposed area is clamped to two 4K monitors (2 × 3840 × 2160 px)
CLICK_MULTIPLIER 50 A sponsor click is worth 50 impression-minutes
CLICK_CREDIT_CENTS 2 Flat click credit: round(50 × 2 / 60) — once per ad per device per day
PAYOUT_MINIMUM_CENTS 1000 $10.00 minimum balance to request a payout
MAX_DEVICES_PER_ACCOUNT 5 Devices per account

Worked example: a 2560×1440 monitor (3.7 mpx) fully exposed for an active hour earns 2 × 3.7 = 7.4 cents… but wallpaper is rarely fully exposed. A typical 30%-exposed desktop earns about 2.2 cents/hour — PaperRoute is beer money, not rent money, and we'd rather you know that up front.

Rounding

Per-minute amounts are accumulated as exact fractions and rounded once per device per day, half-down (1.5 → 1). No per-bucket rounding, no cumulative rounding drift.

What "active" and "exposed" mean

  • Active: keyboard/mouse input within the last 120 seconds, session not locked. Idle and locked minutes earn nothing.
  • Exposed: the part of the desktop wallpaper not covered by windows, measured as window rectangles only. Fully see-through overlays (screen dimmers, click-through HUDs) don't count as covering — the wallpaper behind them is visible. We never read window titles, process names, or screen contents — see the data dictionary.

Clicks

Opening the current sponsor from the tray menu (or following an ad's short link from your paired device) credits CLICK_CREDIT_CENTS once per ad per device per UTC day. Anonymous QR scans redirect but credit nothing.

The 50/50 split

Ledger amounts are your half of the ad revenue. In the MVP, the day-one inventory is operator-funded house and affiliate ads — PaperRoute itself is the sponsor, paying out of pocket at the rate above while real sponsor inventory is built. The rate may change; changes are announced and never applied retroactively.

Caps exist to keep the system honest

The daily cap, area clamp, and device limit are enforced server-side so that an inflated or dishonest client cannot mint money. Anomalous devices are flagged and their earnings held for review rather than silently paid.


Data dictionary — everything PaperRoute collects

This is the complete list of fields the desktop client ever transmits. It matches the zod contracts in packages/shared/src/index.ts field-for-field; if the code and this page ever disagree, that's a bug — tell us.

What is never collected, by design: window titles, process names, application identities, screenshots, screen contents, keystrokes, URLs, clipboard, or anything readable on your screen. The client computes geometry locally and transmits only the aggregates below.

Telemetry (POST /api/v1/telemetry, one batch per minute)

Contract: TelemetryBatch

Field Type Purpose
deviceId string Which paired device is reporting
buckets[].bucketStart integer (unix seconds, minute-aligned) Which minute the measurement covers
buckets[].exposedMpx number (megapixels) How much wallpaper was visible that minute, averaged, summed across monitors
buckets[].active boolean Whether you were present (any input in the last 120s, session unlocked)
buckets[].adId string | null Which sponsor creative was displayed

Request headers: x-device-id, x-timestamp (unix seconds), x-nonce (random, replay protection), x-signature (HMAC). None carry personal data.

Pairing (POST /api/v1/pair, once per device)

Contract: PairRequest

Field Type Purpose
code string The one-time code you generated in the dashboard
deviceName string A label you see in your dashboard (defaults to the Windows computer name — rename it if that bothers you)
monitors[].widthPx, monitors[].heightPx integers Monitor resolutions — the ceiling for plausible exposure (anti-fraud) and the area clamp

Sponsor interactions

  • GET /api/v1/ads/next — signed headers only, no body.
  • POST /api/v1/click{ adId }: which sponsor you opened from the tray.

Account data (website, via Clerk)

Your authentication identity (e-mail) lives with Clerk, our sign-in provider. PaperRoute's own database stores your Clerk ID, role, devices, telemetry buckets, the earnings ledger, and payout requests.

Retention

Telemetry buckets exist to compute and audit earnings: retained while your account is active, deletable with your account. Replay nonces expire within the hour. The earnings ledger is append-only and kept for the life of the account (it is the money record). Backups of your original wallpaper never leave your machine — they live in %APPDATA%\PaperRoute.