Data Availability: What it means, options & how to implement
Data availability determines whether the data needed to verify or reconstruct system state is reliably accessible when required. This guide explains why availability matters across blockchains, cloud systems, and decentralized storage, and gives actionable patterns for choosing, implementing, and monitoring availability in production.
Data availability is one layer of a broader modular blockchain architecture, where execution and settlement may be operated by separate systems.
What is Data Availability?
Data availability is the property that required data can be retrieved by authorized parties in a timely and complete manner. In distributed systems that property has three practical axes: persistence (will the data be retained long-term?), accessibility (can it be fetched with predictable latency and throughput?), and verifiability (can a consumer confirm the data is authentic and complete?). Together these axes determine whether a system is reliably re-playable, auditable, and recoverable.
In blockchains and layer-2 systems, availability has a specific security role. A rollup that publishes transaction batches but does not make the batch payload retrievable allows an attacker to withhold data and prevent honest users from reconstructing state or providing fraud proofs. In cloud-native systems, availability maps to SLAs, redundancy, and replication policies.
Why Data Availability Matters — Concrete Consequences
Availability affects correctness, user experience, and compliance:
- Correctness: cryptographic verification (fraud proofs, Merkle proofs, state reconstruction) requires that clients can fetch the canonical data referenced by commitments.
- UX & Business: missing or slow objects (images, attachments, videos) directly reduce retention and conversion metrics.
- Compliance & Auditing: retention policies and immutable snapshots are required for legal audits and long-term records.
Design choices for availability influence cost, trust, and operational complexity. On-chain storage maximizes trust and auditability at high cost; off-chain storage reduces cost and improves throughput but increases dependency on infrastructure and service-level guarantees.
Data Availability Models and Trade-offs
Below are the dominant models and the trade-offs to consider when selecting one.
On-chain data
- Guarantees: global canonical storage under chain consensus, immutable and verifiable without third parties.
- Trade-offs: extremely high per-byte costs (gas), low throughput, and higher read latency when retrieving large payloads from chain nodes.
- Suitable when the data must be immutable and verifiable by everyone without external services (e.g., small audit logs, state roots).
Cloud object stores (S3, GCS, Azure Blob)
- Guarantees: high durability (provider claims), regional replication, CDN fronting for low-latency reads, and operational simplicity.
- Trade-offs: reliance on a centralized provider, predictable but recurring operational costs (storage, PUT/GET, egress), and potential vendor lock-in.
- Suitable for large binary payloads, media content, and high-throughput public reads.
Decentralized content networks (IPFS, Filecoin, Arweave)
- Guarantees: content-addressable integrity and potential censorship-resistance; economic storage options (deals) for persistence.
- Trade-offs: availability varies without paid deals/pinning; retrieval performance depends on gateway and peer topology; added complexity for proofs.
- Suitable for censorship-resistant content, archival persistence, and where decentralized guarantees are part of the product promise.
Hybrid approaches
- Pattern: store large data off-chain (cloud or IPFS) and publish compact commitments on-chain (hashes, Merkle roots, state commitments).
- Benefit: cryptographic verifiability with reduced on-chain cost. Clients verify off-chain data against on-chain commitments.
Comparison Table (high-level)
| Feature | On-chain (L1) | Cloud object storage | Decentralized (IPFS/Filecoin) |
|---|---|---|---|
| Trust model | Decentralized consensus | Centralized provider | Peer-to-peer + economic deals |
| Durability | Immutable on-chain | Provider durability SLAs | Depends on pinning / deals |
| Latency | High for large data | Low with CDN | Variable (gateway or peers) |
| Cost per GB | Very high | Low to moderate | Pay-for-persistence models |
| Scalability | Limited by L1 throughput | Highly scalable | Scales with network, needs indexing |
Key Technical Patterns and How They Work
Data-Availability Sampling (DAS)
- Objective: let light clients detect withholding without downloading full batches.
- Technique: erasure-code data into pieces with redundancy, publish enough pieces for reconstruction. Light clients request a random subset of pieces; if a sampled subset is retrievable and matches expected hashes, the batch is considered available with high probability.
- Operational note: DAS requires well-understood randomness, honest sampling nodes, and tooling for sampling and repair.
Merkle Commitments and Sparse Proofs
- Publish a Merkle root on-chain that commits to a batch of data stored off-chain.
- Clients request specific leaves (transactions) and receive a Merkle proof; verification is local and fast.
- This pattern decouples storage from consensus while preserving integrity guarantees.
Pinning and Economic Storage Deals
- For IPFS/Filecoin, persistence requires active pinning or paid deals. Use multiple pinning providers and periodic audits to ensure that important content remains retrievable over time.
Erasure Coding and Redundancy
- Erasure coding (Reed-Solomon, etc.) reduces storage overhead compared to full replication while maintaining redundancy. It complicates repair but is cost-effective for large archives.
Practical Implementation Recipes
- Minimal hybrid deployment for rollups
- Sequencer: store batch on S3 and publish Merkle root on L1.
- Archive: pin the same content to IPFS and make a Filecoin deal for long-term persistence.
- Verifier: provide a small tool that can fetch a leaf, verify the Merkle proof, and fetch additional pieces via DAS when needed.
- High-availability cloud app
- Multi-region buckets + CDN (CloudFront/Cloud CDN).
- Objects versioned and immutable: write objects with content-hash in path (e.g., v1/
/file). - Background auditor: a serverless job that fetches a sample of objects, verifies checksums, and raises alerts when discrepancies occur.
- Decentralized archival
- Add content to IPFS, pin via two pinning services, then initiate a Filecoin deal (or Arweave upload) for long-term storage.
- Periodically run retrieval tests from at least three independent gateways and store retrieval latency metrics.
Commands & Small Tools
Verify S3 object availability and checksum
aws s3api head-object --bucket my-bucket --key path/to/object
aws s3 cp s3://my-bucket/path/to/object - | sha256sum
Add and pin to IPFS
CID=$(ipfs add -q large-archive.tar.gz)
ipfs pin add $CID
curl -sSf https://ipfs.io/ipfs/$CID >/dev/null && echo OK
Conceptual DAS sampling CLI
# Adapt to your chain's DAS client
das-client sample --rpc https://node.example --batch-root <root> --samples 256
Observability & SLAs
Design a monitoring stack that covers:
- Availability SLO: 99.99% synthetic read success from primary regions.
- Integrity SLO: 100% pass rate for checksum verification on daily audits.
- DAS health: sampling success rate above a defined threshold and time-to-repair metrics.
Alerting: wire failures to an incident channel and automate remedial playbooks (re-pin, re-upload, switch CDN origin).
Troubleshooting Checklist
Start here when a consumer reports missing data:
- Check object presence and permissions (head-object for S3).
- Verify CDN cache and fallbacks.
- Validate merkle proofs or content CID matches expected hash.
- If decentralized: query multiple gateways and check pin counts.
- If DAS sampling failing: inspect erasure-code piece storage and re-upload missing shards.
Cost Considerations
- Use content-addressed storage to enable immutable caching and avoid duplicated uploads.
- Model egress for peak read traffic and prefer CDN caching to reduce origin costs.
- For long-term persistence in decentralized networks, budget for retrieval and renewal costs.
Example Architectures (diagrams omitted)
- Rollup: Sequencer -> S3 + IPFS PIN -> Publish Merkle root to L1 -> DAS sampling network monitors availability.
- Web service: User upload -> S3 (versioned, multi-region) -> CDN -> Edge caches serve reads; background auditor validates integrity.
Future Directions and Closing Notes
Data availability remains an active area of research and engineering. Proto-danksharding, verifiable storage proofs, and improved relay economies will change cost and responsibility models for propagating blobs and ensuring availability. For system designers, the best immediate practice is to combine cryptographic commitments with practical redundancy and monitoring: publish a small on-chain commitment, keep bulk data off-chain with multi-provider replication, and build sampling/monitoring that detects and repairs availability regressions quickly.
Resources & Further Reading
- Ethereum — Data availability (developer docs)
- Amazon S3 — Overview
- NIST CSRC — Availability definition
Related articles:
- Optimistic vs Zero-Knowledge Rollups: Architecture Guide
- Object Storage Implementation Guide
- Object vs Block Storage Systems
Deep Dive: Data-Availability Sampling (DAS) Details
Data-availability sampling is a probabilistic technique that scales availability checks to lightweight clients. Consider a rollup batch encoded into an erasure-coded matrix of K rows and M columns. The proposer publishes the erasure-coded shards and a commitment to the original data (root). A light client only needs to fetch a small, random set of shards; if those shards are retrievable and they match the expected hashes, the probability that an adversary withheld more than the tolerated number of shards becomes vanishingly small. Practical deployments choose sample sizes based on failure probability goals — for example, sampling a few hundred shards can reduce the risk of undetected withholding to the order of 1e-9 for realistic redundancy.
Operationally, DAS requires:
- A trusted randomness source or deterministic sampling tied to block headers.
- An index of shard locations and multicast or relay systems for shard retrieval.
- Repair and re-dissemination when missing shards are detected. This is often implemented as a background repair worker that pulls missing pieces from archival nodes and republishes them to relays or storage providers.
Deep Dive: Merkle Trees, Sparse Proofs, and Practical Verification
Merkle proofs are the simplest practical integrity guarantee for off-chain storage. When using a Merkle root on-chain, ensure:
- The canonical encoding used to compute leaf hashes is well-defined and documented (e.g., canonical JSON, sorted keys for metadata).
- Proof libraries and verification code are available for target platforms (browsers, mobile, server-side SDKs).
- Add clear migration paths if you replace hash algorithms (include algorithm IDs in commitments).
Example verification flow (client-side):
- Fetch the object payload using CDN or direct object store.
- Fetch the Merkle proof and the claimed root (from an index service or on-chain lookup).
- Verify the leaf hash and the proof against the root; ensure the root equals the on-chain commitment.
- If verification fails, fallback to alternate mirrors or raise an alarm and mark the object as untrusted.
Implementation Checklist (Practical)
- Publish commitments: always publish a compact on-chain commitment (hash, merkle root) for critical data.
- Multi-write: write critical blobs to at least two independent providers or pinning services.
- Sampling: implement a periodic DAS sampler for rollup-sensitive services and record sampling telemetry.
- Immutable paths: serve objects under content-hash paths so caches and clients can rely on immutability.
- Automation: build re-pin and repair jobs that run automatically when integrity checks fail.
- Observability: instrument retrieval latency, proof verification success, and re-pin operations.
Example: Python verification snippet (Merkle leaf + proof)
import hashlib
def sha256(data: bytes) -> bytes:
return hashlib.sha256(data).digest()
# Simplified verification
def verify_leaf_proof(leaf: bytes, proof: list[bytes], root: bytes, is_left: list[bool]) -> bool:
h = sha256(leaf)
for p, left in zip(proof, is_left):
if left:
h = sha256(p + h)
else:
h = sha256(h + p)
return h == root
Governance & Policy Considerations
- Retention policy: specify retention durations, archival jobs, and deletion policies. Ensure legal hold exceptions can pin or freeze objects.
- Incident response: document runbooks for missing data incidents, including thresholds for automatic failover and human escalation.
- Cost governance: tag critical buckets and pinning deals for cost allocation; use budgets to avoid silent overspend on egress or storage deals.
Closing Recommendations
- Never assume availability: build probes, sampling, and automated repair into the operational plan.
- Combine cryptographic commitments (on-chain or signed receipts) with practical replication and monitoring.
- Treat decentralized persistence as a multi-step system: add, pin, verify, and renew.
Case Study: Rollup Availability Architecture (Pattern)
A mid-sized Layer 2 project needed an availability design that balanced cost and security. The team chose a hybrid pattern: sequencer nodes write compressed transaction batches to a replicated S3 bucket and also add the same data to IPFS, pinning it using two pinning providers. The sequencer publishes a Merkle root to Ethereum L1 alongside metadata describing the storage locations.
To protect against withholding, the project implemented DAS: a network of independent sampling nodes requested random erasure-coded shards for each batch. Sampling nodes submitted metrics to a public telemetry endpoint so third-party verifiers could audit sampling behavior. When a sampling node detected missing shards, a repair worker attempted to reconstruct the batch from other storage providers and restore missing shards to relay nodes. If repair failed, the sequencer flagged the batch and initiated a protocol-level halt for that specific batch, preserving user funds and allowing for human-driven recovery.
Operational lessons learned:
- Redundancy matters: storing chunks in two geographically separated cloud regions reduced the need for urgent repair operations.
- Public telemetry improved trust: third-party verifiers could independently confirm DAS health and report anomalies.
- Cost tradeoffs: running many samplers increases assurance but has compute cost; the team tuned sampling frequency to match risk appetite.
Case Study: Media Platform with Multi-Provider Persistence
A media streaming company required high availability for thumbnails and video previews while retaining an immutable archive for compliance. Their architecture used a primary S3 bucket with cross-region replication and Cloud CDN for edge caching. Every uploaded artifact was also added to IPFS and queued for a Filecoin storage deal for long-term archival. The platform relied on content-addressed URLs for immutable caching and deployed a background auditor that performed three tasks each night: (1) perform synthetic reads of a representative object set from multiple CDNs and regions, (2) verify the checksum against a stored canonical hash, and (3) re-pin or re-upload any items that failed verification.
This approach produced a balanced TCO: the CDN served most user traffic at low latency, S3 provided operational simplicity and predictable costs, and decentralized storage provided the archival durability required for compliance. Key operational choices included retention rules, lifecycle policies to move object versions to colder storage tiers, and scheduled budget checks to avoid runaway egress costs.
Monitoring Dashboard Examples
Design a dashboard with the following panels:
- Synthetic read success (1m, 5m, 1h) by region
- Proof verification success rate (per-hour)
- DAS sampling pass/fail rate and time-to-detect
- Re-pin/re-upload job success rate and backlog
- Cost burn rate for storage and egress (7d and 30d)
Each alert should map to a concrete runbook action (e.g., re-pin CID, failover to alternate origin, start a manual repair job).
FAQ
Q: Should I always publish data on-chain?
A: No. On-chain storage should be limited to compact commitments (hashes, roots). Large payloads are cost-inefficient on-chain; prefer hybrid designs.
Q: How often should I run DAS sampling?
A: Sampling frequency depends on risk. For high-value systems (rollups), continuous sampling with an SLA of minutes is common. For lower-risk archival content, daily sampling may suffice.
Q: What guarantees does pinning provide?
A: Pinning ensures a node intends to keep content available; it is not equivalent to an economic storage deal. For long-term guarantees, combine pinning with Filecoin/Arweave-style deals.
Repair Worker Pseudocode (Conceptual)
A repair worker attempts to reconstruct missing shards and re-publish them to relays. This pseudocode shows the high-level flow:
- Query missing-shard index for batches flagged by DAS.
- For each missing shard: a. Attempt fetch from alternate cloud region or storage provider. b. If successful, verify shard hash and re-publish to relay nodes. c. If not, attempt erasure-code reconstruction using available shards. d. If reconstruction succeeds, publish reconstructed shards and update the index. e. If all attempts fail, escalate to on-call and mark batch as degraded.
Pseudocode (high-level):
for batch in missing_batches:
missing = query_missing_shards(batch)
available_shards = fetch_shards(batch)
if can_reconstruct(available_shards):
reconstructed = reconstruct(available_shards)
publish_shards(reconstructed)
mark_repaired(batch)
else:
try_alternate_providers(batch)
if still_missing:
escalate_to_oncall(batch)
Blob Propagation and Relay Economics (Overview)
In modular blockchain designs, who pays to propagate large blobs of data (for example, proto-danksharding blobs) becomes a central economic question. Relays, sequencers, and light clients each interact with propagation costs differently:
- Sequencers pay to upload and make data discoverable (fees or storage costs).
- Relays carry availability by caching and serving blobs; they require compensation or staking for reliability.
- Consumers (verifiers, light clients) pay retrieval costs when sampling or rebuilding state.
Design considerations:
- Incentivize relays with fee-sharing or staking; measure the cost-to-serve and price services accordingly.
- Allow marketplace discovery so multiple relays compete on price and latency.
- Monitor propagation metrics: time-to-propagate (publish -> relay synced), geo-coverage, and retrieval success rates.
Audit Checklist for a Data Availability Review
- Are cryptographic commitments (hashes/Merkle roots) published in an immutable store?
- Is there a clear mapping from commitments to storage locations (S3 path, CID, relay endpoints)?
- Are objects served under content-hash immutable paths to prevent cache poisoning?
- Is DAS sampling implemented and instrumented with public telemetry?
- Are pinning and storage deals in place for decentralized persistence?
- Are retention policies and legal holds documented and enforced?
- Are monitoring dashboards and automated repair jobs configured with SLAs and runbooks?
Final Thoughts
Data availability is both a protocol-level property and an operational discipline. Systems that combine cryptographic commitments with real-world redundancy, monitoring, and automated repair achieve a balance of trust and practicality. For teams building blockchain L2s, hybrid architectures with on-chain commitments plus robust DAS and archival strategies provide strong security with reasonable cost. For cloud-native products, a disciplined approach to replication, immutable paths, and automated integrity checks keeps systems reliable without excessive expense.
Practical Snippets: Re-pin Job (bash)
A simple re-pin loop that checks a list of CIDs and pings a pinning API to confirm the pin status. Replace PIN_SERVICE_API and API_KEY with your provider details.
CIDS=("Qm..." "Qm...")
for CID in "${CIDS[@]}"; do
status=$(curl -s -H "Authorization: Bearer $API_KEY" "https://pinning.example/api/pins/$CID" | jq -r .status)
if [ "$status" != "pinned" ]; then
echo "Re-pinning $CID"
curl -s -X POST -H "Authorization: Bearer $API_KEY" -d '{"cid":"'$CID'"}' https://pinning.example/api/pins
fi
done
Kubernetes StorageClass + PVC (Example)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
encrypted: "true"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pvc
spec:
storageClassName: fast-ssd
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 200Gi
This pattern is suitable for stateful services that need a fast, durable backing store; it complements object storage for blobs.
Appendix: Glossary
- DAS: Data-Availability Sampling — probabilistic checks to ensure pieces of a dataset are retrievable.
- CID: Content Identifier — content-addressed identifier used by IPFS.
- Merkle root: A fixed-size commitment to a set of data items allowing efficient per-item proofs.
- Pinning: The act of instructing an IPFS node to retain a piece of content locally.
- Filecoin deal: An economic contract to store data on Filecoin miners for a specified duration.
Implementation Roadmap (6–8 week example)
Week 1 — Requirements & Design
- Gather requirements: retention windows, read-latency targets, SLOs, regulatory constraints.
- Draft an availability design: choose primary store (cloud vs IPFS), decide on on-chain commitments, and define monitoring signals.
Week 2 — Prototype & On-chain Commitment
- Implement a proof-of-concept that stores sample artifacts off-chain and publishes a Merkle root on-chain. Ensure canonical encoding is agreed and test simple proof verification.
- Create minimal CI checks to validate proof generation and verification.
Week 3 — Storage & Replication
- Deploy object stores (S3 buckets) with replication and CDN fronting.
- Add CI jobs to upload sample content and verify CDN edge reads.
Week 4 — DAS & Sampling
- Implement a sampling node and a basic DAS harness. Run the sampler in a staging network to verify sampling distribution and repair logic.
- Capture initial telemetry and tune sample counts.
Week 5 — Decentralized Persistence
- Add IPFS pinning and schedule Filecoin deal creation for archival items.
- Integrate pin audits and re-pin jobs into production cron tasks.
Week 6 — Monitoring, Runbooks & Hardening
- Build dashboards: synthetic reads, proof verification rates, DAS health, re-pin backlog, and storage egress.
- Finalize runbooks for incidents: missing shards, provider outage, merkle mismatch.
Week 7–8 — Stress Test & Cutover
- Run a stress test that simulates heavy reads and random shard withholding to validate monitoring and repair pipelines.
- After successful tests, cutover production traffic and monitor weekly. Review and iterate on sampling frequency and redundancy.
This roadmap gives a practical cadence for teams to move from design to production while iterating on reliability and cost trade-offs.
Operational Metrics & Example SLOs
SLO examples you can adopt and tune by business needs:
- Availability SLO for critical reads: 99.99% successful GETs from CDN origins measured over 30 days.
- Proof verification SLO: 100% of Merkle or validity proofs must verify within 5 seconds for 99.9% of requests.
- DAS sampling SLO: at least 99.999% of scheduled samples must complete without missing shards.
- Repair latency SLO: detected missing shard should be repaired within 60 minutes for critical batches.
Measure and expose these metrics to stakeholders. Use automated runbooks to trigger re-pin, re-upload, or failover when thresholds are breached. Keep cost-awareness in the loop: tie alerts to budget alarms to avoid runaway egress.
Closing checklist (TL;DR)
- Publish cryptographic commitments on-chain or in an immutable index.
- Store bulk data off-chain with multi-provider redundancy.
- Use DAS or probabilistic sampling for lightweight verification.
- Implement automated repair and re-pin jobs.
- Monitor availability, integrity, and cost metrics with clear runbooks.
Data availability is an engineering problem with cryptography, operations, and economics. The right design balances verifiability with practical cost and operational simplicity. Use the patterns in this guide as templates for your architecture and adapt sampling, replication, and monitoring to your system’s risk profile.
Testing Scenarios to Validate Availability
Before production rollout, validate your availability strategy with these tests:
- Provider outage simulation: simulate an S3 region outage and measure failover time to replicated region and CDN origin. Ensure DNS and CDN TTLs are tuned for quick failover.
- Withholding simulation: deliberately withhold random shards from storage and run DAS sampling to confirm the sampling network detects withholding at the expected probability. Measure end-to-end detection time and repair success.
- Large-scale read storm: simulate heavy read traffic (e.g., 100k concurrent requests) to validate CDN cache hit rates and origin egress costs.
- Corruption injection: flip a byte in a stored object and ensure integrity checks, Merkle verification, and auditors detect the corruption and trigger reuploads or alerts.
Security Considerations
- Signing and authorization: always sign important metadata and publish signatures alongside commitments to prevent unauthorized substitutions.
- Least-privilege storage roles: separate write and read-only roles for services; protect publishing keys used for on-chain commitments.
- Secret management: store pinning API keys and archive credentials in a secure secrets manager and rotate them regularly.
Common Verification Failure Modes
- Proof mismatch: caused by different canonical encodings between producer and verifier. Fix by defining canonical serialization and testing across platforms.
- Partial replication: an object replicated to one region but not yet to another, causing intermittent read errors. Fix with replication lag monitoring and backfill jobs.
- Gateway cache poisoning: ensure CDN and gateway caches use immutable content-hash paths or strong cache-control to avoid serving stale or malicious content.
How to Use This Guide and Contribute
This guide is a starting point — adapt the patterns to your environment and regulatory needs. If your team builds a reusable DAS sampler, consider open-sourcing it with clear documentation and sample datasets so the community can reproduce availability guarantees. Submit corrections or additions as pull requests; include reproduction steps for any suggested change so reviewers can validate them.
Contributors & Contact
If you found issues, or want to contribute a case study or code sample, open a PR against the repo or file an issue with detailed reproduction steps.
Operational Metrics to Track (Detailed)
Track the following metrics per environment (staging, production) and per region:
- Object read success rate (1m, 5m, 1h windows) and 99th/99.9th percentile latencies.
- Proof verification time distribution and failure counts (by proof type).
- DAS sample success vs failure counts, with average time to detect missing shards.
- Repair job throughput: number of shards repaired per hour and average repair latency.
- Pin count and pin-health for each CID across providers (number of independent pins).
- Storage growth rate (GB/day) and projected 30/90-day storage cost.
- Egress by origin/CDN and top N objects by egress cost.
Alert when any metric breaches SLO thresholds and ensure alerts map to runbook steps that are practical to execute in the first 15 minutes of an incident.
Quick Glossary (expanded)
- Relay: a node that caches and serves blobs to improve propagation and availability.
- Sequencer: an L2 component that orders and publishes batches to L1.
- Proof-of-replication: a cryptographic proof that a storage provider is preserving data.
Next Steps (50–100 lines)
- Draft a minimal on-chain commitment spec for your project.
- Implement a proof-of-concept sampler and run it against a staging dataset.
- Schedule an incident drill simulating a provider outage and evaluate runbook effectiveness.
Acknowledgements
Thanks to open-source projects and operator teams whose public telemetry and tooling informed the patterns in this article. Contributions, corrections, and real-world case studies are welcome via PRs.
Contact: open a GitHub issue or PR in this repository to suggest edits or report inaccuracies.
\nA follow-up will dive into DAS tuning, proofs, and relay economics.\n \nContributions and case studies are welcome via PRs.\n \nThanks.\n

