Skip to content

Security: BryceEWatson/honestweek

SECURITY.md

Security and privacy

honestweek runs on your own machine and reads private data: your AI coding session logs and your git history. This page says what it reads, writes and runs, what counts as a security problem, and how to report one privately.

What honestweek touches

  • It reads session logs from Claude Code (~/.claude/projects, or $CLAUDE_CONFIG_DIR/projects when you set that) and Codex ($CODEX_HOME/sessions and $CODEX_HOME/archived_sessions, with ~/.codex as the default home). The mine command can also read Claude desktop's Cowork logs (under %APPDATA%\Claude). waiting reads the Claude desktop app's own session files (in %APPDATA%\Claude\claude-code-sessions on Windows) for three fields only: which log each one names, its sidebar title and whether you archived it.
  • It runs git against the repositories you list in your config. A few setup steps look a little further: init, and Setup and Settings (its Find new repositories button) in view, check the folder you run them in and the folders next to it for repositories with your commits, to suggest what to list, and discover and Settings check whether the draft file or the config is tracked in the folder you run them in. Those scans never ask git about the commits in a repository that holds a folder your config marks display-only, or sits inside one, since git reading it would read that folder's history too. Where that keeps discover or Settings from checking whether the draft or the config is committed, they say so and give the two commands to check by hand.
  • Its git never fetches and never starts a program a repository's own config names. A repository's .git/config isn't mine to trust, least of all in the folders next to yours that setup looks at, so every git honestweek runs turns off, on its own command line, every way of reaching another machine, signature checks, hooks and the file-system monitor, and asks git never to fetch a missing object or wait on a prompt. It drops the GIT_ variables it inherits, such as GIT_DIR, except the three that say where your own global and system git config files are, so nothing in your environment points it at another repository. A git that runs longer than a minute is stopped, and in what honestweek reports, one it can't read, or whose output is too large, counts as unreadable, never as a repository with no commits. A commit id from a session log or a summary reaches git only when it's a commit id (4 to 64 hex digits); anything else counts as not found, so build aborts.
  • It never runs git against a repository you mark display-only, and it summarizes display-only work generically. A config that would let git read a display-only folder is refused when it loads, wherever it came from: one that lists the same repository as display-only and as one git reads (the same folder twice, or a worktree of it), a display-only folder and a repository git reads that sit one inside the other, or a display-only folder holding a worktree of a repository git reads.
  • Weekly reports use sessions from your listed repositories. A session anywhere else is private to the report: its text never becomes a report item. mine works differently: it looks for solved problems across every session in the logs it reads, because a problem worth writing up can come from any project. It reports what it found and writes a draft only when you run it with --draft.
  • It writes local files only, and every string passes through its redactor (a pattern-based scrubber for secrets, personal paths and terms you list) before it's written. The exception is your config, which holds the private words you list as you typed them. One of those files is meant to be committed: mine keeps its findings ledger in honestweek.findings.json on every run, de-identified and redacted, as the record of what you've already accepted or declined.
  • It makes no network calls. No telemetry, no fetch. Three things you start do send session text to an AI. One is a choice you make on view's Problems page: with Include /insights turned on, Run /insights starts your own claude -p /insights and Run with Codex starts your own codex, each only after you confirm. The server refuses both while the switch is off, and each program gets only the environment variables it needs to start and sign in, not your other tokens. Those programs send your sessions to Claude or OpenAI on your own plan, and Codex runs in its read-only sandbox, which still lets it read files you can read. honestweek itself still sends nothing. The second is the weekly summary: /honestweek has Claude run honestweek in your own Claude Code session, so Claude reads the redacted draft (honestweek.draft.json) to write the summary and sees what each command prints. Run as the skill in Codex, Codex reads the same and sends it to OpenAI, or the endpoint your Codex is set to use, in Claude's place. The third is the find skill: when Claude or Codex runs find, replay, problems, goals or waiting for you, it reads what they print, redacted the way the page shows it with Show private text off, and in Codex that text goes to OpenAI instead. Where your data goes walks through each. Two commands start a local server, and both bind to 127.0.0.1, so only your own machine can reach them: preview, which shows your built output, and view, a page for finding and replaying your sessions. Both refuse a request that names another host. preview has no key, by design, so any program or account on your machine can read the built report while it runs. The report is redacted, and preview stops on its own after 30 minutes with no visits; on a shared machine, stop it sooner when you're done. view also refuses any data request that comes from another website (its page files hold no data), and answers data requests only from a page that holds this run's key: each run makes a fresh key, and the address it opens or prints carries a one-time code the page trades for that key. A printed address's code stops working after 15 minutes, and the one it opens your browser with after two. A new tab opened from view's own pages gets the key from this run's other open tabs. A page your browser says another website opened never asks them, so it gets the key only from a code in its own address. The data stays out of that website's reach either way, since your browser keeps one site from reading another's pages.
  • You control what view keeps. It reads your logs into memory to answer the page and keeps only what you choose to save. What it does write: Setup writes honestweek.config.json (and honestweek.config.example.json if it's missing) when you press Save, Settings rewrites the config when you press Save, and the Include /insights switch saves its on or off in the config. Setup also adds the config and honestweek's private working files to that folder's .gitignore, and Settings adds the config there whenever it saves. Run with Codex keeps Codex's answers, redacted again, in honestweek.codex-judgments/ beside your config, a folder that ignores itself and gets a line in that folder's .gitignore. With Save results between runs on in Settings, it keeps the Problems checks' results and, unless you turn it off, each day's history, redacted, in honestweek.saved/ beside your config: owner-only on Linux and macOS, ignoring itself, with a line in that folder's .gitignore, and deleted whole by Forget saved results. To open your browser without putting the one-time code in a command line, view writes a small redirect file to your temporary folder and deletes it within two minutes. Its Show private text switch shows names and folders on your own screen, never secrets, and that version is built in memory only when you turn the switch on. view --demo writes a made-up week to a temporary folder and deletes it when you stop; when it starts, it also removes its own leftover demo folders older than a day whose run has stopped.
  • Its private files stay yours. On Linux and macOS, the private files it creates (its working stores, the session draft, the harvest word list, the config and the saved results in honestweek.saved/) are readable only by you, and when it rewrites a file (a store, or the config when Settings saves it) it keeps the permissions you've set. Output files you'll publish, mine's post drafts, the example config and a new .gitignore get your system's usual permissions.
  • It never publishes anything. You decide what leaves your machine.

What counts as a security problem

Please report privately if you find any way honestweek could:

  • send any data off your machine, other than through Run /insights or Run with Codex after you confirm, or through the weekly summary, where Claude reads the redacted draft and what each command prints in your own Claude Code session (or Codex does, in your own Codex session, when you run the skill there), or through the find skill, where Claude or Codex reads what find, replay, problems, goals and waiting print;
  • write an unredacted secret, or text it was told to redact, into an output file;
  • run git against a display-only repository, or against a repository outside your list other than the setup checks above;
  • make its git fetch anything, or start a program a repository's config or a session log names;
  • let the preview server answer anyone other than your own machine or a request that names another host, or serve a file outside its output folder;
  • let the view server answer another website, another host name, or a request without the run's key, hand the key to a page another website opened, show what a local file holds in an error message, show a secret with Show private text on, show a private word with it off, or keep anything on disk you didn't choose to save (today, that's the config, the example config Setup writes if it's missing, the .gitignore lines, Run with Codex's redacted answers and, with Save results between runs on, honestweek.saved/), or leave its redirect file or --demo's made-up week behind past the times given above;
  • run a command built from text inside a session log, or run claude or codex without your confirm or while Include /insights is off.

The redactor's known gaps (short low-entropy passwords, unlisted spellings of a listed term, phone numbers and similar) are documented in the README under "What the scrubber catches, and what it doesn't". Improvements there are welcome as ordinary issues or pull requests.

How to report

Please don't open a public issue for a security problem. Use GitHub's private vulnerability reporting instead: open the repository's Security tab and choose Report a vulnerability. Include what you ran, what you expected, and what happened. If that option isn't there, open an issue titled "Security report" with no details in it, and I'll contact you to take it private.

Please don't attach real session logs: a synthetic log line with the same shape is enough to reproduce most problems, and keeps your own data private.

I'll acknowledge a report as soon as I can, and I'll credit you in the fix unless you'd rather I didn't.

The npm package

honestweek's npm package is honestweek, starting with version 0.2.0. It has no dependencies, so npm install and npx fetch honestweek's own files and no one else's code. I publish each version myself from main, and npm publish runs the whole test suite before it uploads anything. CHANGELOG.md lists what changed in each version, and each version is tagged here as v plus its number.

If a version on npm doesn't match its tag in this repository, or a package with a similar name claims to be honestweek, please report it privately as described above.

Supported versions

Security fixes land on main and go into the next npm release. Only the latest version gets fixes, so please check you're on it before you report: that's npx honestweek@latest or npm install -g honestweek@latest. There's no long-term support for older versions yet.

There aren't any published security advisories