A chat web app that checks whether a software product could be certified with the
Blauer Engel für Software (DE-UZ 215). You enter a product URL; a Claude agent (the Claude Code harness via the
Claude Agent SDK) crawls the product site, privacy policy,
support pages and source repositories, searches the web, and rates every criterion in criteria.txt as
Verified, Maybe or Not possible, with comments, evidence and open questions. The agent's
work (thinking summaries, text, page fetches, searches) is streamed live into the chat.
After the report you can answer the open questions in the chat; the agent resumes the same session and re-issues the assessment.
By design, for data privacy reasons:
- A report cannot be shared via URL. Nothing in the URL identifies a session or report.
- The server offers no way to keep or restore a report. There is no endpoint that returns a past session.
- The report (log, report, session id) is kept only in the user's own browser (
localStorage), so it survives a page reload or browser restart. It is deleted when the user clicks "Neue Prüfung". - The only way to save or share a report is printing it as PDF. Once a report is ready, the page shows a large
"Bericht als PDF speichern" button that opens the print dialog. A print stylesheet in
frontend/app.cssexpands all criteria and hides the chat controls.
Note: the Claude Agent SDK writes session transcripts to ~/.claude/projects/<encoded AGENT_CWD>/ on the server so
follow-up questions can resume a session. The app never serves them back to anyone, and Claude Code deletes them
after cleanupPeriodDays.
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt- Claude subscription (default, local use only): leave
ANTHROPIC_API_KEYunset. The bundled Claude Code CLI uses the existingclaudelogin of your OS user (claude auth statusmust showloggedIn: true). Runs count against your Pro/Max limits. Anthropic does not allow offering claude.ai login to third parties, so in this mode the server only binds to127.0.0.1and runs one assessment at a time. - API key: set
ANTHROPIC_API_KEY. Required as soon as other people use the app.
.venv/bin/uvicorn backend.app:app --host 127.0.0.1 --port 8000Open http://127.0.0.1:8000. Configuration via environment variables, see .env.example
(MODEL, EFFORT, MAX_TURNS).
| File | Purpose |
|---|---|
backend/criteria.py |
Parses criteria.txt (sections A-D, criteria 1-21) |
backend/prompts.py |
System prompt: research strategy and rating rules |
backend/schema.py |
Pydantic model of the report, passed as JSON schema to the SDK's output_format |
backend/tools.py |
fetch_page tool: browser user agent (many sites block bots, e.g. ecosia.org returns 403), HTML to text + links, SSRF protection |
backend/agent.py |
Runs claude_agent_sdk.query() and maps SDK messages to UI events |
backend/app.py |
FastAPI: POST /api/assess, POST /api/chat stream Server-Sent Events |
frontend/ |
Fomantic UI + vanilla JS chat, reads the SSE stream with fetch() |
The agent can only use fetch_page and WebSearch: no shell, no file access, no subagents. It runs in an empty
working directory and loads no local Claude Code settings.