{
  "guide": {
    "slug": "scrubadub-text-redaction",
    "title": "scrubadub Guide",
    "subtitle": "A source-qualified guide to when scrubadub fits the locally deployable text redaction job.",
    "summary": "scrubadub is a locally embedded Python option for relatively simple text-cleaning pipelines with configurable detectors.",
    "category": {
      "slug": "software",
      "name": "Software",
      "description": "Fact sheets for developer tools, AI systems, software platforms, and technical buying or adoption decisions."
    },
    "tags": [
      "software",
      "privacy",
      "pii",
      "redaction",
      "scrubadub-text-redaction"
    ],
    "version": "2026-10-18.1",
    "publishedAt": "2026-10-18",
    "r2JsonKey": "guides/scrubadub-text-redaction/2026-10-18.1.json",
    "updatedAt": "2026-10-18",
    "vaultPath": "Research/Technology/Software Development/AI Tools/scrubadub Guide.md",
    "freshness": "Checked 2026-10-18 against the cited sources. Official product claims, independent review/community signals, and evidence limits are reported; no hands-on benchmark, installation test, or privacy audit is claimed.",
    "heroLabel": "Locally deployable text redaction",
    "archetype": "comparison",
    "thesisCards": [
      {
        "label": "Verdict",
        "title": "Choose it for embedded Python text cleaning.",
        "body": "scrubadub is a locally embedded Python option for relatively simple text-cleaning pipelines with configurable detectors. Some entity types need extra detector dependencies."
      },
      {
        "label": "Workflow",
        "title": "Replace personal information in free text.",
        "body": "Run text through the configured detectors and review the spans they identify before using the cleaned output. Add detector dependencies for the entity types your pipeline needs."
      },
      {
        "label": "Boundary",
        "title": "Check the limit before committing",
        "body": "The key constraint is Extra detector dependencies are needed for some entity types. No source here proves a universal performance, privacy, or reliability outcome."
      }
    ],
    "stats": [],
    "sections": [
      {
        "id": "decision",
        "eyebrow": "Decision",
        "title": "Choose scrubadub when its documented boundary matches the job.",
        "body": "scrubadub is a locally embedded Python option for relatively simple text-cleaning pipelines with configurable detectors. The cited sources describe it as a locally deployable redaction option. Choose it when an embedded Python cleaning pipeline is the job. Some entity types need extra detector dependencies."
      },
      {
        "id": "setup",
        "eyebrow": "Setup",
        "title": "Start by confirming deployment and the data path.",
        "body": "Confirm this setup detail before you build a routine: Python package invoked inside local scripts. Then verify the processing boundary — Detectors identify spans; postprocessors control replacement — and keep the first sample low-risk until the account, device, or runtime behavior matches the source description."
      },
      {
        "id": "workflow",
        "eyebrow": "Workflow",
        "title": "Workflow: replace personally identifiable spans in free text.",
        "body": "Use scrubadub to replace personally identifiable spans in free text. Customization is described as optional address, spaCy and Stanford detector packages; locale configuration. Keep the workflow small enough to review its output and control settings; the cited sources do not establish a universal quality or speed result."
      },
      {
        "id": "comparison",
        "eyebrow": "Alternatives",
        "title": "Compare scrubadub by the constraint that decides the work.",
        "body": "The five-guide table retains the current guide and four siblings in the locally deployable text redaction group. Values come from the cited source cells; an Unknown cell means the sources did not support a stronger statement.",
        "table": {
          "columns": [
            "Guide",
            "Workflow",
            "Deployment",
            "Input",
            "Entry cost",
            "Method",
            "Customization",
            "Limitation"
          ],
          "rows": [
            [
              "OpenAI Privacy Filter",
              "Model-based text redaction with a local CLI and Python API.",
              "Local CPU or GPU; checkpoints downloaded if absent.",
              "Text strings, files and pipes.",
              "Open repository; compute and operational costs remain.",
              "Token classification with span decoding.",
              "Runtime precision/recall presets, evaluation and fine-tuning commands.",
              "Validate detection on the target corpus; community scores change with matching criteria."
            ],
            [
              "Presidio",
              "PII identification followed by configurable anonymization.",
              "Python module or self-hosted HTTP service/container.",
              "Text and detected entity spans.",
              "Open-source deployment; self-hosting/integration cost separate.",
              "Analyzer plus separate anonymizer operators.",
              "Replace, mask, redact or encrypt; reversible operators need corresponding metadata and keys.",
              "Anonymizer acts on supplied detections; missing detections are not repaired by replacement."
            ],
            [
              "scrubadub",
              "Replace personally identifiable spans in free text.",
              "Python package invoked inside local scripts.",
              "Free-text strings.",
              "Apache-2.0 software; dependency and operation costs separate.",
              "Detectors identify spans; postprocessors control replacement.",
              "Optional address, spaCy and Stanford detector packages; locale configuration.",
              "Extra detector dependencies are needed for some entity types."
            ],
            [
              "Limina on-premises",
              "Detect and de-identify sensitive data; this comparison covers text.",
              "Container in customer on-premises environment or VPC.",
              "Text; product also supports documents, images and audio.",
              "Enterprise custom pricing; free hosted Starter is not the local-deployment price.",
              "Commercial entity detection and de-identification engine.",
              "Enterprise model-version pinning and guided integration/tuning.",
              "Local availability and commercial terms require vendor agreement."
            ],
            [
              "Philter UCSF",
              "Remove protected health information from clinical plain text.",
              "Local Python command-line package.",
              "Plain-text file or directory of clinical notes.",
              "BSD-3-Clause software; integration and compute separate.",
              "Configurable filtering pipeline with optional evaluation annotations.",
              "Filter configuration and input/output paths.",
              "Clinical-domain focus; general chat/email quality is not established."
            ]
          ]
        }
      },
      {
        "id": "review-signal",
        "eyebrow": "Review signal",
        "title": "Independent context for scrubadub is bounded.",
        "body": "The bounded cited sources contain no independent current-version review or community evaluation for scrubadub. Its fit is consequently a documented capability read, with no tested ranking attached.",
        "bullets": [
          "No independent current-version review or community evaluation was included for scrubadub among these cited sources.",
          "Treat official capability statements as the decision input and run your own representative check before a consequential rollout."
        ]
      },
      {
        "id": "caveats",
        "eyebrow": "Caveats",
        "title": "Keep the source boundary visible while you decide.",
        "body": "The current cited cost statement is: Apache-2.0 software; dependency and operation costs separate. Privacy or processing control is described as: Privacy controls are not fully described in the cited sources. The principal product boundary is: Extra detector dependencies are needed for some entity types. These are source-qualified statements, not an installation result, benchmark, security audit, or retention guarantee.",
        "bullets": [
          "No recent credible independent comparative review found in bounded search.",
          "Old documented Python minimum is not proof of compatibility with every current Python version; no installation tested."
        ]
      },
      {
        "id": "decision-surface",
        "eyebrow": "First check",
        "title": "Make the first adoption check specific to scrubadub.",
        "body": "Run a labeled sample from the target corpus through detection and replacement, then inspect misses, over-redaction, and logs before sending real data through the pipeline."
      }
    ],
    "sources": [
      {
        "id": "opf-repo",
        "title": "Privacy Filter repository and CLI",
        "publisher": "OpenAI",
        "url": "https://github.com/openai/privacy-filter",
        "sourceType": "official",
        "accessedAt": "2026-10-18"
      },
      {
        "id": "presidio-home",
        "title": "Presidio overview",
        "publisher": "Data Privacy Stack",
        "url": "https://presidio.dataprivacystack.org/",
        "sourceType": "official",
        "accessedAt": "2026-10-18"
      },
      {
        "id": "presidio-anonymizer",
        "title": "Presidio Anonymizer",
        "publisher": "Data Privacy Stack",
        "url": "https://presidio.dataprivacystack.org/anonymizer/",
        "sourceType": "official",
        "accessedAt": "2026-10-18"
      },
      {
        "id": "scrubadub-repo",
        "title": "scrubadub README and license",
        "publisher": "LeapBeyond",
        "url": "https://github.com/LeapBeyond/scrubadub",
        "sourceType": "official",
        "accessedAt": "2026-10-18"
      },
      {
        "id": "scrubadub-docs",
        "title": "scrubadub stable documentation",
        "publisher": "scrubadub maintainers",
        "url": "https://scrubadub.readthedocs.io/en/stable/",
        "sourceType": "official",
        "accessedAt": "2026-10-18"
      },
      {
        "id": "limina-plans",
        "title": "Pricing and deployment FAQ",
        "publisher": "Limina",
        "url": "https://www.getlimina.ai/en/pricing",
        "sourceType": "official",
        "accessedAt": "2026-10-18"
      },
      {
        "id": "philter-repo",
        "title": "Philter UCSF README",
        "publisher": "UCSF / BCHSI",
        "url": "https://github.com/BCHSI/philter-ucsf",
        "sourceType": "official",
        "accessedAt": "2026-10-18"
      },
      {
        "id": "opf-community-eval",
        "title": "GLiNER large-v2.1 vs Privacy Filter case study",
        "publisher": "Gaurav Vij / GitHub",
        "url": "https://github.com/gauravvij/pii-filter-model-eval",
        "sourceType": "community",
        "accessedAt": "2026-10-18"
      },
      {
        "id": "philter-paper",
        "title": "A certified de-identification system for all clinical text documents",
        "publisher": "UCSF authors / JAMIA Open",
        "url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC10320112/",
        "sourceType": "review",
        "accessedAt": "2026-10-18"
      }
    ],
    "claims": [
      {
        "id": "research-scrubadub-text-redaction-scrubadub-workflow",
        "claim": "Replace personally identifiable spans in free text.",
        "sourceId": "scrubadub-docs",
        "evidenceType": "official",
        "confidence": "high",
        "caveat": "Source-qualified product description; no independent performance test was run.",
        "guideLocation": "Workflow: replace personally identifiable spans in free text.",
        "sectionId": "workflow"
      },
      {
        "id": "research-scrubadub-text-redaction-scrubadub-deployment",
        "claim": "Python package invoked inside local scripts.",
        "sourceId": "scrubadub-docs",
        "evidenceType": "official",
        "confidence": "high",
        "caveat": "Source-qualified product description; no independent performance test was run.",
        "guideLocation": "Start by confirming deployment and the data path.",
        "sectionId": "setup"
      },
      {
        "id": "research-scrubadub-text-redaction-scrubadub-input",
        "claim": "Free-text strings.",
        "sourceId": "scrubadub-docs",
        "evidenceType": "official",
        "confidence": "high",
        "caveat": "Source-qualified product description; no independent performance test was run.",
        "guideLocation": "Start by confirming deployment and the data path.",
        "sectionId": "setup"
      },
      {
        "id": "research-scrubadub-text-redaction-scrubadub-entryCost",
        "claim": "Apache-2.0 software; dependency and operation costs separate.",
        "sourceId": "scrubadub-repo",
        "evidenceType": "official",
        "confidence": "high",
        "caveat": "Observed source wording; regional pricing, billing cadence, and future plan changes are not inferred.",
        "guideLocation": "Choose scrubadub when its documented boundary matches the job.",
        "sectionId": "decision"
      },
      {
        "id": "research-scrubadub-text-redaction-scrubadub-method",
        "claim": "Detectors identify spans; postprocessors control replacement.",
        "sourceId": "scrubadub-docs",
        "evidenceType": "official",
        "confidence": "high",
        "caveat": "Source-qualified product description; no independent performance test was run.",
        "guideLocation": "Workflow: replace personally identifiable spans in free text.",
        "sectionId": "workflow"
      },
      {
        "id": "research-scrubadub-text-redaction-scrubadub-customization",
        "claim": "Optional address, spaCy and Stanford detector packages; locale configuration.",
        "sourceId": "scrubadub-docs",
        "evidenceType": "official",
        "confidence": "high",
        "caveat": "Source-qualified product description; no independent performance test was run.",
        "guideLocation": "Workflow: replace personally identifiable spans in free text.",
        "sectionId": "workflow"
      },
      {
        "id": "research-scrubadub-text-redaction-scrubadub-limitation",
        "claim": "Extra detector dependencies are needed for some entity types.",
        "sourceId": "scrubadub-docs",
        "evidenceType": "official",
        "confidence": "high",
        "caveat": "Source-described boundary; no comparative failure-rate test was performed.",
        "guideLocation": "Keep the source boundary visible while you decide.",
        "sectionId": "caveats"
      }
    ],
    "relatedGuides": [
      {
        "slug": "openai-privacy-filter",
        "role": "alternative",
        "rank": 1,
        "reason": "The existing locally runnable model/CLI baseline for contextual text redaction."
      },
      {
        "slug": "presidio-text-redaction",
        "role": "alternative",
        "rank": 2,
        "reason": "A local integration toolkit when the evaluator needs configurable recognizers and multiple replacement operators."
      },
      {
        "slug": "limina-local-redaction",
        "role": "alternative",
        "rank": 4,
        "reason": "The commercial local-deployment option for organizations that want vendor-supported de-identification."
      },
      {
        "slug": "philter-ucsf",
        "role": "alternative",
        "rank": 5,
        "reason": "Eligible for the clinical-note subset of local text de-identification; a specialized alternative, not a general-language drop-in."
      }
    ],
    "comparison": {
      "title": "Locally deployable text redaction alternatives",
      "intro": "This table keeps scrubadub-text-redaction beside four listed alternatives using source-qualified workflow, platform, processing, cost, control, and limitation notes. It is an editorial fit map, not a performance test or market ranking.",
      "alternatives": [
        "openai-privacy-filter",
        "presidio-text-redaction",
        "limina-local-redaction",
        "philter-ucsf"
      ],
      "includeCurrent": true,
      "dimensions": [
        {
          "id": "workflow",
          "label": "workflow",
          "values": {
            "openai-privacy-filter": "Model-based text redaction with a local CLI and Python API.",
            "presidio-text-redaction": "PII identification followed by configurable anonymization.",
            "scrubadub-text-redaction": "Replace personally identifiable spans in free text.",
            "limina-local-redaction": "Detect and de-identify sensitive data; this comparison covers text.",
            "philter-ucsf": "Remove protected health information from clinical plain text."
          }
        },
        {
          "id": "deployment",
          "label": "deployment",
          "values": {
            "openai-privacy-filter": "Local CPU or GPU; checkpoints downloaded if absent.",
            "presidio-text-redaction": "Python module or self-hosted HTTP service/container.",
            "scrubadub-text-redaction": "Python package invoked inside local scripts.",
            "limina-local-redaction": "Container in customer on-premises environment or VPC.",
            "philter-ucsf": "Local Python command-line package."
          }
        },
        {
          "id": "input",
          "label": "input",
          "values": {
            "openai-privacy-filter": "Text strings, files and pipes.",
            "presidio-text-redaction": "Text and detected entity spans.",
            "scrubadub-text-redaction": "Free-text strings.",
            "limina-local-redaction": "Text; product also supports documents, images and audio.",
            "philter-ucsf": "Plain-text file or directory of clinical notes."
          }
        },
        {
          "id": "entry-cost",
          "label": "entry cost",
          "values": {
            "openai-privacy-filter": "Open repository; compute and operational costs remain.",
            "presidio-text-redaction": "Open-source deployment; self-hosting/integration cost separate.",
            "scrubadub-text-redaction": "Apache-2.0 software; dependency and operation costs separate.",
            "limina-local-redaction": "Enterprise custom pricing; free hosted Starter is not the local-deployment price.",
            "philter-ucsf": "BSD-3-Clause software; integration and compute separate."
          }
        },
        {
          "id": "method",
          "label": "method",
          "values": {
            "openai-privacy-filter": "Token classification with span decoding.",
            "presidio-text-redaction": "Analyzer plus separate anonymizer operators.",
            "scrubadub-text-redaction": "Detectors identify spans; postprocessors control replacement.",
            "limina-local-redaction": "Commercial entity detection and de-identification engine.",
            "philter-ucsf": "Configurable filtering pipeline with optional evaluation annotations."
          }
        },
        {
          "id": "customization",
          "label": "customization",
          "values": {
            "openai-privacy-filter": "Runtime precision/recall presets, evaluation and fine-tuning commands.",
            "presidio-text-redaction": "Replace, mask, redact or encrypt; reversible operators need corresponding metadata and keys.",
            "scrubadub-text-redaction": "Optional address, spaCy and Stanford detector packages; locale configuration.",
            "limina-local-redaction": "Enterprise model-version pinning and guided integration/tuning.",
            "philter-ucsf": "Filter configuration and input/output paths."
          }
        },
        {
          "id": "limitation",
          "label": "limitation",
          "values": {
            "openai-privacy-filter": "Validate detection on the target corpus; community scores change with matching criteria.",
            "presidio-text-redaction": "Anonymizer acts on supplied detections; missing detections are not repaired by replacement.",
            "scrubadub-text-redaction": "Extra detector dependencies are needed for some entity types.",
            "limina-local-redaction": "Local availability and commercial terms require vendor agreement.",
            "philter-ucsf": "Clinical-domain focus; general chat/email quality is not established."
          }
        }
      ]
    },
    "revisions": [
      {
        "version": "2026-10-18.1",
        "date": "2026-10-18",
        "note": "Initial dedicated guide from the 2026-10-18 cited sources."
      }
    ]
  },
  "publicUrl": "https://fieldguides.co/g/scrubadub-text-redaction"
}