changelog: updated

This commit is contained in:
nym21
2026-04-03 01:19:47 +02:00
parent 78082801c6
commit 79829ddd53
+224
View File
@@ -4,6 +4,230 @@ All notable changes to the Bitcoin Research Kit (BRK) project will be documented
> *This changelog was generated by Claude Code*
## [v0.3.0-alpha.1](https://github.com/bitcoinresearchkit/brk/releases/tag/v0.3.0-alpha.1) - 2026-04-03
### Breaking Changes
#### `brk_types`
- Changed `DifficultyAdjustment` time units from seconds to milliseconds for `estimated_retarget_date`, `remaining_time`, `time_avg`, and `adjusted_time_avg` to match mempool.space API format ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/difficulty_adjustment.rs))
- Changed `DifficultyEntry` field `timestamp` to `time` and added `adjustment: f64` field (ratio of new/previous difficulty) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/difficulty_entry.rs))
- Changed `Transaction` field ordering — `input` and `output` now serialize before `size`/`weight`/`fee`/`status` to match mempool.space format ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/tx.rs))
- Changed `TxIn` to include `witness: Vec<String>` and `inner_witness_script_asm` fields — witness data now hex-encoded and included in serialization; removed `script_sig_asm()` and `inner_redeemscript_asm()` methods (logic moved to custom `Serialize` impl that dynamically includes fields based on content) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/txin.rs))
- Removed `time: u32` field from `BlockHeader` — block timestamp is already present on the parent `BlockInfo` struct as `timestamp`, so the duplicate was removed ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/block_header.rs))
- Renamed `PoolDetailInfo.addrs` to `addresses` for mempool.space API compatibility ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/pool_detail.rs))
- Changed `PoolsSummary` to use `#[serde(rename_all = "camelCase")]` instead of per-field `#[serde(rename)]` ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/pools_summary.rs))
- Moved all API parameter types (`AddrParam`, `BlockHashParam`, `HeightParam`, `TxidParam`, etc.) from `brk_types` into a new `brk_server::params` module — 17 param types relocated to keep `brk_types` focused on domain types ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_server/src/params/mod.rs))
#### `brk_server`
- Overhauled cache strategy system: renamed `Height` to `Tip` (etag based on tip block hash prefix instead of height), added `Immutable(Version)` for deep/confirmed data, added `BlockBound(Version, BlockHashPrefix)` for reorg-aware caching, changed etag format from `{VERSION}-{height}` to prefix-coded format (`t{hash:x}`, `i{version}`, `b{version}-{hash:x}`, `s{VERSION}`, `m{hash:x}`) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_server/src/cache.rs))
- Reorganized API route files from `api/addrs/`, `api/blocks/`, `api/fees/`, `api/general/`, `api/mempool/`, `api/mining/`, `api/transactions/` into `api/mempool_space/` directory ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_server/src/api/mempool_space/mod.rs))
### New Features
#### `brk_types`
- Added `error_locations: Option<Vec<usize>>` and `error: Option<String>` fields to `AddrValidation` for reporting validation errors on invalid addresses ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/addr_validation.rs))
- Added `previous_time: Timestamp` and `expected_blocks: f64` fields to `DifficultyAdjustment` ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/difficulty_adjustment.rs))
- Added `From<(Sats, Weight)>` impl for `FeeRate` to compute fee rates from weight instead of only vsize ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/feerate.rs))
- Added `unique_id` field to `PoolDetailInfo` and `pool_unique_id` to `PoolStats` for pool identification across endpoints ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/pool_detail.rs))
- Added `last_estimated_hashrate3d` and `last_estimated_hashrate1w` fields to `PoolsSummary` for 3-day and 1-week hashrate estimates ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/pools_summary.rs))
- Added two new mining pools: `BraiinsSolo` and `SoloPool` (replacing dummy slots 168-169), increasing pool count to 170 ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/pool_slug.rs))
#### `brk_indexer`
- Added `tip_blockhash()` accessor that returns the current chain tip block hash via a shared `Arc<RwLock<BlockHash>>`, updated on each indexed block ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_indexer/src/lib.rs))
- Added `check_xor_bytes()` that detects Bitcoin Core XOR obfuscation key changes and triggers a full index reset when the key differs from the cached value ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_indexer/src/lib.rs))
#### `brk_server`
- Added smart cache strategy helpers on `AppState`: `height_cache()` returns `Immutable` for blocks >6 deep and `Tip` for recent; `addr_cache()` checks mempool activity; `block_cache()` and `block_status_cache()` use `BlockBound` for reorg-aware caching; `tx_cache()` selects strategy based on confirmation depth ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_server/src/state.rs))
#### `brk_rpc`
- Added witness data to `TxIn` construction — each witness stack item is now hex-encoded and included in the `witness` field ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_rpc/src/lib.rs))
- Added `inner_witness_script_asm` field to `TxIn` for P2WSH transactions — decodes the last witness item as a script and formats in ASM ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_rpc/src/lib.rs))
### Bug Fixes
#### `brk_cohort`
- Fixed off-by-one error in profit threshold iterator `iter_ge_thresholds()` — range was missing one cohort per threshold ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_cohort/src/profit.rs))
- Fixed off-by-one error in loss threshold iterator — range included one extra cohort per threshold ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_cohort/src/loss.rs))
### Internal Changes
#### `brk_computer`
- Bumped profitability aggregate version to `Version::TWO` to trigger recomputation with corrected cohort threshold ranges ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_computer/src/distribution/metrics/profitability.rs))
- Bumped pools version from 3 to 4 for the new BraiinsSolo and SoloPool additions ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_computer/src/pools/mod.rs))
#### `brk_indexer`
- Added export phase logging with total elapsed time (`"Exporting..."` / `"Exported in {:?}"`) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_indexer/src/lib.rs))
#### `brk_types`
- Added doc comments to `Transaction`, `TxIn`, `DifficultyAdjustmentEntry`, `DifficultyEntry`, and `RewardStats` fields ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/tx.rs))
- Trimmed verbose `#[schemars(example)]` annotations on `TxIn` fields to reduce generated schema size ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.1/crates/brk_types/src/txin.rs))
[View changes](https://github.com/bitcoinresearchkit/brk/compare/v0.3.0-alpha.0...v0.3.0-alpha.1)
## [v0.3.0-alpha.0](https://github.com/bitcoinresearchkit/brk/releases/tag/v0.3.0-alpha.0) - 2026-04-01
### Breaking Changes
#### `brk_types`
- Changed `BlockInfo` struct to include a flattened `BlockHeader` field and `median_time: Timestamp`, and changed `tx_count` from `usize` to `u32` — existing consumers of `BlockInfo` must update to the new field layout ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/block_info.rs))
- Changed `Block::coinbase_tag()` return type from `Cow<'_, str>` to `CoinbaseTag` — callers must use `.as_str()` to get a string ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/block.rs))
- Simplified `get_percentile` to use nearest-rank method (no interpolation), removing `Add` and `Div` trait bounds — only `Clone` is now required ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/percentile.rs))
#### `brk_indexer`
- Bumped indexer data VERSION from 25 to 26 — requires full re-index when upgrading ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/constants.rs))
- Removed `height_to_coinbase_tag` KV store — coinbase tags migrated from `brk_store` to indexed vec storage ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/stores.rs))
- Changed `index()` and `checked_index()` to accept `&Reader` instead of `&Blocks`, removing the `brk_iterator` dependency ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/lib.rs))
#### `brk_computer`
- Removed `positions` module entirely — block/tx positions now indexed directly by `brk_indexer` ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_computer/src/lib.rs))
- Removed `reader: &Reader` parameter from `Computer::compute()` since positions are no longer needed at compute time ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_computer/src/lib.rs))
#### `brk_store`
- Removed `Kind::Sequential` store variant and its `is_sequential()` method ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_store/src/kind.rs))
### New Features
#### `brk_types`
- Added `BlockExtras` struct matching mempool.space `/api/v1/blocks` extras format with 25 fields: totalFees, medianFee, feeRange, reward, pool, avgFee, avgFeeRate, coinbaseRaw, coinbaseAddress, coinbaseAddresses, coinbaseSignature, coinbaseSignatureAscii, avgTxSize, totalInputs, totalOutputs, totalOutputAmt, medianFeeAmt, feePercentiles, segwitTotalTxs, segwitTotalSize, segwitTotalWeight, header, utxoSetChange, utxoSetSize, totalInputAmt, virtualSize ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/block_extras.rs))
- Added `BlockHeader` struct matching mempool.space format with version, previousblockhash, merkle_root, time, bits, nonce — includes `From<bitcoin::block::Header>` conversion ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/block_header.rs))
- Added `BlockInfoV1` struct combining `BlockInfo` with `BlockExtras` for the mempool.space v1 blocks endpoint ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/block_info_v1.rs))
- Added `BlockPool` struct for mining pool identification (id, name, slug) in block extras ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/block_pool.rs))
- Added `CoinbaseTag` struct — fixed 101-byte record (1-byte length + 100 bytes data) with latin-1 decoding via `as_str()`, proper JSON escaping for control characters, and `Bytes`/`Formattable` implementations for vec storage ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/coinbase_tag.rs))
- Added `CpfpInfo` and `CpfpEntry` structs for Child-Pays-For-Parent transaction data ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/cpfp.rs))
- Added `Prices`, `HistoricalPrice`, `HistoricalPriceEntry`, and `ExchangeRates` structs matching mempool.space `/api/v1/prices` format ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/historical_price.rs))
- Added `MempoolRecentTx` struct with txid, fee, vsize, value — constructed from `(&Txid, &Transaction)` ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/mempool_recent_tx.rs))
- Added `MerkleProof` struct with block_height, merkle path, and position ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/merkle_proof.rs))
- Added `PoolHashrateEntry` struct with timestamp, avg_hashrate, share, and pool_name ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/pool_hashrate_entry.rs))
- Added `PoolSlugAndHeightParam` for endpoints requiring both pool slug and height ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/pool_slug_param.rs))
- Added `fee_histogram` field to `MempoolInfo` — incrementally maintained `BTreeMap<FeeRate, VSize>` that updates on tx add/remove, serialized as `[[fee_rate, vsize], ...]` sorted by descending fee rate ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_types/src/mempool_info.rs))
#### `brk_indexer`
- Added `coinbase_tag: BytesVec<Height, CoinbaseTag>` to `BlocksVecs` — stores coinbase scriptSig tags as indexed vec data for fast range queries ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/vecs/blocks.rs))
- Added `position: PcoVec<Height, BlkPosition>` to `BlocksVecs` — indexes each block's file position for random-access reads from blk files ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/vecs/blocks.rs))
- Added `position: PcoVec<TxIndex, BlkPosition>` to `TransactionsVecs` — indexes each transaction's file position ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/vecs/transactions.rs))
- Added per-block segwit tracking: `segwit_txs` (count), `segwit_size` (bytes), `segwit_weight` (weight units) — computed during block processing ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/vecs/blocks.rs))
- Added `is_segwit()` and `weight()` methods to `ComputedTx` for detecting segwit transactions and computing tx weight ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/processor/types.rs))
#### `brk_reader`
- Added `read_rev()` method for reverse-order block reading (newest first) by scanning `.blk` files from the tail in 5MB chunks — efficient for reading recent blocks without scanning from genesis ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_reader/src/lib.rs))
- Added `after()` method that streams blocks from `hash + 1` to chain tip — replaces the `Blocks` iterator pattern ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_reader/src/lib.rs))
- Extracted block scanning logic into `scan.rs` module with reusable `scan_bytes()` function and `ScanResult` struct, shared by both forward and reverse reading ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_reader/src/scan.rs))
#### `brk_query`
- Added `block_by_height_v1()` returning `BlockInfoV1` with full extras (pool, fees, segwit stats, coinbase data, UTXO set changes) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/block/info.rs))
- Added `blocks_v1()` and `blocks_v1_range()` for batch v1 block queries with all extras data ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/block/info.rs))
- Added `block_header_hex()` that reads the raw 80-byte header from blk files and returns it as hex ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/block/info.rs))
- Added `block_hash_by_height()` for direct height-to-hash lookups ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/block/info.rs))
- Block queries now read block headers from raw blk data and compute `median_time` (median of last 11 block timestamps) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/block/info.rs))
- Added `transaction_raw()` returning raw transaction bytes by reading from blk files via indexed position ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/tx.rs))
- Added `broadcast_transaction()` that forwards raw transaction hex to the RPC client for broadcasting ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/tx.rs))
- Added `merkle_proof()` returning a `MerkleProof` with block height, merkle path hashes, and tx position within the block ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/tx.rs))
- Added `merkleblock_proof()` returning a BIP37-format merkleblock proof as hex for SPV verification ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/tx.rs))
- Added `mempool_recent()` returning the last 10 transactions to enter the mempool ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/mempool.rs))
- Added `cpfp()` computing CPFP (Child-Pays-For-Parent) relationships by walking ancestor/descendant dependency chains in the mempool entry pool ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/mempool.rs))
- Added `transaction_times()` returning first-seen timestamps for a batch of txids from mempool entries ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_query/src/impl/mempool.rs))
#### `brk_server`
- Added `/api/block/{hash}` endpoint returning `BlockInfo` with full header fields and median time ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/blocks/mod.rs))
- Added `/api/v1/block/{hash}` endpoint returning `BlockInfoV1` with extras (fees, pool, segwit, coinbase, UTXO stats) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/blocks/mod.rs))
- Added `/api/v1/blocks` and `/api/v1/blocks/{height}` endpoints returning blocks with extras data ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/blocks/mod.rs))
- Added `/api/block/{hash}/header` endpoint returning the raw 80-byte block header as hex text ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/blocks/mod.rs))
- Added `/api/block-height/{height}` endpoint returning block hash as plain text ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/blocks/mod.rs))
- Added `POST /api/tx` endpoint for broadcasting raw transaction hex to the Bitcoin network ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/transactions/mod.rs))
- Added `/api/tx/{txid}/raw` endpoint returning raw transaction bytes ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/transactions/mod.rs))
- Added `/api/tx/{txid}/merkle-proof` endpoint returning JSON merkle inclusion proof (block_height, merkle path, position) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/transactions/mod.rs))
- Added `/api/tx/{txid}/merkleblock-proof` endpoint returning BIP37-format merkleblock proof as hex ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/transactions/mod.rs))
- Added `/api/v1/cpfp/{txid}` endpoint returning CPFP ancestor/descendant relationships and effective fee rate ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/mempool/mod.rs))
- Added `/api/mempool/recent` endpoint returning the last 10 transactions to enter the mempool ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/mempool/mod.rs))
- Added bundled Scalar API docs viewer (`scalar.js` + `scalar.html`) for interactive OpenAPI documentation ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/scalar.html))
#### `brk_rpc`
- Added `send_raw_transaction()` to both `bitcoincore` and `corepc` RPC backends for broadcasting raw transaction hex ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_rpc/src/lib.rs))
#### `brk_mempool`
- Added `get_entries()` method to expose the entry pool for direct access ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_mempool/src/sync.rs))
- Added `first_seen: Timestamp` field to mempool `Entry` — records when each transaction was first observed ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_mempool/src/entry.rs))
- Added recent transactions tracking to `TxStore` — maintains the last 10 transactions with a `recent()` accessor for the mempool recent transactions endpoint ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_mempool/src/tx_store.rs))
#### `brk_computer`
- Added `output_volume` to mining rewards — computes transfer volume minus fees per block ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_computer/src/mining/rewards/vecs.rs))
#### `website`
- Added block explorer pane with isometric 3D cube visualization — each block displays height, miner name, median fee, and fee range; supports infinite scroll for older blocks and auto-polls every 15 seconds for new blocks (localhost/127.0.0.1 only) ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/website/scripts/panes/explorer.js))
- Renamed "Invert" button to "Theme" for clarity ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/website/scripts/utils/theme.js))
### Internal Changes
#### `brk_server`
- Renamed `.ok_response` to `.json_response` across all OpenAPI endpoint specifications for consistency ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_server/src/api/addrs/mod.rs))
#### `brk_indexer`
- Changed per-block indexing log level from `info!` to `debug!`, with `info!` only emitted every 100 blocks — reduces log noise during bulk indexing ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/lib.rs))
- Changed stores export/commit/persist log level from `info!` to `debug!` ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_indexer/src/stores.rs))
#### `brk_computer`
- Distribution block loop now logs at `debug!` level for every block, with `info!` only every 100 blocks ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_computer/src/distribution/compute/block_loop.rs))
- Pool identification now reads coinbase tags from indexed vec instead of KV store, with a version mismatch warning for debugging ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_computer/src/pools/mod.rs))
#### `brk_bindgen`
- Added `sanitize_ident()` for JavaScript query parameters that clash with reserved words ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_bindgen/src/generators/javascript/api.rs))
#### `brk_cli`
- Removed `brk_iterator` dependency — indexer now uses `Reader` directly for block streaming ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.3.0-alpha.0/crates/brk_cli/src/main.rs))
[View changes](https://github.com/bitcoinresearchkit/brk/compare/v0.2.5...v0.3.0-alpha.0)
## [v0.2.5](https://github.com/bitcoinresearchkit/brk/releases/tag/v0.2.5) - 2026-03-29
### New Features
#### `brk_website`
- Added comprehensive static file serving tests covering path sanitization, index.html serving for root and SPA routes, static asset cache headers (`max-age=31536000, immutable` in release, `max-age=1, must-revalidate` in debug), directory traversal protection, and 404 responses for missing files ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.5/crates/brk_website/src/handlers.rs))
### Internal Changes
#### `brk_computer`
- Switched all background compaction calls from `compact()` to `compact_deferred_default()` across all 14 compute modules (blocks, cointime, indicators, inputs, investing, market, mining, outputs, pools, positions, prices, scripts, supply, transactions), deferring compaction work to reduce I/O contention during block processing ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.5/crates/brk_computer/src/blocks/compute.rs))
#### `brk_indexer`
- Added 5-second delay before background compaction tasks execute, allowing recent writes to settle before compaction begins ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.5/crates/brk_indexer/src/lib.rs))
- Removed `db.flush()` call from background tasks — background compaction now only calls `db.compact()` ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.5/crates/brk_indexer/src/lib.rs))
#### `brk_website`
- Added `Debug` derive to `Error` struct to support test assertions and diagnostic output ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.5/crates/brk_website/src/error.rs))
[View changes](https://github.com/bitcoinresearchkit/brk/compare/v0.2.4...v0.2.5)
## [v0.2.4](https://github.com/bitcoinresearchkit/brk/releases/tag/v0.2.4) - 2026-03-27
### New Features
#### `website`
- Added "all" range preset button to chart toolbar that selects 1w resolution and scrolls to show the full chart history ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/scripts/chart/index.js))
- Added touch device support for chart toolbar — `pointer: coarse` media query enables pointer events on touch screens ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/styles/chart.css))
### Bug Fixes
#### `website`
- Fixed potential division-by-zero in pane stretch factor calculation when chart height is zero ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/scripts/chart/index.js))
### Internal Changes
#### `website`
- Switched h1/h2/h3 headings to "Instrument" font family with `letter-spacing: 0.05rem` and `font-weight: 400` for a distinct heading style ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/styles/elements.css))
- Set h1 to fixed `2rem` and h3 to fixed `1.5rem` font sizes instead of CSS variables ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/styles/elements.css))
- Renamed `types.js` to `_types.js` to follow underscore-prefix convention for generated/private files ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/scripts/_types.js))
- Simplified CSS reset by removing redundant Tailwind-style rules that were already handled elsewhere ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/styles/reset.css))
- Reduced mobile bottom padding and removed standalone display-specific extra padding ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/styles/elements.css))
- Adjusted gradient fade stop from 90% to 85% for earlier fade-out effect ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/styles/main.css))
- Tightened range preset button spacing and adjusted chart heading letter-spacing from `0.075rem` to `0.05rem` ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/styles/chart.css))
- Added `padding: 0` and `letter-spacing: inherit` to input elements, and explicit `color: var(--color)` to labels ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/website/styles/elements.css))
#### `brk_client`
- Bumped `brk-client` VERSION to v0.2.3 across Rust, JavaScript, and Python client packages ([source](https://github.com/bitcoinresearchkit/brk/blob/v0.2.4/crates/brk_client/src/lib.rs))
[View changes](https://github.com/bitcoinresearchkit/brk/compare/v0.2.3...v0.2.4)
## [v0.2.3](https://github.com/bitcoinresearchkit/brk/releases/tag/v0.2.3) - 2026-03-26
### New Features