Surface what you've left unfinished, across every tool.
Knowledge work generates open loops everywhere. A Slack thread goes cold mid-decision. An idea in a Claude session never gets built. A Notion doc is half-written. A Codex task stalled without a PR. Gmail thread waiting on a reply.
No single tool surfaces all of them. You discover each one the hard way (someone asks, or a deadline slips, or you stumble on the old thread). Most are never discovered at all.
openloop is the unified detector: it ingests from every place you do knowledge work, and tells you what's still open.
A Claude Code skill, /openloop, that reads your Claude session history (~/.claude/history.jsonl) and surfaces:
- Unfinished work: tasks you said you'd come back to
- Unactioned ideas: things you proposed building with enthusiasm but never started
- Pending decisions: choices you deferred without resolving
It cross-references across sessions so that a TODO from Monday closed by a commit on Wednesday doesn't appear in Friday's report. Only the genuinely open items surface.
Runs manually (/openloop 14d for a custom lookback), or weekly via launchd every Sunday at 10AM, delivered as a Slack DM.
See examples/sample-report.md.
The Claude history integration is v0. The goal is cross-source coverage. See ROADMAP.md for the full list.
Short version:
- v0 (shipped): Claude Code session history
- v1: Slack (threads you've gone quiet on, DMs waiting for reply, decisions left unresolved)
- v2: Notion (pages in draft status, TODOs in doc bodies, pages not updated past their target date)
- v3: Codex / local git (branches ahead of main with no open PR, TODO/FIXME accumulation)
- v4: Gmail (threads you've started and left unresponded)
- v5: Linear / GitHub Issues (assigned tickets stale past their estimate)
The architecture target is a source-adapter pattern so new ingestors can be added without touching the detector core.
Copy the skill into your user skills directory:
mkdir -p ~/.claude/skills/openloop
cp SKILL.md ~/.claude/skills/openloop/SKILL.mdOr via the open skills CLI:
npx skills add 0xj7r/openloop -g -y/openloop # default 7-day lookback
/openloop 14d # 2-week lookback
Save to ~/Library/LaunchAgents/com.openloop.weekly.plist, replacing the Claude CLI path with your own:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.openloop.weekly</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/claude</string>
<string>-p</string>
<string>/openloop</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Weekday</key><integer>0</integer>
<key>Hour</key><integer>10</integer>
<key>Minute</key><integer>0</integer>
</dict>
<key>StandardOutPath</key>
<string>/tmp/openloop.log</string>
</dict>
</plist>Load with launchctl load ~/Library/LaunchAgents/com.openloop.weekly.plist.
For each session cluster in the lookback window, the detector scans for:
- Verb-tense hedges: "I'll come back to", "let's figure that out later", "TODO"
- Enthusiasm without follow-up: "we should build", ideas discussed in session N but absent from N+1, N+2, etc.
- Unresolved decisions: "should we go with X or Y?" with no later commitment either way
- Acknowledged failures that never got retried
Then it cross-references: if a later session contains a commit, a new skill, or a closure phrase referencing the earlier item, the loop is marked closed and suppressed from the report.
v0 works and runs on my machine weekly. I am actively building this out. Contributions, source adapters, and open-loop heuristics welcome.
MIT. See LICENSE.