Setup
Get your environment running
Two independent ways to run the same scenario. Both were run end-to-end against this exact data before this guide was written, not just described.
Option A — Docker (recommended, same pattern as every other workshop here)
A Dockerfile bakes in Python, Presidio plus the en_core_web_sm
spaCy model, Claude Code, and the skill set at build time — no live installs over
docker exec, same approach as the other workshops' containers. Rebuilt nightly
and published to GHCR, so a live session pulls it instead of building locally.
Prerequisites
- Docker (no local build needed —
docker pullfetches the pre-built image from GHCR). - A
.envfile in thedashcam/folder (copied fromcasky-box/.env, quotes stripped):cp ../casky-box/.env dashcam/.env sed -i.bak -E 's/^([A-Z_][A-Z0-9_]*)="(.*)"$/\1=\2/' dashcam/.env && rm dashcam/.env.bak
Steps
# Run every command below from THIS folder (casky-workshops/dashcam/).
# 0. Pull the pre-built image from GHCR (rebuilt nightly with the latest patches) instead
# of building locally — much faster at a live session.
docker pull ghcr.io/casky-ai/casky-dashcam:latest
docker tag ghcr.io/casky-ai/casky-dashcam:latest casky-dashcam
# Fallback, kept for reference — Python, Presidio, spaCy's small model, Claude Code, and
# the 3 skills are still baked into the image at build time (see Dockerfile); rebuild
# locally if you're iterating on the Dockerfile/skill list itself, or if GHCR is
# unreachable:
# docker build -t casky-dashcam .
docker run -d --name casky-dashcam \
--env-file .env \
-v "$(pwd)":/root/dashcam \
casky-dashcam
docker exec casky-dashcam test -f /root/dashcam/verify.sh \
&& echo "[+] mount OK" || echo "[!] wrong directory"
# 1. Run ./verify.sh — expect 10/10 PASS.
docker exec -w /root/dashcam casky-dashcam ./verify.sh
# 2. Bash into the container and start Claude Code interactively.
docker exec -it -w /root/dashcam casky-dashcam bash
# ...now inside the container's shell:
export PATH="$HOME/.local/bin:$PATH"
./start.sh
claude
Option B — local Python, no Docker
For a quick laptop-only run without building an image:
# Run every command below from THIS folder (casky-workshops/dashcam/).
# 1. Python environment + Presidio
python3 -m venv .venv && source .venv/bin/activate
pip install presidio-analyzer presidio-anonymizer presidio-image-redactor
python -m spacy download en_core_web_sm # small model — plenty for this lab
# sanity check
python -c "from presidio_analyzer import AnalyzerEngine; \
a = AnalyzerEngine(); \
print(a.analyze(text='Call John Smith at 212-555-0100', language='en'))"
# 2. Mount the skill library for the agent
chmod +x setup-skills.sh verify.sh reset.sh start.sh cleanup.sh
./setup-skills.sh
# 3. Run ./verify.sh — expect 10/10 PASS.
./verify.sh
# 4. Start Claude Code from this folder (needs Claude Code installed separately —
# curl -fsSL https://claude.ai/install.sh | bash — Option A bakes it in instead).
./start.sh
claude
Point the analyzer at it explicitly (the small model doesn't self-select) — Option A's image already has this patched at build time, so this only matters for Option B:
from presidio_analyzer.nlp_engine import NlpEngineProvider
provider = NlpEngineProvider(nlp_configuration={
"nlp_engine_name": "spacy",
"models": [{"lang_code": "en", "model_name": "en_core_web_sm"}],
})
analyzer = AnalyzerEngine(nlp_engine=provider.create_engine())
Then open the Scenario page and hand the agent the prompt for Phase 1.
Authorized & lawful use only. All data is synthetic and self-contained. Built from mukul975/Anthropic-Cybersecurity-Skills#141 — "Add skill: anonymizing-pii-with-microsoft-presidio." Not yet merged upstream; this workshop vendors the skill locally and should switch to the upstream clone once the PR lands.