This release includes significant changes accumulated since May 2025 while waiting for the Celestia App v4/v5 mainnet update. Please review all breaking changes carefully before upgrading.
TL;DR
🚨 This release breaks both API and config!
- ⚠️ API Breaking Changes
- JSON integers now encoded as strings (Tendermint compatibility)
- Blobstream root encoding switched to hex (plus pointer cleanups in Go API)
- Gateway removed → use direct API; configure CORS as needed
- Share Samples API now uses height parameter instead of ExtendedHeader
- Share encoding in Samples response changed to base64 string (was object with data field)
- 🤏🏻 Data Retention Changes
- Full Nodes: Pruning enabled by default (≈30 days)
- Light Nodes: Sampling window reduced to 7 days
- Use
--archival
to keep full history - Update config to remove pruning-related fields
- ✨ API Enhancements – Configurable CORS, new client library, multi-endpoint tx submission
- 🐎 Faster GetRange – Uses shwap protocol for efficient partial retrieval
- 🏎️ Performance Boosts – Parallelized namespace data; optimized blob retrieval
- 🥾 Bootstrap Updates – Added 01node mainnet bootstrap; removed outdated nodes
🚨 Breaking Changes
🗒️ Configuration Breaking Changes
This release contains configuration breaking changes. Node operators must run the config update command before starting their node:
celestia <node_type> config-update --p2p.network (or --node.store)
⚠️ API & JSON Compatibility
- fix(api/header)!: tendermint compatible json marshall #3928 by @zvolin (ported in #4428)
- fix(share)!: tendermint compatible get range result json marshall by @zvolin in #3930
- fix(blob)!: tendermint compatible commitment proof json marshall #3929 by @zvolin (ported in #4434)
Changes:
- Integer values in JSON responses are now encoded as strings for Tendermint compatibility
- Example:
“height”: 67374
becomes“height”: “67374”
Migration: Update JSON parsing logic to handle integers as strings in header, share range, and blob commitment proof endpoints.
Share API Consistency Improvements
Samples Method Signature Change
- !fix(api/share) use height in Samples method by [@walldiss](https://github.com/walldiss) in [[#4481](https://github.com/celestiaorg/celestia-node/pull/4481)](https://github.com/celestiaorg/celestia-node/pull/4481)
Changes:
Samples
method now acceptsheight
parameter directly- No longer requires passing
ExtendedHeader
- Brings consistency with other share module methods
Migration:
// Before:
samples, err := client.Share.GetSamples(ctx, header)
// After:
samples, err := client.Share.GetSamples(ctx, height)
Share Encoding in Samples Response
- !fix(api/share) encode share in sample json as base64 by [@walldiss](https://github.com/walldiss) in [#4480](https://github.com/celestiaorg/celestia-node/pull/4480)
Changes:
- Shares in
GetSamples
response now encoded as base64 strings - Previously encoded as objects with
data
field - Matches encoding format used by
GetRow
and other methods
Migration:
// Before (v0.25.0-v0.25.1):
{
"share": {
"data": "AAAAAAA...base64..."
},
"proof": { ... }
}
// After (v0.25.2+):
{
"share": "AAAAAAA...base64...",
"proof": { ... }
}
Update JSON parsing to expect shares as direct base64 strings rather than nested objects.
❌ Gateway Removal
- refactor(api)!: removing gateway by @distractedm1nd in #4120
Migration: If you were using the gateway, switch to direct API endpoints. Configure CORS policy using the new configurable CORS feature if needed.
🅱️ Blobstream API Changes
- refactor!(blobstream): change DataRootTupleRoot to HexBytes type alias by @vgonkivs in #4390
- fix!(blobstream): change DataRootTupleInclusionProof type by @vgonkivs in #4430
- fix!(blobstream): change GetDataRootTupleRoot return type by @vgonkivs in #4435
- fix(open-rpc): add blobstream api docs by @vgonkivs in #4432
Changes:
DataRootTupleRoot
: String encoding changed from base64 to hex bytesDataRootTupleInclusionProof
: Removed extra pointer (affects native Go API only, not JSON encoding)GetDataRootTupleRoot
: Removed extra pointer in returned value (affects native Go API only)- Blobstream API is now publicly documented
Migration:
- Update code expecting base64 encoded roots to handle hex encoding
- Go API users: Update code to handle direct values instead of pointers
✨ GetRange efficiency improvements
- feat!(share/shwap): implement get range request over shwap by @vgonkivs in #4156
- refactor!(share/shwap): rework range namespace data by @vgonkivs in #4325
Changes:
- GetRange requests now use efficient P2P protocol instead of downloading entire EDS
- Significant performance improvement for partial data retrieval
Migration: Update clients using range requests to use the new shwap protocol implementation.
✨ API New Features + Enhancements
- feat(api): Celestia client lib by @walldiss in #4318
- feat(api): allow configurable CORS policy by @TheRealSibasishBehera in #4266
- feat(nodebuilder/core | state): Multi-core endpoint tx submission by @renaynay in #4380
- feat(nodebuilder)!: Allow disabling DASer by @walldiss in #4511
🤏🏻 Data Pruning Now Default
- refactor(nodebuilder/pruner)!: Remove --experimental-pruning by @renaynay in #4303
- feat(share/availability)!: lower sampling window to 7 days by @renaynay in #4427
- fix(nodebuilder/pruner)!: Remove pruner config from nodes config by [@renaynay](https://github.com/renaynay) in [[#4482](https://github.com/celestiaorg/celestia-node/pull/4482)](https://github.com/celestiaorg/celestia-node/pull/4482)
Changes:
- Data pruning is now enabled by default (stores 30 days of data)
- Sampling window reduced from 30 to 7 days
- Archival nodes must use
--archival
flag to disable pruning - The pruner configuration field has been completely removed from node config files
- Pruning behavior is now controlled exclusively via command-line flags
Migration:
- Remove any pruner-related configuration from your config files
- To run an archival node (disable pruning): MUST use
-archival
flag when starting the node - All other nodes: Remove
-experimental-pruning
flag (pruning is now automatic) - Adjust monitoring for the new 7-day sampling window
- Default behavior (without flag): Pruning enabled with 30-day retention
🧪 Testing Infrastructure
- test: Tastora framework integration with test for blob module by @chatton in #4283
- test: tastora remove fullnode and rely on bridge and light nodes only by @gupadhyaya in #4441
- test: use tastora docker types instead of interface types by @gupadhyaya in #4421
🚀 Performance Improvements
- perf(share/eds): parallelise row nd collection in NamespaceData by @renaynay in #4420
- perf(api/da): request all blobs once in da.Get by @walldiss in #4431
🦀 Rust Users – Required Upgrade
Rust ecosystem must upgrade to maintain RPC compatibility with v0.25.
- [celestia-client](https://docs.rs/celestia-client/latest/celestia_client/)
- [celestia-proto v0.9](https://docs.rs/celestia-proto/0.9.0/celestia_proto/index.html)
- [celestia-types v0.14](https://docs.rs/celestia-types/0.14.0/celestia_types/index.html)
- [celestia-rpc v0.12](https://docs.rs/celestia-rpc/0.12.0/celestia_rpc/index.html)
Upgrade timeline:
- If you do not use
header.GetRangeByHeight
: upgrade immediately. - If you do use it: upgrade Rust crates & celestia-node together.
🔄 Bootstrap Nodes
- chore: removing the bootstrapper 3 and 4 from lunar by @tty47 in #4302
- chore(bootstrapers): add 01node mainnet bootstrap node by @daemon2k3 in #4270
🔧 Bug Fixes
- chore: fix incorrect logging in
updateHead
by @santamasa in #4191 - fix: fix lint by @vgonkivs in #4388
- fix(core/tests): fix core unit tests by @vgonkivs in #4366
- fix(test/blob): fix flaky blob test by @vgonkivs in #4429
- fix(nodebuilder): submit input validation by @cristaloleg in #3976
- fix: rename FuzzProofEqual to FuzzBlobUnmarshal by @GarmashAlex in #4414
- chore: update warning text on pruned -> archival conversion by @walldiss in #4471
- docs(api/da): doc and deprecate DA API by @walldiss in #4470
Addressing memory leak in light node (LN)
- chore: backport bitswap changes by @Wondertan in #4506
FULL CHANGELOG
- deps!: bump go-header v0.6.6 and go-fraud v0.2.3 by @cristaloleg in #4217
- chore(CODEOWNERS): remove @cristaloleg by @cristaloleg in #4272
- deps(go.mod): bump app by @renaynay in #4275
- chore: magic env variable doc update by @damiannolan in #4259
- chore: upgrade to golangci-lint v2 by @Wondertan in #4280
- deps(go.mod): bump app arabica by @renaynay in #4293
- Add Ganesh to CODEOWNERS by @walldiss in #4300
- chore: removing the bootstrapper 3 and 4 from lunar by @tty47 in #4302
- deps(go.mod): bump app to mocha by @renaynay in #4301
- bump go version by @renaynay in #4312
- feat!(share/shwap): implement get range request over shwap by @vgonkivs in #4156
- chore: fix incorrect logging in
updateHead
by @santamasa in #4191 - deps(go.mod): Bump app by @renaynay in #4363
- feat(api): Celestia client lib (v4 migration) by @walldiss in #4318
- deps(go.mod): Bump app mocha by @renaynay in #4368
- chore(node/tests): fix and cleanup swamp tests by @Wondertan in #4381
- deps(go.mod): Bump app
arabica
by @renaynay in #4383 - deps(go.mod): bump app
mocha
by @renaynay in #4385 - chore(node/tests): fix a flaky nd test by @Wondertan in #4382
- feat(api): allow configurable CORS policy by @TheRealSibasishBehera in #4266
- fix: fix lint by @vgonkivs in #4388
- fix(core/tests): fix core unit tests by @vgonkivs in #4366
- chore(deps): upgrade to app v4.0.9-arabica by @rootulp in #4391
- refactor!(blobstream): change DataRootTupleRoot to HexBytes type alias by @vgonkivs in #4390
- deps(go.mod): bump app
mocha
by @renaynay in #4394 - refactor!(share/shwap): rework range namespace data by @vgonkivs in #4325
- deps(go.mod): bump tendermint replace by @walldiss in #4396
- test: Tastora framework integration with test for blob module by @chatton in #4283
- deps(go.mod): bump libp2p dep by @walldiss in #4401
- chore(deps): upgrade to go-square v2.3.1 by @rootulp in #4402
- deps(nodebuilder/tests/tastora): mod tidy by @renaynay in #4405
- feat(nodebuilder/core | state): Multi-core endpoint tx submission by @renaynay in #4380
- deps(go.mod): bump app mainnet by @renaynay in #4408
- (.github): add
kind:perf
to assortment of required labels by @renaynay in #4419 - perf(share/eds): parallelise row nd collection in NamespaceData by @renaynay in #4420
- fix(test/blob): fix flaky blob test by @vgonkivs in #4429
- refactor(api)!: removing gateway by @distractedm1nd in #4120
- fix!(blobstream): change DataRootTupleInclusionProof type by @vgonkivs in #4430
- fix(nodebuilder): submit input validation by @cristaloleg in #3976
- chore(bootstrapers): add 01node mainnet bootstrap node by @daemon2k3 in #4270
- refactor(nodebuilder/pruner)!: Remove --experimental-pruning by @renaynay in #4303
- test: use tastora docker types instead of interface types by @gupadhyaya in #4421
- fix!(blobstream): change GetDataRootTupleRoot return type by @vgonkivs in #4435
- chore: bump to v5 of app by @evan-forbes in #4444
- misc(core): add eds size to store log by @renaynay in #4343
- fix(open-rpc): add blobstream api docs by @vgonkivs in #4432
- deps(go.mod): bump app mocha by @renaynay in #4448
- test: tastora remove fullnode and rely on bridge and light nodes only by @gupadhyaya in #4441
- chore(deps): upgrade to app v5.0.1 by @rootulp in #4450
- fix(api/header)!: tendermint compatible json marshall (#3928) by @walldiss in #4428
- perf(api/da): request all blobs once in da.Get by @walldiss in #4431
- chore(lint): fmt to tidy tastora go.mod by @walldiss in #4447
- fix: rename FuzzProofEqual to FuzzBlobUnmarshal by @GarmashAlex in #4414
- fix(share)!: tendermint compatible get range result json marshall by @zvolin in #3930
- fix(blob)!: tendermint compatible commitment proof json marshall (#3929) by @walldiss in #4434
- feat(share/availability)!: lower sampling window to 7 days by @renaynay in #4427
- chore: update warning text on pruned -> archival conversion by @walldiss in #4471
- docs(api/da): doc and deprecate DA API by @walldiss in #4470
- fix(cmd/celestia): parse only store determination flags for auxiliary commands by @renaynay in #4472
- !fix(api/share) encode share in sample json as base64 by @walldiss in #4480
- !fix(api/share) use height in Samples method by @walldiss in #4481
- fix(nodebuilder/pruner)!: Remove pruner config from nodes config by @renaynay in #4482
- feat(config): adding a bool flag to enable/disable bitswap by @vgonkivs in #4504
- fix(share/swamp): fix GetSamples in swamp tests by @vgonkivs in #4505
- chore: backport bitswap changes by @Wondertan in #4506
- !feat(nodebuilder): Allow disabling DASer by @walldiss in #4511
New Contributors
- @damiannolan made their first contribution in #4259
- @santamasa made their first contribution in #4191
- @TheRealSibasishBehera made their first contribution in #4266
- @gupadhyaya made their first contribution in #4421
- @GarmashAlex made their first contribution in #4414
Full Changelog: v0.24.1...v0.25.3