friskme

What is sent where

Unless you pass --no-llm, friskme runs one analyzer CLI: claude -p (calls go to Anthropic under your own Claude login), codex exec (calls go to OpenAI under your own Codex login) or pi -p (calls go to the provider of the model pi uses, under your own pi login for that provider). Any analyzer labels sessions from every agent, so with --analyzer codex your Claude Code and Pi cards go to OpenAI, and with claude your Codex and Pi cards go to Anthropic. Nothing goes anywhere else: no telemetry, and no FriskAI endpoint.

friskme shows you the planned number of calls and asks before making any. It makes three kinds of call:

  1. Labeling: batches of up to 30 session cards. A card holds:

    • the first prompt you typed, cut to 600 characters
    • up to 5 follow-ups, 200 characters each
    • the project folder’s name (not its path)
    • tool names with coarse details (Bash:git, Edit:ts, exec_command:package_manager, apply_patch:ts, bash:git, edit:ts, mcp:github)
    • error and interrupt counts

    It never includes tool output, file contents, command lines or session ids.

  2. Grouping: only the short labels from step 1 and their counts.

  3. Skill drafting: 3 to 5 of the same cards, for each repeated workflow.

Before a card is cached or sent, friskme redacts everything the sensitive-data scan finds (secrets and personal data, see below), plus bearer tokens, .env-style *_KEY=/*_SECRET=/*_PASSWORD= lines and long random strings. The report’s “Method and caveats” section lists how many of each it redacted.

Every claude -p call runs isolated:

claude -p --no-session-persistence --safe-mode --strict-mcp-config \
  --tools "" --disallowedTools "mcp__*" --max-turns 1 \
  --system-prompt <friskme's> --output-format json --json-schema <schema> --model haiku

It runs from an empty temp directory, with the prompt on stdin. These flags mean:

  • No transcripts left behind: friskme’s calls don’t add sessions to the folder it reads.
  • Nothing to act with: the model has no tools, so it cannot act on anything written in your transcripts.
  • No customizations: your hooks, CLAUDE.md, plugins and MCP servers are not loaded.

--bare is not used because it does not work with subscription login.

Every codex exec call runs as isolated as Codex allows:

codex exec --ephemeral --ignore-user-config --ignore-rules --skip-git-repo-check \
  --sandbox read-only --color never --cd <empty temp dir> \
  -c approval_policy="never" -c web_search="disabled" -c project_doc_max_bytes=0 \
  -c history.persistence="none" -c features.shell_tool=false -c features.multi_agent=false \
  -c features.apps=false -c features.view_image=false -c features.memories=false \
  --output-schema <schema file> --output-last-message <answer file> [--model <name>] -
  • No rollouts left behind: --ephemeral writes no session to the folder friskme reads, and history is off.
  • Nothing to act with: web search, the shell tool, subagents, apps and image viewing are off. Codex has no switch that removes every built-in tool, so a read-only sandbox, no approvals and an empty working folder back that up.
  • No customizations: your config.toml (MCP servers, plugins, profiles), execpolicy rules and AGENTS.md are not loaded. Your login still is.
  • codex exec has no system-prompt flag, so friskme’s instructions go at the top of the prompt on stdin. The schema and answer files are written to a separate temp folder and deleted after each call.
  • codex exec does not report cost, so the report says friskme’s own calls are unpriced.

Every pi -p call runs isolated:

PI_TELEMETRY=0 PI_OFFLINE=1 pi --print --mode json --no-session --no-tools \
  --no-extensions --no-mcp --no-skills --no-prompt-templates --no-themes \
  --no-context-files --no-approve --offline \
  --system-prompt <friskme's> --thinking off [--model <name>]

It runs from an empty temp directory, with the prompt on stdin. These flags mean:

  • No sessions left behind: --no-session keeps the session in memory, so nothing lands in the folder friskme reads.
  • Nothing to act with: --no-tools turns off every built-in, extension and MCP tool.
  • No customizations: your extensions, MCP servers, skills, prompt templates and AGENTS.md/CLAUDE.md are not loaded, and trust-gated project files are ignored. Your provider login still is.
  • Only the model call goes out: --offline and PI_TELEMETRY=0 turn off pi’s model-catalog refresh, version check and install telemetry.
  • Thinking off: labeling doesn’t need it. Name a level in the model (--model sonnet:low) to keep one.
  • pi has no structured-output flag, so the JSON schema goes at the end of the prompt, and friskme checks every answer against it, retrying once.
  • pi reports what each call cost, so the report prices friskme’s own calls.
  • Before the first call, friskme runs pi auth check for the provider in --model (provider/id), or else for the defaultProvider in pi’s settings.json. That one field is all friskme reads from pi’s config.

A typical month (about 50 sessions) takes 3 to 7 calls, a few cents on Haiku at API list price.