Changelog

User-visible changes, newest first.


v0.9.7

"Your Rewards" on /miner/<id>. A new panel summarises what you actually earned over the recent rolling windows — Last 12 h, 24 h, Today, Yesterday, Last 7 days — in both BTCX and your chosen USD value. A 7-day inline bar chart sits underneath. Today / Yesterday roll at UTC midnight. Motivation: payouts arrive every hour, so the payout list is hourly noise; what miners actually want is a daily glance at "is the plot pulling its weight?"

/tools is now "User settings". One card, two cookies, no account. Set your BTCX-to-USD value (used by the Your Rewards fiat column and the profitability calculator), and pick your block explorer of choice — between explorer.bitcoin-pocx.org (default) and explorer.bitcoin-po.cx. Cookies last a year; clearing them restores operator defaults. Tx and block hashes on /payouts, /miner/<id>, and /blocks use your pick.

Language picker shows country flags. Each entry in the language menu now reads 🇩🇪 Deutsch, 🇯🇵 日本語, etc. — the active language's flag also appears next to the globe icon in the header, so you can see your selection at a glance. (English uses 🇬🇧, not 🇺🇸 — this pool is run from Europe.)

/info — read-the-docs teaser. A one-line link at the top of the page invites you to the full docs at /docs (English-only) without competing with the localized FAQ cards underneath.

Per-IP onboarding banner for unbound miners. If submissions from your IP are being rejected as unbound (or your plot has just received faucet dust and is waiting on the binding), the public pages now show a guided banner explaining what state you're in and what to do next. The soft variant is dismissible for 24 hours; the assertive one (you've already been funded) stays until you act.

Submissions accepted during the 30-block activation window. Previously, the pool returned -32007 NotAssigned for every submission in the 30 chain-blocks between create_assignment and on-chain activation. Now it accepts them as unbound (chain still won't credit them in this window — that's a chain protocol invariant — but you stop seeing rejection spam in your miner logs).

Chain-state tags on /miners. Rows now carry a tag reflecting the on-chain assignment state — activating, revoking, or unbound — read straight from the assignment cache. Replaces the old activity-based "stale" tag, which conflated "miner stopped submitting" with the protocol-mandated waiting windows.

/blocks "Blocks Won" stat card no longer counts orphans. The headline counter now matches the visible table (canonical rounds only). Earlier, the card briefly over-counted on chain reorgs.

Heartbeat monitoring service. Operators can register an opaque token and publish a small status URL — visiting /heartbeat/<token> shows whether the pool has beaten recently; a separate /heartbeat/<token>/beat URL is what the operator's monitoring cron actually hits. See the Heartbeat Monitoring Service card on /info for the usage pattern. Tokens are SHA-256-hashed in memory; nothing persisted to disk.

Bare URLs in markdown auto-link. Markdown content (rendered on /info, /changelog, /docs/<slug>) now turns plain https://… URLs into clickable links automatically — no manual [text](url) wrapping needed. Fenced code blocks are left alone; trailing punctuation isn't captured into the href.

Operator-side improvements (no user impact). /admin/diagnostics reorg-event acknowledgement is now batched (checkboxes + "Select all" + one button). New /admin/ops impersonate-IP tool for reproducing per-IP UI states. New /admin/heartbeats page lists token digests + origin IPs with WL/BL filter controls. The /docs index is auto-discovered at build time. pool.miner_reward "bind/unbind override" on /admin/users was removed — binding and revocation are chain-enforced (720 / 30 block delays) and not bypassable by the pool.

v0.9.6

Chain-reorg handling — round identity is now first-class. Previously, a single-block reorg at the tip could silently distort EEPS share calc for ~24 hours (the orphaned round's prev_block_hash stayed stale on submissions until they rolled out of the window). Now: the block table is keyed on (height, prev_block_hash) with a canonical flag, and on every tip change the pool walks back up to eeps.n_avg blocks and reconciles its DB view against the wallet's chain. Orphan rounds become forensic records (canonical = 0), structurally excluded from share-calc joins. Reorgs are recorded as reorg_event rows surfaced on /admin/diagnostics (severity-coloured, with per-event Acknowledge). New /docs/reorg-recovery-runbook documents the per-severity operator action ladder.

Maintenance mode (operator). New /admin/ops page with a master maintenance toggle. When active, public pages render a "pool under maintenance" placeholder, submit_nonce rejects with -32001, /api/* returns 503, /ws refuses upgrades; /admin/* stays reachable so the operator can work. State persists in config.yaml (comments preserved) — the pool can boot directly into maintenance mode.

In-pool scheduler + lucky-man v2. New top-level scheduler: config block: a generic time/height-rule engine where lucky-man becomes one consumer (others — pool fee, banner, faucet on/off — will plug in later). Rules are add or exclude, predicates AND-compose (date_window, month, month_day, weekday, nth_weekday_of_month, height_range, block_mod); an action is "currently on" iff some add matches and no exclude does. Lets an operator script things like "5% lucky-man every Sunday, except 2026-05-17" or "10% lucky-man every January until height 100000". The dashboard gains a Pool Era card showing the active rule and the next wall-clock change; /info shows live state; /blocks per-row tooltip records the rule that was in effect when each pick was made (new block_lucky_pick.scheduler_rule_name column, migration v9). The deprecated pool.miner_reward.lucky knob auto-migrates to an unconditional add rule with a one-time warning.

/tools page — profitability calculator. Enter your plot capacity in TiB, get the expected daily BTCX yield (net of pool fee). Math is (capacity / net_diff) * blocks_per_day * block_reward * (1 - pool_fee), with net_diff averaged over the last 720 blocks (~24 h at 2-min blocks) to damp the dashboard's per-round oscillation. Configuration-less. Disclaimer notes the figure is a statistical mean under constant difficulty — variance is high for small plots, and a difficulty shift moves the average. Weekly / monthly figures will be added once the network has stabilised long enough for meaningful long-term extrapolation.

Tx + block hashes link to a chain explorer. New optional chain.explorer_tx_url / chain.explorer_block_url config (with {txid} / {blockhash} placeholders). When set, tx hashes on /payouts and /miner/<id>, and block hashes on /blocks, render as outbound hyperlinks (new tab). Replaces the older copy-to-clipboard widget.

Phasing out is faster and cleaner. Miners who stop submitting drop from the dashboard "Active Miners" count promptly when their last submission rolls out of the EEPS window — no more 6-hour stale-cache flicker. /miners marks inactive-but-bound miners with an amber "stale" tag. n_conf / blocks_in_window denominator fixed: at full participation it now reads 720 / 720, not 719 / 719.

/info cards have shareable section anchors. Each foldable card on /info carries a chain-link icon that updates the URL hash on click — paste the URL to deep-link a section.

Submission-rejected error code aligned with pocx_protocol. "Deadline exceeds limit" now returns -32001 INVALID_SUBMISSION (was -32004, which fell outside the canonical vocabulary and could be misdecoded as "Authentication required" by miners).

Public docs split. docs/public/ now holds the four miner-facing markdown sources (architecture, rewards, switch_pools, reorg-recovery-runbook) bundled into the binary and served at /docs/<slug>. Internal docs (api, deployment, AUDIT, etc.) stay at docs/. Stale drift in architecture.md / rewards.md (wallet open/close per payout, pool fee → pending, fictional process_payout_config) has been corrected against the actual code.

Operator-side improvements (no user impact). Migration v7 schema rebuild for round identity (auto-applied on first 0.9.6 boot, foreign-keys-toggle pattern). New reorg.enabled kill switch for the reconciliation walk. Cache GC inside Model::update_capacities evicts phased-out miners on every tip rather than waiting for the 6-hourly maintenance pass. Maintenance task no longer overwrites cache.miner_count with a different-semantics value.

v0.9.5

v0.9.4

v0.9.3

v0.9.2

v0.9.1

v0.9.0

Nogrod v0.9.7 · © 2026 Proof of Capacity Consortium