Not legal advice
dpdpkit is software that helps you implement obligations under India's Digital Personal Data Protection Act, 2023 and the DPDP Rules, 2025. It does not provide legal advice and does not guarantee compliance.
Versioning and deprecation¶
Versions¶
The code packages (dpdpkit-core, dpdpkit-fastapi, dpdpkit-conformance, @dpdpkit/client,
@dpdpkit/react, and later dpdpkit-django and dpdpkit-server) are released together with one
version number. Policy packs (dpdpkit-policies) use calendar versions and are released on their own.
| Version change | Below 1.0 | From 1.0 |
|---|---|---|
Patch (0.3.1) |
Fixes only | Fixes only |
Minor (0.4.0) |
New features; may remove APIs deprecated at least two minors earlier | New features, backwards compatible |
Major (2.0.0) |
n/a | May remove APIs deprecated in an earlier 1.x |
Alpha, beta and release-candidate builds (0.3.0a1, 0.3.0-alpha.1) carry no compatibility promise.
What is public¶
- Python: everything importable without a leading underscore from
dpdpkit,dpdpkit.<module>,dpdpkit.fastapianddpdpkit_conformance, as listed in the Python API. Names starting with_(such asdpdpkit._util) may change in any release. - JavaScript: the exports of
@dpdpkit/client,@dpdpkit/client/expressand@dpdpkit/react. - REST: everything in
openapi.yaml. - CLI: commands, options and exit codes.
- Database: the
dpdp_*tables belong to dpdpkit. Read them if you like, but change them only throughdpdpkit migrate.
How something is deprecated¶
- The release that deprecates it lists it under Deprecated in the changelog, with what to use instead.
-
Every use emits a
DpdpkitDeprecationWarning(aDeprecationWarning) that names the replacement and the release that will remove it:DpdpkitDeprecationWarning: Ledger.export_roots() is deprecated since dpdpkit 0.3 and will be removed in 0.5; use Ledger.export_root() insteadDeprecated functions and classes are also marked for type checkers (PEP 702), so mypy (with
--enable-error-code deprecated) and pyright report callers before the code runs. 3. It keeps working, unchanged, for at least two minor releases and at least 90 days. 4. It is removed in the release named in the warning, and the changelog lists the removal under Removed.
Python hides DeprecationWarning outside test runners and __main__. To see these in your app:
python -W always::DeprecationWarning -m uvicorn main:app
# or in pytest (pyproject.toml): filterwarnings = ["error::dpdpkit.DpdpkitDeprecationWarning"]
REST contract¶
- A deprecated operation or field is marked
deprecated: trueinopenapi.yaml. - Responses from a deprecated operation carry a
Deprecationheader (RFC 9745) and, once a removal date is set, aSunsetheader (RFC 8594). - Removing or renaming anything in the contract is a breaking change. Pull requests to
dpdpkit-specrun a breaking-change check and need thebreaking-changelabel to pass it.
Policy packs¶
A published pack id (for example dpdp-rules-2025.v1) is never changed or removed. When the Rules or
the Board's guidance change, a new pack id is published and the changelog cites the notification.
dpdpkit policy diff shows exactly what moved, and switching packs is a one-line config change.
Database¶
Migrations only move forward and never drop consent, audit or ledger data. A column that is no longer used stays until a major version, and the changelog says when it stopped being written.