New: Philter One, a redaction box for your office, is coming soon. Learn more →

Contact Us

Tell us about your stack and the privacy problems you're trying to solve. We typically respond within one business day.

Prefer email? support@philterd.ai

Please do not enter PII or PHI in this form. If you need to share an example, use a sanitized one.

PII drift and trend monitoring

Phield

Phield receives PII type counts via an API or Kafka topic and alerts when a count rises significantly above the established trend. Get notified through PagerDuty or Slack when a count rises well above its baseline, such as a sudden spike in credit card numbers.

View on GitHub

Run it with Docker

Phield ships as a multi-arch image (x86-64 and arm64) on Docker Hub at philterd/phield. It keeps its history in a MongoDB time-series collection, so bring both up together with Compose.

# 1. Save this as docker-compose.yaml
services:
  mongodb:
    image: mongo:8.2.12
    volumes:
      - mongodb_data:/data/db
    healthcheck:
      test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
      interval: 10s
      timeout: 5s
      retries: 5

  phield:
    image: philterd/phield:latest
    ports:
      - "8443:8443"
    environment:
      PHIELD_MONGO_URI: mongodb://mongodb:27017/phield
      PHIELD_TREND_METHOD: percentage_delta
      PHIELD_ALERT_THRESHOLD: "0.2"
      PHIELD_WINDOW_SIZE: "24"
    depends_on:
      mongodb:
        condition: service_healthy

volumes:
  mongodb_data:

# 2. Bring up Phield and MongoDB
docker compose up -d

# 3. Send a set of counts. The -k is there because the container
#    generates its own self-signed certificate when it starts.
curl -k -X POST https://localhost:8443/ingest \
  -H "Content-Type: application/json" \
  -d '{
    "source_id":    "patient-records-api",
    "organization": "acme-health",
    "context":      "production",
    "pii_types": { "credit-card": 25, "email": 110, "ssn": 4, "name": 60 }
  }'

# 4. Watch the trends build at https://localhost:8443/dashboard

The container serves HTTPS on port 8443 and generates a self-signed certificate at start, so browsers and clients warn about it until you mount a certificate of your own through PHIELD_CERT_FILE and PHIELD_KEY_FILE. Leave PHIELD_MONGO_URI unset and Phield falls back to in-memory storage, which is fine for a look around but loses its history on restart. Every setting is covered in the documentation.

Why Phield

Drift and trend detection

Phield builds a baseline from the PII type counts it receives and flags when a new sample rises significantly above the established trend. A sudden spike in credit card numbers raises an alert. Phield alerts on increases only; a count that falls below its baseline does not alert.

Flexible ingestion

Send PII type counts to Phield over its HTTP API or publish them to a Kafka topic. Either way, the payload shape is the same: a timestamped map of entity types to counts, tagged with a source and context.

MongoDB time-series or in-memory

Phield stores samples in a MongoDB time-series collection for durable, queryable history. When MongoDB is not available, it falls back to in-memory storage so you can still run it without external dependencies.

PagerDuty and Slack alerts

When a count rises above its trend, Phield sends alerts to PagerDuty, Slack, or both. Your on-call team gets paged with the source, the entity type, the observed count, the baseline, and the size of the increase.

Per-source, per-entity tracking

Counts are tracked per source, per context, and per entity type. You can monitor multiple pipelines independently and see exactly which entity type drifted in which system.

Self-hosted

Runs entirely inside your perimeter. No SaaS dashboard, no external data shipping. Your PII telemetry stays where you put it.

Sending PII counts to Phield

Phield receives PII type counts over its HTTP API or from a Kafka topic, stores them in a MongoDB time-series collection (or in memory), and runs the configured baseline detector against each new sample. Send the same payload shape either way.

These examples post to a deployed Phield at https://phield.internal:8443/ingest. Against a container you just started locally, use https://localhost:8443/ingest and skip certificate verification while it is still on its generated self-signed certificate. Each source, organization, context, and entity type is tracked as its own series with its own baseline, so counts reported from different points in a pipeline, such as before and after redaction, are monitored separately.

curl -X POST https://phield.internal:8443/ingest \
  -H "Content-Type: application/json" \
  -d '{
    "timestamp":    "2026-05-23T18:00:00Z",
    "source_id":    "patient-records-api",
    "organization": "acme-health",
    "context":      "production",
    "pii_types": {
      "credit-card": 25,
      "email":       110,
      "ssn":         4,
      "name":        60
    }
  }'

Install: pip install requests

import requests
from datetime import datetime, timezone

requests.post(
    "https://phield.internal:8443/ingest",
    json={
        "timestamp":    datetime.now(timezone.utc).isoformat(),
        "source_id":    "patient-records-api",
        "organization": "acme-health",
        "context":      "production",
        "pii_types": {
            "credit-card": 25,
            "email":       110,
            "ssn":         4,
            "name":        60,
        },
    },
)
package main

import (
    "bytes"
    "encoding/json"
    "net/http"
    "time"
)

func main() {
    payload, _ := json.Marshal(map[string]interface{}{
        "timestamp":    time.Now().UTC().Format(time.RFC3339),
        "source_id":    "patient-records-api",
        "organization": "acme-health",
        "context":      "production",
        "pii_types": map[string]int{
            "credit-card": 25,
            "email":       110,
            "ssn":         4,
            "name":        60,
        },
    })
    http.Post("https://phield.internal:8443/ingest", "application/json", bytes.NewReader(payload))
}

Frequently asked questions

If something here isn’t covered, get in touch and we’ll answer.

What is Phield?
Phield is a PII drift and trend monitor. It receives counts of PII entity types over time, stores them as a time series, builds a baseline, and alerts when a new count rises significantly above the established trend. A sudden spike in credit card numbers raises an alert. Phield alerts on increases only; a count that falls below its baseline does not alert.
What data does Phield need? Does it see the actual PII?
No. Phield only ingests counts: a timestamped map of entity types to numbers, tagged with a source and context. It never receives the underlying documents or the sensitive values themselves. You get monitoring and alerting on your redaction pipeline without centralizing any of the PII the pipeline is meant to protect.
How does Phield decide that a count is anomalous?
Phield builds a baseline from the history of counts it has received for each source, context, and entity type, then compares every new sample against that established trend. When a sample rises above it by more than the configured threshold (a percentage increase over the average, or a z-score), Phield raises an alert with the source, entity type, observed count, baseline, and size of the increase. Counts that fall below the baseline do not alert.
How do I get counts into Phield?
Two ways, with the same payload shape: POST them to Phield's HTTP API, or publish them to a Kafka topic. Each source, organization, context, and entity type is tracked as its own series with its own baseline, so counts reported from different points in a pipeline, such as before and after redaction, are monitored separately.
Where does Phield store data, and how does it alert?
Phield stores samples in a MongoDB time-series collection for durable, queryable history, and falls back to in-memory storage when MongoDB isn't available so you can run it with no external dependencies. When a count rises above its trend, it sends alerts to PagerDuty, Slack, or both.
Is Phield open source?
Yes. Phield is open source under the permissive Apache License, version 2, and the code is on GitHub. It is self-hosted: it runs entirely inside your perimeter with no SaaS dashboard and no external data shipping.

Ready to use Phield?

Three ways to get going: deploy the open source yourself, spin it up from a cloud marketplace, or work with our team directly. Pick the path that fits.

See your options