| Version | Supported |
|---|---|
| 0.6.x | ✅ |
| < 0.6 | ❌ |
If you discover a security issue in TermStory, do not open a public GitHub issue — this gives potential attackers advance notice before a fix is available.
Instead, use GitHub's private security advisory system:
- Navigate to the repository Security tab.
- Click "Report a vulnerability".
- Describe the issue, steps to reproduce, and potential impact.
Expected response time: initial acknowledgement within 48 hours, fix within 14 days for confirmed vulnerabilities.
TermStory's privacy guarantee is: no raw data leaves your machine without passing through termstory/sanitizer.py first. Understanding the limits of that guarantee is important.
- Named-prefix secrets (AWS
AKIA*, OpenAIsk-*, Anthropicsk-ant-*, Slackxoxb-*, GoogleAIzaSy*, etc.) are caught by specific regex patterns. - Structural patterns (
--password=,export KEY=***) are redacted regardless of the specific value. - Blacklisted workflows (
vault,aws configure,gh auth, raw token strings,kubectl create secret) gate the entire COMMANDS block — none of those raw command strings reach the LLM.
Known gaps (by design — documented here, not hidden)
| Limitation | Detail |
|---|---|
| Short / low-entropy secrets | redact_high_entropy() requires ≥ 24 characters and Shannon entropy > 4.3 bits/char. A short or predictable secret with no recognizable prefix (e.g., a 12-character password) will not be flagged. |
| Novel token formats | Blacklist and named-pattern detection is structural. A company-internal token format with no known prefix silently passes through unless you add it to ~/.termstoryignore. |
| Commit message prose | redact_command() was designed for shell syntax. A secret embedded in natural-language commit text with no =, flag, or prefix cue may not be detected. |
.termstoryignore not live-reloaded |
Custom patterns load once at process startup. Edits require a TermStory restart to take effect. |
| Model refusal is not a control | TermStory adds an instruction in termstory ask prompts asking the LLM never to output credentials verbatim. This is a secondary layer; the redaction pass is the actual control. |
- Use
HISTCONTROL=ignorespacein your shell and prefix any command containing a plaintext secret with a space — the shell will refuse to write it to history, and TermStory will never see it. - Use Ollama for fully local inference if you work with highly sensitive codebases.
- Maintain
~/.termstoryignorewith patterns for any proprietary token formats your workflows produce.