About opencode-memory
OpenCode Memory Browser is a read-only skill for looking up local OpenCode history when earlier sessions, plans, or decisions are relevant. It uses targeted SQLite queries and summarizes findings rather than injecting history by default.
Key features
- 01Read-only access to OpenCode history
- 02Search sessions and message text
- 03Look up plans and prompt history
- 04Targeted SQLite queries with result limits
- 05Summarize relevant findings
Use cases
- 01Recalling decisions from a previous session
- 02Resuming work with earlier project context
- 03Checking whether an issue appeared before
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ carson2222/ skills --skill opencode-memoryAfter installing, type/opencode-memoryin Claude Code to confirm it loaded.
Bundled filesreferences/storage-format.md
Details
From the project READMEOpenCode Memory Browser
Read-only lookup for local OpenCode history. Use it only when prior sessions, plans, or decisions would help. Do not inject history by default.
Use When
- User asks for history, previous sessions, last time, plans, recall, or memory.
- Resuming a project where prior OpenCode context may matter.
- Debugging a repeat issue that may have appeared earlier.
Do not use when repo files/git already answer the question or the task is new.
Rules
- Read-only. Never modify OpenCode DB/files.
- Use
sqlite3with read-only URI. Do not read the DB with file-read tools. - Keep results small with
LIMITand targetedLIKE. - Summarize relevant findings; do not dump raw history.
- Avoid auth/provider tables:
account,credential,control_account,account_state.
Setup
Run this first in bash:
DATA_ROOT="${XDG_DATA_HOME:-$HOME/.local/share}/opencode"
STATE_ROOT="${XDG_STATE_HOME:-$HOME/.local/state}/opencode"
DB="$(opencode db path 2>/dev/null || true)"
[ -n "$DB" ] || DB="${OPENCODE_DB:-$DATA_ROOT/opencode.db}"
case "$DB" in :memory:|/*) ;; *) DB="$DATA_ROOT/$DB" ;; esac
if [ ! -f "$DB" ]; then
for candidate in "$DATA_ROOT"/opencode*.db; do
[ -f "$candidate" ] && DB="$candidate" && break
done
fi
DB_URI="file:${DB}?mode=ro"
Useful files:
- Plans:
$DATA_ROOT/plans/*.md - Prompt history:
$STATE_ROOT/prompt-history.jsonl - Session diffs:
$DATA_ROOT/storage/session_diff/<session-id>.json
Queries
Summary
sqlite3 "$DB_URI" "
SELECT 'projects', COUNT(*) FROM project
UNION ALL SELECT 'main sessions', COUNT(*) FROM session WHERE parent_id IS NULL
UNION ALL SELECT 'messages', COUNT(*) FROM message
UNION ALL SELECT 'parts', COUNT(*) FROM part
UNION ALL SELECT 'todos', COUNT(*) FROM todo;
"
Recent sessions
sqlite3 "$DB_URI" "
SELECT s.id, COALESCE(s.title, 'untitled') AS title,
COALESCE(p.name, p.worktree, '') AS project,
datetime(s.time_updated/1000, 'unixepoch', 'localtime') AS updated,
(SELECT COUNT(*) FROM message m WHERE m.session_id = s.id) AS messages
FROM session s
LEFT JOIN project p ON p.id = s.project_id
WHERE s.parent_id IS NULL
ORDER BY s.time_updated DESC
LIMIT 10;
"
Search text
Replace SEARCH_TERM first.
sqlite3 "$DB_URI" "
SELECT s.id, COALESCE(s.title, 'untitled') AS title,
json_extract(m.data, '$.role') AS role,
datetime(m.time_created/1000, 'unixepoch', 'localtime') AS time,
substr(json_extract(p.data, '$.text'), 1, 200) AS snippet
FROM part p
JOIN message m ON m.id = p.message_id
JOIN session s ON s.id = m.session_id
WHERE s.parent_id IS NULL
AND json_extract(p.data, '$.type') = 'text'
AND json_extract(p.data, '$.text') LIKE '%SEARCH_TERM%'
ORDER BY m.time_created DESC
LIMIT 10;
"
Read session text
Replace SESSION_ID_HERE first. Text parts only; use the reference for tool,
patch, file, reasoning, or V2 internals.
sqlite3 "$DB_URI" "
SELECT json_extract(m.data, '$.role') AS role,
datetime(m.time_created/1000, 'unixepoch', 'localtime') AS time,
GROUP_CONCAT(json_extract(p.data, '$.text'), char(10)) AS text
FROM message m
LEFT JOIN part p ON p.message_id = m.id
AND json_extract(p.data, '$.type') = 'text'
WHERE m.session_id = 'SESSION_ID_HERE'
GROUP BY m.id
ORDER BY m.time_created ASC
LIMIT 50;
"
Plans And Prompt History
ls -lt "$DATA_ROOT"/plans/*.md 2>/dev/null | head -20
tail -20 "$STATE_ROOT"/prompt-history.jsonl 2>/dev/null
Prompt history entries currently use input, mode, and parts[]; do not
assume root text.
Deep Reference
Use references/storage-format.md only when you need table details, part/tool shapes, legacy JSON paths, or debug queries.