Skip to content
GitHubOpen source
Product
Docs
Solutions
IndustriesAll industries
CompareCompare all AI data-leak tools
Benchmarks
GitHubApache-2.0

AI data protection for mid-market companies: roll out PII masking with your MDM

At a few hundred people, AI use is everywhere and inconsistent: some teams have approved tools, some have API keys, and a few internal apps call models directly. Shadow fits this stage as a per-device background service pushed with your MDM, plus a gateway or sidecar for internal apps, all driven by one versioned shadow.toml. There is no central console, so plan to use the device and configuration management you already have.

PriorityWhat it means
ConsistencyEvery laptop protects the same customer names, domains and codenames
Low-touch rolloutPushed by IT, not installed by hand
Internal appsA few services call models with production customer data
Proportionate evidenceEnough to answer customers, auditors and the board, without a project team
Mixed fleetmacOS, Windows and some Linux
ComponentDeploymentNotes
LaptopsMDM script per user: install, config, shadow install --applyProxy mode covers API-based assistants and scripts
Internal apps on VMsSystem-wide systemd unit with a dedicated User=, gateway URLsSee Installation
Internal apps in containersSidecar per app on localhostSee Docker and Kubernetes
Extra recall where neededPresidio or the NER sidecar on the same host or podKeep it on loopback: it receives plaintext
ConfigurationOne shadow.toml in git, pushed by MDM and deployment pipelinesReview changes like code

Release binaries are on the roadmap. Until they exist for your platforms, build in CI from a pinned commit and host the binaries in your software distribution system, so laptops do not need a Rust toolchain:

Terminal window
cargo build --release -p shadow-cli
organization = ["Acme Holdings Ltd", "Acme Services GmbH"]
terms = ["org:Globex", "org:Initech", "Project Falcon", "Nightjar"]
internal_domains = ["acme.example", "acme.internal", "corp.acme.example"]
allow_domains = ["docs.acme-public.example"]
[policy.always]
secret = "redact"
[files]
pdf = "text"
images = "block"

The service and CA trust are per user (LaunchAgent and login keychain on macOS, systemd user unit on Linux, a Scheduled Task and the user certificate store on Windows), so run the setup in the user’s context:

#!/bin/sh
# macOS example, run as the signed-in user
DATA="$HOME/Library/Application Support/shadow"
mkdir -p "$DATA" "$HOME/.local/bin"
install -m 0755 /Library/Acme/shadow/shadow "$HOME/.local/bin/shadow"
cp /Library/Acme/shadow/shadow.toml "$DATA/shadow.toml"
"$HOME/.local/bin/shadow" init --org "Acme Holdings Ltd"
"$HOME/.local/bin/shadow" install --apply

Adding a certificate to the login keychain may ask the user to confirm. Test the script on each OS in your pilot group, and add source "<data dir>/env.sh" to the managed shell profile so terminal tools use the proxy.

Terminal window
shadow status --quiet && echo ok || echo "shadow not running"

Use it as an MDM compliance or custom attribute script.

Point each app’s model client at Shadow and nothing else changes:

Terminal window
OPENAI_BASE_URL=http://127.0.0.1:8877/gw/openai/v1 ./support-assistant

For Azure OpenAI or an internal model server, add routes:

[proxy.routes]
azure = "https://acme-prod.openai.azure.com"
llm = "https://llm.acme.internal"

If an app runs agents, decide how provider-hosted tools are treated ([policy.act] remote_tool_targets) and read Tool calls and agents.

PhaseScopeExit criteria
Pilot10–20 users across OSes, one internal appNo connectivity issues for a week; shadow scan reviewed on real samples
TuneAdd missed terms, decide on Presidio for teams with free-text namesTerms list agreed with data owners
ExpandDepartment by department via MDMHealth check passing on target devices
Steady stateConfig changes through review; quarterly scan of samplesOwner named for shadow.toml
  • Inventory AI tools and which provider APIs they call
  • Choose approved, API-based tools for each team
  • Build binaries from a pinned commit; host them internally
  • Agree the managed shadow.toml with security and data owners
  • Pilot on macOS, Windows and Linux; check certificate-pinning apps
  • Put internal apps behind a gateway or sidecar
  • Add shadow status --quiet to MDM health checks
  • Document the control in your AI policy and risk register

Frequently asked questions

Can we deploy Shadow with Intune, Jamf or another MDM?

Yes, with a script. Shadow has no MDM-specific package yet: the script installs the binary, writes the managed shadow.toml into the user's data directory, and runs shadow init and shadow install --apply as the signed-in user, because the service and CA trust are per user.

Can IT change the policy centrally?

Only by redistributing the configuration file. There is no admin console or policy server. Treat shadow.toml like any other managed configuration: version it, review changes and push it with your MDM or configuration management.

How do we know Shadow is running on every laptop?

Use shadow status --quiet in an MDM compliance or health script: it exits 0 when the proxy answers and 1 otherwise. There is no central fleet view.

Should internal AI apps use the same setup as laptops?

No. Servers and containers should use gateway mode: run Shadow as a systemd service or sidecar and set the app's base URL. No CA is needed and the data path is explicit.

Can all laptops share one persona and vault?

Not as a managed feature yet; shared team identities are on the roadmap. Each laptop generates its own persona, which is fine for privacy. You can copy persona.json, vault.bin and vault.key between machines if you need consistent fakes.