Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

arche-core

Know what's real.

The open engine for messy, multilingual, real-world data — detect · resolve · protect · attest.

arche is an open pipeline for turning messy, multilingual data into resolved real-world entities. It tells you and your agent what — and who — your data is actually talking about: it finds the entities in any document or system, standardises them for the names and addresses people actually use, and works out which real-world thing each one refers to.

Along the way it keeps disagreement between sources instead of erasing it, protects everything under the law that applies, and signs every decision.

Match, don't guess. When the evidence isn't distinctive enough, resolution returns review rather than a verdict — two people who share a name are not one person, and a system that merges them has not scored slightly worse, it has deleted someone. Calibrated on the world's hardest identity data — Africa's — and built for how the world actually writes names and addresses everywhere.

Numbers we publish come with the script that produces them. The current one is the place benchmark: reconciling Nigeria's GRID3 reference data against OpenStreetMap for Kano State gives 88.2% agreement with independently-recorded administrative boundaries, and the page states the weak-label methodology, its five limitations, and the case where it demonstrably gets a match wrong.

[!WARNING] Status: pre-beta (development) - arche-core is under active development. APIs may change between alpha releases. v0.3.0a1 is the first alpha of the beta line — not beta itself.

arche-core detects PII across various jurisdictions; government IDs, names, phone numbers, addresses, and grounds every detection in the data protection statute that governs it. NDPA, POPIA, Kenya DPA, Ghana DPA, GDPR. Six closed policy actions. Runs offline on CPU, and composes with Presidio and GLiNER.

Presidio detects PII. GLiNER does multilingual NER. Splink links records. None of them know that a BVN is sensitive under NDPA §30, or that "Adeyẹmí" and "Adeyemi" are the same Yoruba name with and without tonal marks, or that "behind Total filling station, Madina Junction" is a parseable Ghanaian address. arche-core does that one job.

from arche import Pipeline

pipeline = Pipeline(jurisdiction="NG")        # auto-loads NDPA-2023
result = pipeline.process(
    "Fatima Abdullahi, NIN 12345678901, BVN 22100987654."
)

for d in result.detections:
    print(f"{d.category:11} tier={d.sensitivity_tier.value:9} {d.regulatory_citation}")
# PII-2-BVN   tier=high      NDPA-2023 s.30, CBN BVN policy 2014
# PII-2-NIN   tier=high      NDPA-2023 s.30, NIMC Act s.27
# PII-1-NAME  tier=moderate  NDPA-2023 s.30            (×2 — given + family name)

print(result.redacted_text)
# NAME_... NAME_..., NIN [NIN], BVN [BVN].

Same code works for jurisdiction="ZA" (POPIA), "KE" (Kenya DPA), "GH" (Ghana DPA). Six statute packs at v1.0 (the four African DPAs plus GDPR and HIPAA Safe Harbor), each declaring whether it is self-reviewed or regulator-reviewed, one composable framework.

Install

pip install arche-core          # ~310KB base — pure-Python detectors, statute policy
pip install arche-core[all]     # everything (GLiNER + Presidio + Splink + docling + LLM)

(Or uv add arche-core / uv add arche-core[all].) Heavy capabilities are opt-in extras:

Extra Adds
arche-core[detect] GLiNER2-PII via ONNX runtime (multilingual neural soft-PII)
arche-core[presidio] Microsoft Presidio recognizer plugin
arche-core[resolve] Splink + DuckDB for large-scale entity resolution
arche-core[doc] docling for PDF / DOCX / PPTX / XLSX ingestion

Coverage

Per-launch-jurisdiction detection coverage. Every detector validates check-digits where the underlying spec supports it.

Jurisdiction Statute Detectors
Nigeria (NG) NDPA-2023 NIN (11 digits), BVN (11 digits, 22-prefix), TIN, RC, voter PVC, driver's licence
Kenya (KE) Kenya DPA 2019 National ID, KRA PIN, NHIF
South Africa (ZA) POPIA SA ID (13-digit Luhn + DOB/gender/citizenship decode), tax reference, passport
Ghana (GH) Ghana DPA 2012 Ghana Card, SSNIT, TIN
+ 11 more African patterns Egypt, Uganda, Rwanda, Tanzania, Cameroon, Senegal, ...

Plus libphonenumber-backed normalization for 30+ African phone networks, landmark-anchored address parsing for NG and ZA, and currency detection (Naira, Cedi, Rand, CFA).

The statute layer

Every detection emits a category, a sensitivity tier (high / moderate / low), and the specific statute section that classifies it. The Pipeline maps each to one of six closed actions — mask, tokenize, drop, generalize, audit, retain — per the configured jurisdiction's statute YAML.

for o in result.policy_outcomes:
    print(o.category, o.action, o.statute_reference)
# PII-2-BVN    mask       NDPA-2023 s.30, CBN BVN policy 2014
# PII-2-NIN    mask       NDPA-2023 s.30, NIMC Act s.27
# PII-1-NAME   tokenize   NDPA-2023 s.30

Statute YAMLs live at arche/policy/statutes/<STATUTE-ID>.yaml and are human-readable. Statute amendments are policy-file changes, not code changes.

Cultural naming intelligence

arche-core ships a 114-group African name equivalence lexicon covering 454 name forms across 20+ ethnic and linguistic traditions:

  • Mohammed = Muhammad = Mamadou = Muhammadu (Pan-Islamic)
  • Diallo = Jallow = Jalloh (Fulani cross-ethnic orthography)
  • Fatou = Fatoumata (West African diminutive)
  • Adeyemi = Adeyẹmi = Adeyẹmí (Yoruba tonal marks)
  • Pierre = Peter = Pedro (colonial-era cross-linguistic)
  • Irorere, Aibuedfe (Benin/Edo names with semantic meaning)

Growing via Wikidata + community curation. See datasets/ for the full dataset and contribution guide.

Composing with Presidio and GLiNER

arche-core is designed to compose with the incumbent tools, not replace them. The three integration patterns:

# Presidio's English recognizers + arche's African recognizers
pip install arche-core[presidio]
# arche.protect uses Presidio when it is installed and falls back to regex
# when it is not. (There is no importable arche.detect.presidio API.)

# GLiNER's multilingual NER + arche's statute classification
pip install arche-core[detect]
# arche.extract.extract(text, backend="gliner") routes soft-PII through GLiNER.
# Pipeline() has no backend= parameter — its constructor takes jurisdiction,
# statute, detectors, address_parsing, audit, tokenize_salt, overlays,
# transparency_notice.

# Splink's record linkage — the deprecated v0.1 path only
pip install arche-core[resolve]
# arche.resolve.resolve_entities(entities, use_splink=True) feeds Splink.
# NOTE: this is the ONLY code path that imports Splink. The shipped surface
# — resolve.pairwise, resolve.crosswalk, the frequency tables and the name
# lexicon — implements Fellegi-Sunter itself and imports no Splink at all.

Audit log

arche.graph.audit ships an SQLite-backed append-only log that records every detection, every policy decision, and every action taken — queryable by compliance officers and regulators. PII values are never stored; only categories, span offsets, and document hashes. Markdown compliance report generator for regulator-ready exports.

Power-user features

These ship in the package but are not in the headline pitch — they support specific identity workflows on top of the detection layer:

  • arche.sign — Ed25519 + JWS + did:key signing for Pipeline.Result envelopes. SD-JWT-VC issue / verify via arche.credentials.sd_jwt. See examples/02_sign_share_extract.py and examples/04_sd_jwt_credential.py.
  • arche.workflow.dsar — citizen-side DSAR draft generation with per-jurisdiction statute citations. See examples/03_dsar_workflow.py.
  • arche.resolve — lightweight Fellegi-Sunter matcher with jurisdiction-specific priors. from arche import match for two-record comparison; from arche import link for cross-source resolution.
  • arche.workflow._review — MPI review queue for human-in-the-loop match decisions. Not on the public surface; import from the canonical path.
  • arche.resolve_places / arche.list_places — jurisdictional place lookup with verifiable audit receipts.

These are real tools we depend on internally. They are not the lead pitch.

License

Apache 2.0. By Unpatterned Labs.

arche-core is under active development. APIs may change between alpha releases.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

arche_core-0.3.0a1.tar.gz (1.4 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

arche_core-0.3.0a1-py3-none-any.whl (1.3 MB view details)

Uploaded Python 3

File details

Details for the file arche_core-0.3.0a1.tar.gz.

File metadata

  • Download URL: arche_core-0.3.0a1.tar.gz
  • Upload date:
  • Size: 1.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for arche_core-0.3.0a1.tar.gz
Algorithm Hash digest
SHA256 39ff0b3d3bd0ecf1232fa2596ebcf8da341737e5c06b65ab3cbba6eb6dec2e23
MD5 5f1c67664eef446d89a8942f2c32876f
BLAKE2b-256 727cb2caae86a7a1c17665c3dbece1b800faed4090b293c0bbe88ded415e867f

See more details on using hashes here.

File details

Details for the file arche_core-0.3.0a1-py3-none-any.whl.

File metadata

  • Download URL: arche_core-0.3.0a1-py3-none-any.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for arche_core-0.3.0a1-py3-none-any.whl
Algorithm Hash digest
SHA256 11f569cb5e3d537e77acd1a1f39fcb69655e30a369ee002dd79f5b58c213c963
MD5 26d71ba690adfe5ed5f304b3a4d3f4c9
BLAKE2b-256 536497a21349d037e843b8668d85bd08a8108b1e357f23b38f2345eb0c92d8bc

See more details on using hashes here.

Release history Release notifications | RSS feed

0.8.0

2 files

This release

0.3.0a1 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page