SHUDDHI · SOVEREIGN DATA FACTORY · OPEN SOURCE
A model is what it eats. Now prove it.
AgentAnywhere Shuddhi — शुद्धि, purification — is the data factory behind our from-scratch models. It takes raw text and code through a staged cleansing pipeline — provenance gating, language identification, deduplication, quality scoring, domain balancing, contamination checks — and seals the result with a corpus build manifest. Every training run cites the manifest of exactly what it learned from: provenance receipts for training, the same discipline our serving layer applies to every call. The engine is open source under Apache-2.0 — including the customer-data refusal, so you can read the rule rather than take our word for it.
The cheapest useless token is the one you never train on.
Every duplicated document, boilerplate page, licence-ambiguous scrape, or contaminated benchmark answer that reaches a training run burns GPU-hours teaching the model nothing — or worse, teaching it something you cannot defend. For a resource-constrained sovereign program, corpus composition is not a preprocessing chore; it is one of the largest cost and quality levers that exists.
Most teams treat data preparation as ad-hoc scripts run once and forgotten. Nothing is measured, nothing is repeatable, and when a regulator, customer, or court asks what exactly did this model learn from? — there is no answer.
Shuddhi makes the corpus an engineered, audited product: a staged pipeline with a measured report at every stage, and a sealed manifest at the end that answers that question precisely.
Chasing trillions of tokens is not the goal. Feeding the right ones is.
The industry has settled into a reflex: if the model is not good enough, get more tokens. It is the easiest thing to measure and the easiest thing to announce, which is most of why it persists. But a token count is an input, not an achievement — and past a point, adding more of the same is how you spend GPU-hours teaching a model nothing.
We can put a number on that, from our own corpus rather than a paper. Run at full scale, the largest near-duplicate cluster in our data was 84,275 copies of a single document — and it sat in the English shard, not where an earlier sampled pass had suggested it would be. Untouched, that is 84,275 opportunities to pay for the same page. Sampling hinted; the full-scale receipt corrected it. Scale without curation does not get you a better model, it gets you an expensive one.
The corollary is the part people resist: a smaller, cleaner, well-attributed corpus can beat a larger dirty one at the same compute budget — and it is far cheaper to defend when someone asks where it came from. Our own from-scratch model is sized to its corpus deliberately, not scaled until the announcement sounds impressive.
So Shuddhi does not optimise for how much data you can move. It optimises for knowing precisely what went in, dropping what should not have, and being able to prove both afterwards. 176 GB, 33,047,370 documents, contamination checked across every one of them — not a sample. That is the number we publish, because a token count shifts with whichever tokenizer you chose and the corpus does not.
Seven stages. Every one measured.
Provenance gate — every shard enters tagged with source, licence, and data class. Untagged material is refused. Customer data is excluded mechanically at this stage: the pipeline will not accept it, so no downstream mistake can train on it.
Language identification — the Indic/English mix is controlled deliberately, not inherited accidentally from whatever was scraped.
Deduplication — exact and near-duplicate removal, so the model never pays twice to read the same page.
Quality scoring — coherent, information-rich material is prioritised; boilerplate, spam, and junk are scored out.
Domain balancing — tokens are allocated across coding, reasoning, Indic languages, and regulated domains by decision, with the mix reported.
Contamination check — the corpus is screened against our evaluation batteries, so a benchmark result can never be an echo of training data. This protects the integrity of every number we publish.
The build manifest — the accepted corpus is sealed under a content hash with its full composition report: tokens by domain and language, dedup rate, quality distribution, and every exclusion counted by reason.
Provenance receipts — for training, not just serving.
On this platform, every served call carries a signed Trust Receipt. Shuddhi extends the same discipline upstream: every training run cites the corpus build it consumed — a manifest hash in the training ledger, with the composition report behind it.
That turns *what did this model learn from?* into a question with a precise, auditable answer — for a regulator applying data-protection law, for a defence customer demanding clean lineage, for a BFSI risk office proving licence compliance, and for our own engineers reproducing a run months later.
We built Shuddhi because we needed it ourselves: our from-scratch model corpora are its first customer — and the first sealed build is already done.
The build, applied: tatva-sangraha-v1.2.
Shuddhi processed our full 176.1 GB from-scratch training corpus — 33,047,370 documents across 15 languages, all CC-BY-4.0 licensed — end to end on one 2-vCPU CPU box. Zero GPU, zero data egress.
The checklist is closed: every filter now runs on the whole corpus, not a sample. Shuddhi's chain — exact and near-duplicate removal, quality scoring, perplexity screening, a toxicity pass, contamination checking, and PII redaction — is applied and receipted end to end.
The filtered build kept 32,289,800 of 33,047,370 documents (97.71%), every drop counted by reason: 127,024 exact duplicates (0.38%), 272,640 near-duplicates (0.83%), 345,505 perplexity outliers (1.05%, a p99 cutoff by design), 7,086 low-quality (0.02%), and 5,306 toxicity (0.016%) — the last a conservative lexicon tier that removes the unambiguous tail, not a comprehensive safety classifier; that tier is on the roadmap.
Contamination: zero — every one of 33,047,370 documents checked against our evaluation sets, not a sample, so the benchmark numbers we publish measure capability, not memorisation. 182,781 PII spans redacted on emission (email, phone, Aadhaar, PAN, Luhn-checked cards, IP). Tokens stay an estimate — ~45.9 billion (derived) under our own tokenizer — which is why the headline figures are byte- and document-denominated (176 GB, 33 million documents): a token count shifts with the tokenizer, the corpus does not.
The result is sealed under a filtered build hash chained to the source-corpus hash, the exact filter config, and the tokenizer — the config pins the *tools*, not just the thresholds: the near-duplicate droplist, the toxicity lexicon, and the tokenizer are all hashed into the receipt, so every training run cites corpus, filters, and tokenizer together in its ledger. Because the pipeline is partition-invariant, builds parallelise without changing the receipt.
The 84,275-copy near-duplicate cluster described earlier surfaced here, in the English shard (2.4% near-duplicates) — not where an earlier sampled pass had suggested. Sampling hinted; the full-scale receipt corrected it. That is precisely why filters have to be *applied* at scale, not estimated.
Open source, and we have written down what stays that way.
The Shuddhi engine is Apache-2.0 on GitHub: every filter, the receipt generation, the command-line tool, the plugin API — and the customer-data refusal itself. That last one matters most. The rule that says customer data is evaluation-only and never training is twenty lines you can read, with no flag, environment variable or plugin hook that turns it off. A trust claim you can check in thirty seconds is worth more than one you have to accept.
Where to get it. The repository and a prebuilt container image publish shortly under Apache-2.0. The image will run the whole pipeline with no Python setup at all, over a sample corpus with deliberately planted defects, so you can watch every filter catch something before you point it at your own data. This page will carry the link the day it is public — until then, tell us below and we will send it to you directly.
Permanently open. The engine, every built-in filter, receipt generation and the customer-data refusal will always be Apache-2.0 and will never move behind a licence. Commercial offerings extend Shuddhi through the public plugin API and hosted services — they never remove capability from the open engine.
What is commercial. The hosted receipts registry — a signed, organisation-wide ledger with model-to-corpus-to-licence lookup, retention and legal hold. Team collaboration: review queues, approvals, sign-off and role-based access, because the open engine *refuses* a suspect shard until a named human reviews it but gives you no way to manage that review. Advanced cross-build reporting and analytics — trends, corpus drift, filter-yield comparison. Additional filters delivered as plugins. And scale-out, SLA and air-gapped deployment.
The line in one sentence: the engine and the proof are free; running it as an organisation is paid.
Where free ends, and what happens when you cross it.
Open-core products usually leave this vague, and that vagueness is what makes people hesitate to adopt them. So, plainly:
Nothing is ever removed from the open engine. Buying does not unlock a feature that was disabled — the paid tiers add a *service* alongside the engine. If a commercial capability needs an engine change, that change ships in the open engine too, because it is a plugin-API improvement and everyone gets it.
You hit the line when you need to prove something to someone else. Running the pipeline, generating receipts, drafting your Article 53 summary and attesting a corpus are free and unlimited, forever, for any size of corpus. What is paid is the organisational layer: a signed ledger others can verify, a review queue several people share, and reporting across many builds over time.
Your receipts stay yours, and stay verifiable without us. A build hash is computed by the open engine from your corpus, so anyone can recompute and check it with the free tool alone. If you stop paying — or never start — nothing you already produced becomes unreadable, and no artefact is held hostage. The hosted registry adds signatures, lookup and retention; it is not a decoder ring for your own data.
No telemetry, no account, no phone-home. The open engine does not contact us, ever. We do not know who is running it or what they are cleaning, and we would rather keep it that way than trade it for a funnel metric.
Plans
The engine is free and always will be. The paid tiers exist for what an organisation needs and an individual does not — proving something to someone else, across many builds, with several people involved.
Open Source — free, forever
Apache-2.0. The full engine, every built-in filter, receipt generation, the customer-data refusal, the plugin API and the command line. Self-hosted, CPU-first — no account, no telemetry, no seat limit. Generate Article 53 drafts and attest corpora with no licence at all.
Team — contact us
The hosted receipts registry: a signed, organisation-wide ledger with model-to-corpus-to-licence lookup, retention and legal hold. Review workflow — queues, approvals and sign-off for the human review the open engine already demands. SSO and role-based access. Cross-build reporting: trends, corpus drift, filter-yield comparison.
Enterprise — contact us
Everything in Team, plus air-gapped deployment for perimeters with no egress, an SLA, sector compliance packs and DPDP/GDPR evidence bundles, additional filters delivered as plugins, and scale-out for corpora in the hundreds of gigabytes and beyond.
Article 53 asks what your model was trained on. This answers it.
Article 53(1)(d) of the EU AI Act requires every provider placing a general-purpose model on the Union market to publish a sufficiently detailed summary of training content, on the template the Commission's AI Office issued in July 2025. Enforcement powers became active on 2 August 2026. Models already on the market must publish by 2 August 2027.
Shuddhi emits that summary as a build artefact, because it already holds the inputs: source, licence, data class, language and acquisition date are required registry fields — a shard missing any of them is refused, not defaulted.
``` factory.py report --registry corpus.json --eu-ai-act --manifest BUILD-MANIFEST.json ```
One field is worth dwelling on. Where every other provider must *describe* how they handled user data, the honest answer here is that a build containing it cannot be produced — and the refused shard appears in the generated summary, with its reason. The refusal shows up in the filing, not just in a README.
The report is a draft for your counsel, never a compliance claim: compliance is a legal position a provider holds, not a property of a tool. Anything the corpus cannot know — provider identity, crawler behaviour, text-and-data-mining opt-out policy — is printed as an explicit gap rather than guessed at. An incomplete summary you can see beats a confident one that is wrong.
Already using NeMo Curator, DataTrove or Dolma? Keep them.
Those are good tools and Shuddhi does not try to replace them. What none of them emit is a receipt — an artefact you can hand a regulator, an auditor or an enterprise customer that says *this, exactly this, is what the model saw*.
So attest what they produced:
``` factory.py attest --corpus ./out-from-datatrove/ --corpus-id my-slice ```
The fingerprint uses the identical hash definition a native Shuddhi build uses, so an attested corpus and a built one are verifiable the same way. Change one byte anywhere and the hash changes.
It is also honest about its limits, which is the point. An attestation proves content, not acquisition — it binds a corpus to a hash and reports what is inside it, but a directory of text carries no memory of how it was obtained. Without a provenance registry, every provenance field reads UNKNOWN rather than blank, because a blank would read as *nothing to declare*. Upstream statistics are cited, never verified; we did not observe your pipeline run.
One receipt, three regulatory conversations.
India. The DPDP Act made personal data in a training corpus a board-level question, and there is no grandfathering for a model already shipped. Shuddhi refuses customer data structurally rather than filtering it hopefully, redacts personal data on emission with detectors built for Indian identifiers — Aadhaar in its printed grouping, PAN, Indian mobile numbers, Luhn-checked cards — and runs entirely inside your perimeter, CPU-first, so no corpus leaves your infrastructure to be cleaned.
European Union. Article 53(1)(d) of the AI Act requires a published summary of training content on the Commission's template. Enforcement powers activated on 2 August 2026; models already on the market must publish by 2 August 2027. Shuddhi emits that summary directly from the registry and build manifest, and marks every field a corpus cannot know as an explicit gap for your counsel rather than guessing at it.
United States and elsewhere. No statute yet compels a training-content disclosure, but litigation and enterprise procurement already do. "What was this model trained on, and can you show me?" is now a standard question in a vendor security review and a predictable one in discovery. A build hash chained to a filter configuration is a far better answer than a recollection.
The useful part is that these are not three products. It is one receipt, read three ways — because provenance, once recorded properly, is regime-agnostic. Record it once at build time and the regulatory framing becomes a rendering problem rather than a data-collection emergency.
Built for perimeters, like everything else here.
Shuddhi is CPU-first and runs inside your boundary — no corpus leaves your infrastructure to be cleaned. For organisations building their own sovereign models or fine-tuning corpora, that matters as much as the cleaning itself: the data factory has to be as sovereign as the model it feeds.
It slots into the platform the way the other modules do: provenance ledgers alongside TrustFabric's signed claims, exclusion policy under Governance, and the corpus manifests visible where your training and evaluation history lives.
FAQ
Frequently asked questions.
- What is AgentAnywhere Shuddhi?
- AgentAnywhere Shuddhi is an open-source (Apache-2.0) data factory for LLM training corpora. It takes raw text and code through provenance gating, language identification, deduplication, quality scoring, domain balancing, PII redaction and contamination checks, then seals the accepted corpus with a build manifest that training runs cite. It also emits the EU AI Act Article 53(1)(d) training-content summary, and can attest corpora produced by other tools such as NeMo Curator, DataTrove or Dolma.
- What is a corpus build manifest?
- A sealed record of exactly what a training corpus contains: a content hash over the accepted data plus a composition report — tokens by domain and language, deduplication rate, quality distribution, and every exclusion counted by reason. Training runs cite the manifest hash in their ledgers, so 'what did this model learn from?' has a precise, auditable answer.
- How does Shuddhi handle customer data?
- It refuses it, mechanically. Every shard must enter with source, licence, and data-class tags; customer data is excluded at the provenance gate — the first stage — so no downstream step can train on it by mistake. Exclusion is enforced by the pipeline, not by a policy document.
- Why does contamination checking matter?
- If benchmark questions leak into training data, benchmark results become echoes rather than measurements. Shuddhi screens the corpus against our evaluation batteries before sealing, so the numbers we publish measure capability, not memorisation. It is part of the same receipts discipline the rest of the platform runs on.
- Is Shuddhi available today?
- Not yet, and we would rather say so than have you discover it. The engine is finished and licensed Apache-2.0; the repository publishes shortly, and when it does it is free to run with no account and no licence. It is not a preview: its first production build (tatva-sangraha-v1: 33 million documents, 15 languages) is sealed, the build hash reproduced across four independent full passes, and a filtered, PII-redacted build produced with a receipt chained to the source. The hosted receipts registry, team review workflow and air-gapped deployment are the commercial tiers, and those are in design-partner stage — status stated plainly, per the same rule as every model on this site.
- Is Shuddhi open source, and what is paid?
- The Shuddhi engine is open source under Apache-2.0 and free forever — every built-in filter, receipt generation, the customer-data refusal, the plugin API and the command line, self-hosted with no account or telemetry. Paid tiers add an organisational layer rather than unlocking engine features: a hosted signed receipts registry, review workflow with approvals and role-based access, and cross-build analytics. Nothing is ever removed from the open engine, and receipts you generate remain verifiable with the free tool alone.
- How do I generate an EU AI Act Article 53 training data summary?
- Run `factory.py report --registry <registry.json> --eu-ai-act --manifest BUILD-MANIFEST.json`. Shuddhi renders the training-content summary on the template the European Commission's AI Office published in July 2025, filled from the corpus registry and build manifest. The output is a draft for legal review, not a compliance statement — fields a corpus cannot know, such as provider identity, crawler behaviour and text-and-data-mining opt-out policy, are printed as explicit gaps rather than guessed. Enforcement powers activated 2 August 2026; models already on the market must publish by 2 August 2027.
- Can I use Shuddhi with NeMo Curator, DataTrove or Dolma?
- Yes — that is a supported workflow rather than a workaround. Run `factory.py attest --corpus <dir> --corpus-id <name>` against a corpus any of those tools produced and Shuddhi emits a receipt using the identical hash definition a native Shuddhi build uses, so the two are directly comparable. An attestation proves content, not acquisition: it binds the corpus to a hash and reports what is inside it, but without a provenance registry every provenance field reads UNKNOWN rather than blank.
- Can Shuddhi be made to train on customer data?
- No. The refusal for data classes 'customer' and 'customer-derived' returns before any other branch in the registry check, and there is no flag, environment variable, configuration option or plugin hook that admits them. The rule is in the open-source code and readable in full, which is the point: it is a claim you can verify in about thirty seconds rather than one you have to accept. A build containing customer data cannot be produced.
- Does a bigger training corpus make a better model?
- Not by itself. Token count is an input, not an achievement, and past a point more of the same data spends GPU hours teaching a model nothing. In our own 176 GB corpus the largest near-duplicate cluster was 84,275 copies of a single document, sitting in the English shard where sampling had not predicted it. A smaller, cleaner, well-attributed corpus can outperform a larger unfiltered one at the same compute budget, and it is far easier to defend when someone asks where the data came from.
- Does Shuddhi send my data anywhere?
- No. The open engine is CPU-first, runs entirely inside your own infrastructure, and never contacts AgentAnywhere — there is no account, no telemetry and no phone-home. Your corpus never leaves your perimeter to be cleaned, which matters for DPDP, GDPR and air-gapped deployments alike.
Feed your model something you can defend.
The engine is Apache-2.0 and publishes shortly — tell us where to send it and we will let you know the day it is public. If you need the hosted receipts registry, review workflow for a team, or air-gapped deployment, talk to us about the design-partner program.