Download the PHP package padosoft/laravel-pii-redactor without Composer

On this page you can find all versions of the php package padosoft/laravel-pii-redactor. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package laravel-pii-redactor

laravel-pii-redactor

Tests Latest Version PHP Version Laravel Version Total Downloads

EU-first PII redaction for Laravel โ€” deterministic regex + checksum-validated detectors organised into opt-in country packs (Italy, Germany, Spain ship built-in; France / Netherlands / Portugal land in v1.2+), plus always-on multi-country detectors (email, IBAN mod-97 for every ISO 13616 country, credit card with Luhn) and a pluggable strategy layer (mask / hash / tokenise / drop) with persistent reverse-map storage (memory / database / cache), opt-in HuggingFace + spaCy NER drivers, and YAML custom-rule packs for tenant-specific identifiers. Zero external services in the default path, zero mandatory LLM cost, GDPR + EU AI Act ready.

laravel-pii-redactor is the seventh deliverable of the Padosoft v4.0 cycle (W7). It is a community Apache-2.0 package, standalone-agnostic (zero references to AskMyDocs / sister packages), and ships with the Padosoft AI vibe-coding pack so you can extend it with Claude Code or GitHub Copilot in minutes โ€” not days.


Table of contents


Why this package

PII redaction is one of those domains where the existing options force a bad trade-off:

laravel-pii-redactor covers the deterministic layer. v1.0 ships:

It is deliberately small and deliberately offline by default. You can extend it with custom detectors via Pii::extend() or your own country pack. The deterministic engine fits in ~200 lines of PHP, the v1.0 surface is locked under semver, and 300+ unit tests + a robustness suite describe every transition.


Design rationale

Five non-negotiable choices that drove the API:

1. EU-first via opt-in country packs. World-second.

Every PII pipeline I have seen for Laravel either ignores European fiscal data or matches it with a bare regex that returns false positives on every retry CI run. National identifiers need real code: the Italian codice fiscale requires the official odd/even checksum table from the 1976 Decreto Ministeriale; the German Steuer-ID needs mod-11; the Spanish DNI needs a letter-checksum lookup; the French NIR needs mod-97. A regex alone won't do.

Hence country packs. v1.0 shipped ItalyPack as the reference implementation (4 Italian detectors with the full CIN checksum + Luhn-IT). v1.1 makes good on the promise with two more concrete bundles โ€” GermanyPack (Steuer-ID mod-11 ISO 7064 per ยง139b AO + USt-IdNr BMF Method 30 per ยง27a UStG + German phone/address) and SpainPack (DNI 23-letter checksum table per RD 1553/2005 + NIE + CIF + Spanish phone/address). Both opt-in via a single FQCN in config('pii-redactor.packs'). The PackContract interface + DetectorPackRegistry make it equally trivial for the community to contribute FrancePack, NetherlandsPack, PortugalPack next โ€” each as a self-contained bundle of detectors with checksum-source citations and 10/5 valid/invalid fixtures.

Multi-country detectors (email, iban with mod-97 for every ISO 13616 country, credit_card with Luhn) stay always-on regardless of which packs you load โ€” they have no jurisdictional flavour.

2. Deterministic regex + checksum, no LLM in the hot path

Every first-party detector is a pure function of its input. No external HTTP call, no per-token cost, no rate limit. A 1 MB chat log redacts in ~280 ms and the output is identical on every machine. The optional NER layer (v0.3+) ships behind a config switch; the default path never touches a network.

3. Strategy is a runtime decision, not a compile-time one

The same detected match can be masked ([REDACTED] for human-facing logs), hashed ([hash:abc123ef01234567] for cross-record joins on pseudonymous data), tokenised ([tok:email:abc123ef01234567] with a reversible salt-derived map for forensic recovery), or dropped (empty string for forwarding to lossy systems). Switching strategy is a one-line override on Pii::redact($text, new HashStrategy(...)) โ€” no detector code changes.

4. Detector overlap is resolved deterministically

When two detectors emit overlapping byte ranges (e.g. an email-shaped string that also matches a phone heuristic), the engine keeps the earlier match (lower offset) and drops the latecomer. The behaviour is documented, tested, and predictable โ€” callers can audit it via Pii::scan().

5. Standalone-agnostic โ€” zero AskMyDocs symbols

laravel-pii-redactor is a community package. It is not coupled to AskMyDocs, the sister patent-box tracker, the eval-harness, the Regolo driver, or any other Padosoft project. An architecture test (tests/Architecture/StandaloneAgnosticTest.php) walks src/ with RecursiveDirectoryIterator on every CI run and asserts the forbidden-substring list (KnowledgeDocument, KbSearchService, AskMyDocs, PatentBoxTracker, LaravelFlow, EvalHarness, Regolo, ...) never appears.


Features at a glance


๐Ÿ‡ช๐Ÿ‡บ EU country pack architecture

Why country packs exist. Italian fiscal codes need PHP code with checksum logic. So do German Steuer-ID (mod-11), Spanish DNI (letter-checksum), French NIR (mod-97). Pure regex isn't enough. Each country needs its own bundle of detectors โ€” but the package shouldn't ship all of EU's IDs by default if you only operate in Italy. Hence packs: opt-in jurisdiction bundles, registered via the PackContract interface and a config array.

Enable / disable example:

To disable Italy on an English-only deployment:

The multi-country detectors (Email, IBAN, CreditCard) keep working regardless โ€” they are never part of a country pack because they have no jurisdictional flavour.


Build your own country pack โ€” 3-step recipe

The recipe below uses Iceland (small, real European country, no community pack ships yet) as a "blank slate" example. The real kennitala checksum is mod-11 over the first 9 digits.

Step 1 โ€” Create the detector(s)

Step 2 โ€” Wrap them in a pack

Step 3 โ€” Register it

That's it. The ServiceProvider boots, the DetectorPackRegistry walks the config list, instantiates each pack, and feeds its detectors() into the engine. Pii::redact() and Pii::scan() now redact / report kennitala matches alongside the always-on detectors.

๐Ÿš€ Contribute your country pack

Built a GermanyPack / SpainPack / FrancePack / etc. that meets the contribution standards (checksum source citation + 10 valid + 5 invalid test fixtures + R37 standalone-agnostic + pack-isolation architecture test)? Open a PR โ€” see CONTRIBUTING-PACKS.md for the workflow. Accepted packs ship in the package itself (not as separate composer requires) so consumers get the entire EU coverage with one dependency.


Comparison vs alternatives

โœ… = supported out of the box ยท ๐ŸŸก = partial / requires custom code or paid tier ยท โŒ = not supported

Platform & deployment

laravel-pii-redactor Microsoft Presidio Spatie data-redaction AWS Comprehend PII Google Cloud DLP
Native Laravel facade + ServiceProvider โœ… YES โŒ NO (Python) โœ… YES (different scope) โŒ NO (AWS SDK) โŒ NO (GCP SDK)
composer require install โœ… YES โŒ NO โœ… YES (different scope) โŒ NO โŒ NO
Admin web UI / dashboard โœ… YES (companion package) ๐ŸŸก Presidio Analyzer UI only โŒ NO โŒ Console only โŒ Console only
Operates entirely offline (default path) โœ… YES โœ… YES (self-hosted) โœ… YES โŒ NO (AWS API) โŒ NO (GCP API)
GDPR data-minimisation friendly โœ… YES (no transit) โœ… YES โœ… YES โŒ NO (US transit) โŒ NO (US transit)
Cost per 1M characters โœ… EUR 0 ๐ŸŸก self-hosted compute โœ… EUR 0 โŒ ~ EUR 1 โŒ ~ EUR 1.50

EU country detector coverage (deterministic, checksum-validated)

laravel-pii-redactor Microsoft Presidio Spatie data-redaction AWS Comprehend PII Google Cloud DLP
๐Ÿ‡ฎ๐Ÿ‡น Codice fiscale (CIN checksum) โœ… YES (ItalyPack) ๐ŸŸก regex shape only โŒ NO โŒ NO ๐ŸŸก regex shape only
๐Ÿ‡ฎ๐Ÿ‡น Partita IVA (Luhn-IT) โœ… YES (ItalyPack) โŒ NO โŒ NO โŒ NO โŒ NO
๐Ÿ‡ฉ๐Ÿ‡ช Steuer-ID (mod-11 ISO 7064 + ยง139b AO) โœ… YES (GermanyPack v1.1) โŒ NO โŒ NO โŒ NO ๐ŸŸก regex only (no checksum)
๐Ÿ‡ฉ๐Ÿ‡ช USt-IdNr (BMF Method 30 mod-11) โœ… YES (GermanyPack v1.1) โŒ NO โŒ NO โŒ NO โŒ NO
๐Ÿ‡ช๐Ÿ‡ธ DNI / NIE (23-letter checksum) โœ… YES (SpainPack v1.1) ๐ŸŸก regex shape only โŒ NO โŒ NO ๐ŸŸก regex shape only
๐Ÿ‡ช๐Ÿ‡ธ CIF (AEAT dual digit/letter control) โœ… YES (SpainPack v1.1) โŒ NO โŒ NO โŒ NO โŒ NO
๐Ÿ‡ซ๐Ÿ‡ท NIR / SSN (mod-97) ๐ŸŸก v1.2+ candidate (community PR) ๐ŸŸก regex shape only โŒ NO โŒ NO ๐ŸŸก regex shape only
๐Ÿ‡ณ๐Ÿ‡ฑ BSN (eleven-test mod-11) ๐ŸŸก v1.2+ candidate (community PR) โŒ NO โŒ NO โŒ NO โŒ NO
๐Ÿ‡ต๐Ÿ‡น NIF (mod-11) ๐ŸŸก v1.2+ candidate (community PR) โŒ NO โŒ NO โŒ NO โŒ NO
ISO 13616 IBAN mod-97 (every country) โœ… YES ๐ŸŸก structural only โŒ NO ๐ŸŸก partial (US-leaning) ๐ŸŸก partial (US-leaning)
Per-country phone number heuristics โœ… YES (IT/DE/ES + community packs) ๐ŸŸก limited โŒ NO ๐ŸŸก limited ๐ŸŸก limited
Per-country street-address heuristics โœ… YES (IT/DE/ES) โŒ NO โŒ NO โŒ NO โŒ NO

Replacement strategies (mask / hash / tokenise / drop)

laravel-pii-redactor Microsoft Presidio Spatie data-redaction AWS Comprehend PII Google Cloud DLP
Mask strategy ([REDACTED]) โœ… YES โœ… YES โœ… YES โœ… YES โœ… YES
Deterministic salted hash strategy โœ… YES ๐ŸŸก custom anonymizer ๐ŸŸก custom โŒ NO ๐ŸŸก cryptoHashConfig
Per-detector hash namespacing โœ… YES โŒ NO โŒ NO โŒ NO ๐ŸŸก partial
Reversible pseudonymisation (detokenise) โœ… YES (TokeniseStrategy) โŒ NO ๐ŸŸก custom โŒ NO ๐ŸŸก DLP de-identify
Drop strategy (empty replacement) โœ… YES โœ… YES โœ… YES โŒ NO โœ… YES
Strategy override per-call (Pii::redact($t, new HashStrategy(...))) โœ… YES ๐ŸŸก anonymizer chains ๐ŸŸก manual โŒ NO ๐ŸŸก deidentifyTemplate

Persistence & infrastructure

laravel-pii-redactor Microsoft Presidio Spatie data-redaction AWS Comprehend PII Google Cloud DLP
In-memory token store (process-local) โœ… YES (InMemoryTokenStore) โŒ NO (stateless) โŒ NO โŒ NO โŒ NO
Database token store (Eloquent + migration) โœ… YES (DatabaseTokenStore v0.2) โŒ NO โŒ NO โŒ NO โŒ NO
Cache token store (Redis / Memcached / array) โœ… YES (CacheTokenStore v0.3) โŒ NO โŒ NO โŒ NO โŒ NO
Cross-process / cross-deploy detokenisation โœ… YES (database / cache drivers) โŒ NO โŒ NO โŒ NO โŒ NO
Audit-trail event (counts only, GDPR-safe) โœ… YES (PiiRedactionPerformed v0.2) โŒ NO โŒ NO ๐ŸŸก CloudWatch (paid) ๐ŸŸก audit logs (paid)

Extensibility & community

laravel-pii-redactor Microsoft Presidio Spatie data-redaction AWS Comprehend PII Google Cloud DLP
Per-tenant custom detectors โœ… Pii::extend() (one-liner) ๐ŸŸก yaml + Python class ๐ŸŸก manual ๐ŸŸก custom entities ๐ŸŸก custom infoTypes
YAML-loaded custom rule packs โœ… YES (YamlCustomRuleLoader v0.3) ๐ŸŸก yaml + Python config โŒ NO โŒ NO โŒ NO
Pluggable country pack architecture โœ… YES (PackContract v1.0) โŒ NO โŒ NO โŒ NO โŒ NO
Community-contributed country packs โœ… YES (DE + ES shipped v1.1; FR/NL/PT welcome) โŒ NO โŒ NO โŒ NO โŒ NO
HuggingFace NER driver (opt-in, fail-open) โœ… YES (HuggingFaceNerDriver v0.3) โœ… YES (HF integration) โŒ NO ๐ŸŸก separate service โŒ NO
spaCy NER driver (opt-in, generic HTTP) โœ… YES (SpaCyNerDriver v0.3) โœ… YES (built-in) โŒ NO โŒ NO โŒ NO
AI vibe-coding pack for contributors โœ… YES (.claude/ skills + agents) โŒ NO โŒ NO โŒ NO โŒ NO
Apache-2.0 license โœ… YES โœ… YES (MIT) โœ… YES (MIT) ๐ŸŸก proprietary ๐ŸŸก proprietary

Quality gates & guarantees

laravel-pii-redactor Microsoft Presidio Spatie data-redaction AWS Comprehend PII Google Cloud DLP
Stable surface lock (semver v1.x) โœ… YES (v1.0+) ๐ŸŸก 0.x line โœ… YES ๐ŸŸก service versioning ๐ŸŸก service versioning
PHP 8.3 / 8.4 / 8.5 ร— Laravel 12 / 13 matrix CI โœ… YES โŒ N/A โœ… YES โŒ N/A โŒ N/A
600+ unit tests + robustness suite โœ… YES โœ… YES ๐ŸŸก smaller surface โŒ N/A (managed service) โŒ N/A (managed service)
Cross-pack architecture isolation enforced โœ… YES (per-pack architecture test) โŒ NO โŒ NO โŒ NO โŒ NO
Performance benchmarks (1MB doc < 2s) โœ… YES (PerfBenchTest) ๐ŸŸก unpublished ๐ŸŸก unpublished ๐ŸŸก SLA only ๐ŸŸก SLA only
Standalone-agnostic invariant (no host coupling) โœ… YES (R37 architecture test) โœ… YES โœ… YES โŒ N/A โŒ N/A

laravel-pii-redactor is not a Presidio replacement for fuzzy named-entity recognition โ€” Presidio's transformer-backed NER layer (PERSON, ORG, LOC) is genuinely more capable as a free-form classifier, and you can plug it (or any HuggingFace / spaCy model) into this package via the NerDriver interface (v0.3+). The deterministic regex + checksum + per-country pack core stays the strongest layer where the existing EU-aware options are weakest, and the persistent reverse-map storage + community-contributable pack architecture are unique to this package across the comparison set.


Installation

Laravel auto-discovery wires the PiiRedactorServiceProvider and the Pii facade alias. Publish the config to override defaults:

Set the salt for the hash / tokenise strategies in your .env:


Quick start


Usage examples

Reversible pseudonymisation for forensic exports

Custom detector via Pii::extend()

CLI โ€” scan a file in CI

Default (masked-samples) output:

With --show-samples (raw values restored):


Laravel integration recipes

The package is transport-agnostic โ€” Pii::redact() and RedactorEngine::redact() accept a string and return a redacted string, so they slot into HTTP, queue, CLI, and event paths identically.

Side-effects to expect. redact() is not strictly pure: when the active strategy is tokenise it persists (token, original) rows to the configured TokenStore (see pii-redactor.token_store), and when audit-trail is enabled it dispatches a PiiRedactionPerformed event after every call. Both behaviours are documented in the RedactorEngine source. Keep this in mind if you wrap the call in a transaction or invoke it from a hot loop.

This section documents the two production-tested integration shapes plus the strategy decision tree.

Real-world reference: AskMyDocs (the v4.1+ enterprise RAG / chat platform) wires this package at four observable touch-points using the patterns below. Source available under app/Http/Middleware/RedactChatPii.php, app/Services/Kb/EmbeddingCacheService.php, app/Services/Admin/AiInsightsService.php, and app/Http/Controllers/Api/Admin/LogViewerController.php of lopadova/AskMyDocs โ€” feel free to copy.

A note on config namespaces โ€” package vs host

This package's own runtime knobs (master switch, default strategy, salt, mask token, NER driver, โ€ฆ) live under pii-redactor.* (file: config/pii-redactor.php) and are driven by the documented PII_REDACTOR_* env vars. Do not invent a parallel app.pii_redactor tree โ€” turning the package on via PII_REDACTOR_ENABLED=true will not flip a guard that reads config('app.pii_redactor.enabled').

What you DO need is your own per-touch-point integration knobs (e.g. "the chat middleware is active", "the embedding pre-redact is active"). Pick a host-app config namespace and document the env-var names alongside the package's own. The recipes below use a placeholder namespace myapp.pii.* โ€” substitute your project's real config key (AskMyDocs uses kb.pii_redactor.*, for example).

Integration shape A โ€” HTTP middleware (best practice for chat / API write paths)

This is the recommended pattern when redaction must happen before the controller persists the request to a database, dispatches a queue job, or calls an external LLM. The middleware mutates a specific request field (typically content / message / body) so every downstream consumer (controller, model creating event, queue job, log driver) sees the redacted form automatically.

1. Create the middleware:

2. Register the alias in bootstrap/app.php (Laravel 11+):

3. Bind it ONLY to the routes that handle user-supplied free-form content. Do NOT slap it on a global middleware group โ€” that would also redact admin forms, configuration values, and curator-supplied content like markdown ingest payloads. The whole point is narrow scope:

4. Pin the binding scope with an architecture test so a future refactor cannot accidentally extend the binding to admin / curator / ingest routes. Use a substring match (not a prefix match) so bare URIs like admin and api/admin are caught alongside admin/... and api/admin/...:

Integration shape B โ€” service-layer call (for non-HTTP write paths)

Use this when the data enters your system from somewhere other than an HTTP request โ€” queue jobs, scheduled imports, CLI commands, or service-to-service callers. Inject RedactorEngine directly and call redact() at the boundary where the untrusted text first lands in your domain.

Forcing a strategy override. When you want a specific strategy for a service path (regardless of the package's default), pass an override to redact() rather than autowiring a fresh strategy instance โ€” that way you respect the host's configured mask_token, salt, hex length, etc. The cleanest way is to construct the strategy explicitly from the package's config so the host's overrides flow through:

Example โ€” queue job that consumes a webhook payload before persisting. Note the explicit string guard โ€” webhook payloads can arrive as arrays / objects / nulls, and redact() is typed string-in / string-out:

Strategy decision tree โ€” which one for which surface

The four ship-with-the-box strategies (MaskStrategy, HashStrategy, TokeniseStrategy, DropStrategy) are NOT interchangeable. Pick the one whose properties match the surface you're protecting.

Surface Recommended strategy Why
Embedding cache key + provider call MaskStrategy Embeddings are one-way; no detokenise round-trip needed. Mask is stable (same input โ†’ same masked output) so cache hit-rate is preserved across re-ingestion of the same document. Mask carries no per-tenant secret, so multi-tenant cache reuse stays intact.
Chat persistence (when an operator may need to recover originals later for audit / GDPR data subject request) TokeniseStrategy The host can call TokeniseStrategy::detokeniseString() to round-trip a redacted record back to plaintext. Pair with the database token store (set PII_REDACTOR_TOKEN_STORE=database) so the reverse map survives deploys + queue worker restarts + horizontal scale-out.
Chat persistence (when originals must be cryptographically forgotten) MaskStrategy or DropStrategy One-way. MaskStrategy replaces every detection with the configured mask_token (default [REDACTED], single fixed string regardless of detector โ€” see pii-redactor.mask_token to override); DropStrategy removes the matched span entirely.
Cross-system identifier matching (you want to know that two systems mention the same PII without revealing what it is) HashStrategy Deterministic SHA-256 namespaced per-detector. Same PII produces the same hash across systems sharing the salt. Secret = the salt.
Insights / analytics snapshots (read-only dashboards built from chat samples) MaskStrategy No round-trip needed; mask short-circuits leakage to both the LLM call and the snapshot persisted into your dashboard table.
Operator-driven detokenise endpoint (gated by a Spatie permission, audited per call) TokeniseStrategy::detokeniseString() against the row's text. The detokenise call resolves [tok:detector:hex] literals via direct token-store lookup, so historical tokenised rows stay recoverable even after the app's current default strategy changes โ€” what matters is whether the row's text actually contains tokenise literals. Surface a 422 only when there are no [tok: markers in the row to detokenise (or when the configured token store is unavailable).

Best-practice checklist for a production deploy


Web Panel UI

This package now has a companion web panel with a polished Laravel admin dashboard: padosoft/laravel-pii-redactor-admin.

The UI gives operators a safe overview of the redaction engine, detector hits, token-map activity, audit events, custom-rule health, and strategy configuration. It is built on top of the secret-free inspector APIs exposed by this package, so the panel can surface runtime state without returning salts, API keys, raw PII, or token originals.


Admin panel readiness

The core package is intentionally headless: it does not ship controllers, routes, React components, or admin UI assets. The admin dashboard lives in the separate padosoft/laravel-pii-redactor-admin package, while this package exposes the safe backend primitives needed by that UI.

The companion UI is the Laravel 13.x package padosoft/laravel-pii-redactor-admin, built with Vite, React, TypeScript, and Tailwind CSS and connected to these APIs. The implementation contract, endpoint plan, audit schema, PHPUnit gates, and frontend gates are documented in docs/admin-panel-architecture-plan.md.


Configuration reference

Every key in config/pii-redactor.php is documented inline. Highlights:


Architecture

The engine itself is stateless with respect to the input. Calls to redact() / scan() are pure functions of (text, registered detectors). Overlap resolution is left-to-right, longer-match-wins on tie โ€” see RedactorEngineTest::test_overlapping_detections_are_resolved_left_to_right.


AI vibe-coding pack

This repository ships with a .claude/ directory containing the Padosoft skills, agents, rules, and commands used to build the package. Drop the directory into a host application that has Claude Code installed and you inherit:

Open the repo in Claude Code and /help lists everything.


Testing โ€” Default + Live

The Live suite is opt-in and reserved for scenarios that require a real external dependency (HuggingFace Inference API, spaCy HTTP server). Each Live test self-skips unless PII_REDACTOR_LIVE=1 is set AND its driver-specific credentials are configured. CI runs Unit + Architecture only โ€” Live is operator-driven and perf is excluded by default in shared-runner CI.


Performance

Concrete numbers for the synchronous, deterministic path (no NER, no cache hit), measured on PHP 8.4 / Laravel 13 / standard CI hardware:

Input size Time Notes
1 KB Italian text (mixed PII) ~0.4 ms single-pass regex matching against 7 detectors (3 always-on + ItalyPack).
100 KB document ~25 ms linear in input length; no per-detector backtracking explosion.
1 MB document ~280 ms gated by tests/Unit/Robustness/UnicodeAndBoundaryTest::test_engine_handles_1mb_document_in_reasonable_time to keep regressions out of main.
Memory (1 MB / ~1000 detections) < 8 MB total input string + detection list (~32 bytes per detection on 64-bit).

NER drivers add network latency to the synchronous figures above (NER is opt-in and disabled by default):

Both drivers fail open on HTTP error, so a NER outage cannot block deterministic redaction. The robustness suite exercises Unicode boundaries, multi-byte CAP/civic markers, overlapping ranges across detectors, and the 1 MB regression gate on every CI push.


Roadmap


Migration guide v0.x โ†’ v1.0

No breaking changes. v1.0 is a drop-in upgrade from v0.3 / v0.2 / v0.1. Existing import paths, facade calls, config keys, env vars, and the pii_token_maps migration all continue to work unchanged.

What you gain by upgrading:

What you should consider doing:


Contributing

PRs welcome. Please read:

Every PR follows the R36 Copilot review + CI green loop before merge. The architecture test gates standalone-agnostic violations on every push.


Security

Found a vulnerability? Email [email protected] โ€” please do not open a public issue. See SECURITY.md for the full disclosure policy.


License

Apache-2.0 โ€” see LICENSE.


All versions of laravel-pii-redactor with dependencies

PHP Build Version
Package Version
Requires php Version ^8.3
illuminate/console Version ^12.0|^13.0
illuminate/contracts Version ^12.0|^13.0
illuminate/http Version ^12.0|^13.0
illuminate/support Version ^12.0|^13.0
symfony/yaml Version ^7.0|^8.0
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package padosoft/laravel-pii-redactor contains the following files

Loading the files please wait ...