Session log
Log a session report to the Obsidian vault, track vault context usage, extract unrecorded decisions, tidy the project's session folder, and output a /rename command. Use when the user says /session-log, journal this session, log this work, session report, or any variation of "summarize/log/record this session". Also triggers on "save session", "capture session", or "document what we did".From its SKILL.md
npx -y skills add jl-cmd/claude-journal --skill session-logAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
11.1 KB, as published. Nobody here has run it
Session Log
Overview
Write a structured session report, then run vault context tracking, decision extraction, and session tidying.
Announce at start: "I'm logging this session."
This skill runs as a 5-step workflow. Every step runs automatically -- no user prompts between steps except where noted.
Backend Detection (run before Step 1)
Determine which storage backend is available. Try in this order and use the first that succeeds:
-
Headless vault -- run
ob --versionvia Bash to verify the obsidian-headless CLI is installed. Then checkOBSIDIAN_VAULT_PATHenvironment variable or~/.claude/vault/for a vault directory. If the CLI exists and a vault directory resolves, optionally runob sync-status --path <vault-path>to verify sync is active. Setbackend = "headless". -
Obsidian MCP -- call
mcp__obsidian__list_directorywithpath="sessions". If it succeeds, use Obsidian MCP for all operations. Setbackend = "obsidian". -
Local vault -- if neither headless nor MCP is available, use
~/.claude/vault/as a local vault directory. Create it viamkdir -p ~/.claude/vault/sessionsif it does not exist. Setbackend = "local". This provides a working vault structure that can be upgraded to headless sync later.
Backend capabilities:
| Capability | headless | obsidian | local |
|---|---|---|---|
| Write session reports | Write tool | mcp__obsidian__write_note | Write tool |
| Search prior sessions | Bash ls + Grep | mcp__obsidian__search_notes | Bash ls + Grep |
| Session number detection | parse filenames | frontmatter search | parse filenames |
| Frontmatter | YAML --- fences | handled by MCP | YAML --- fences |
| Step 2 (vault context tracking) | skip | runs | skip |
| Step 4 (session tidy) | skip | runs | skip |
| Sync | Obsidian Sync | Obsidian Sync | none (local only) |
Session number detection (headless and local):
- List files in the project directory via Bash
ls - Parse filenames matching
[N]. *.md - Highest N + 1. If directory does not exist, create it and start at 1
Output paths:
- headless:
$OBSIDIAN_VAULT_PATH/sessions/[Project]/[N]. [Title].mdor~/.claude/vault/sessions/[Project]/[N]. [Title].md - obsidian:
sessions/[Project]/[N]. [Title].md(vault-relative) - local:
~/.claude/vault/sessions/[Project]/[N]. [Title].md
Announce the backend: "Using headless vault at [path].", "Using Obsidian vault.", or "Using local vault at ~/.claude/vault/. Run /obsidian-check for upgrade options."
Step 1: Write Session Report
-
Review the conversation to identify: key outcomes, blockers, decisions, and next steps.
-
Determine session metadata:
- Project name: infer from conversation context
- Session number: search existing vault notes to find the latest session number for this project, then increment. Use
mcp__obsidian__search_noteswithsearchFrontmatter: trueand the project name. If no prior sessions exist, start at 1. - Date: today's date
- Title: a 2-5 word summary of the session's primary outcome or focus area. Pick the single most important thing that happened. Examples: "Amazon Auth Migration", "Source Loading Fix", "Vault Reorganization". Avoid generic titles like "Bug Fixes" or "Various Updates".
-
Write to vault via
mcp__obsidian__write_note:- Path:
sessions/[Project]/[N]. [Title].md - Frontmatter:
{"type": "session-report", "project": "[name]", "session": [N], "date": "[YYYY-MM-DD]", "status": "completed"|"in-progress"|"blocked", "blocked": true|false, "tags": ["session", "[project-tag]"]} - Content: Markdown formatted (see Vault Format below)
- Path:
-
Backend-specific write:
- headless: Write tool to the headless vault path. Include frontmatter as YAML
---fences at the top of the file. Create the project directory viamkdir -pif it does not exist. - obsidian:
mcp__obsidian__write_notewith path and frontmatter object - local: Write tool to
~/.claude/vault/sessions/[Project]/[N]. [Title].md. Include frontmatter as YAML---fences. Create the project directory viamkdir -pif it does not exist. - If the write fails: output the content in the conversation so the user can copy it manually. Skip Steps 2-4 and go directly to Step 5.
- headless: Write tool to the headless vault path. Include frontmatter as YAML
Vault Format -- Markdown Session Report
The vault note uses markdown (not HTML).
## Session [N] Report -- [Month Day, Year]
### [emoji] [Section Title]
[1-3 sentence explanation of what happened and why it matters]
- **[Label]:** [detail]
**Fix:** [what was done]
### [emoji] [Section with tabular data]
[Context sentence]
| # | Item | Status |
|---|------|--------|
| 1 | ... | ... |
### [emoji] Notes
- **[Topic]:** [detail]
Emoji Status Indicators
| Emoji | Meaning | Use when |
|---|---|---|
| β | Done/Fixed | A problem was resolved or a deliverable completed |
| π« | Blocked | Something couldn't be done (external limit, dependency, etc.) |
| β οΈ | Warning/Note | Important context, gotchas, or things to remember |
| π§ | In Progress | Work started but not finished |
| π | Queued | Work identified but not yet started |
Formatting Rules
- Section headers (
###) get one emoji + descriptive title - Explanatory paragraphs under each header -- not just bullets. Explain what happened and why.
- Bold inline labels for key facts:
**Fix:**,**Account:**, etc. - Tables for anything with 3+ rows of structured data (queued items, test results, file lists)
- Bullets for lists of 2+ related items
- Links where useful: file paths, URLs, PR links as markdown links
What NOT to include
- Play-by-play of debugging steps or failed approaches
- Process narration ("First I tried X, then Y")
- Redundant sections -- if nothing was blocked, skip the blocked section
Example
## Session 6 Report -- March 27, 2026
### β
Developer Docs Sources Fixed
Both Developer Docs notebooks that had been broken since Session 5 are now fully loaded with working sources:
- **Notebook #28 -- Building with Claude & Tools:** 52 sources loaded (all green)
- **Notebook #29 -- Agent SDK & Testing:** 49 sources loaded (all green)
**Fix:** Swapped `platform.claude.com/docs/en/X.md` URLs to `docs.anthropic.com/en/docs/X` (drop .md, swap domain). Tested one URL first, then bulk-loaded.
### π« Audio Generation Blocked
All 10 Audio Overviews (8 System Card + 2 Developer Docs) are ready to generate but hit the daily limit wall. The 19 overviews from Session 5 (15 Academy + 4 Opus) are still within the rolling 24-hour window.
### β οΈ Session 7 Notes
- **Account:** Notebooks live under [email protected] (authuser=1), NOT the default [email protected].
- **Audio budget:** Once the 24h window resets, all 10 overviews fit within the 20/day Pro limit.
Step 2: Vault Context Tracking
This step runs automatically after Step 1 completes.
-
Check vault context usage. Review the conversation history for any use of these MCP tools (excluding this skill's own calls during Step 1):
mcp__obsidian__search_notesmcp__obsidian__read_notemcp__obsidian__read_multiple_notes
If any were used, set
vault_context_retrieved: true. Otherwisefalse. If true, also note which vault notes were read (list the paths). -
Update frontmatter. Use
mcp__obsidian__update_frontmatterto add the tracking field:mcp__obsidian__update_frontmatter( path="[session note path from Step 1]", frontmatter={"vault_context_retrieved": true|false}, merge=true )If
update_frontmatterfails, fall back to: read the note withmcp__obsidian__read_note, add the field to frontmatter manually, rewrite withmcp__obsidian__write_note. -
Append tracking line. Use
mcp__obsidian__patch_noteto append a vault context line to the Notes section (or end of the note if no Notes section exists):- If retrieved:
- **Vault context:** Retrieved ([list of note paths]) - If not retrieved:
- **Vault context:** Not retrieved
If
patch_notefails, fall back to read-modify-write viaread_note+write_note. - If retrieved:
Step 3: Decision Extraction
This step runs automatically after Step 2 completes.
Scan the conversation for decisions, gotchas, or architectural choices that were not already saved via /remember or to memory. For each one found, ask the user:
"I noticed this decision: [summary]. Want me to save it to the vault with /remember?"
Only write decision notes the user confirms. If no unrecorded decisions are found, skip silently.
Step 4: Session Tidy (Project Scope)
This step runs automatically after Step 3 completes. It runs a scoped version of /session-tidy -- only for the current project's session folder, not the entire vault.
-
List files in
sessions/[Project]/viamcp__obsidian__list_directory. -
Quick audit each file for:
- Naming convention: must match
[N]. [Title].md - Frontmatter completeness: all required fields present (
type,project,session,date,status,blocked,tags) - Status coherence:
status: "completed"withblocked: trueis contradictory.status: "in-progress"orstatus: "blocked"on sessions older than 7 days is stale.
- Naming convention: must match
-
Auto-fix minor issues silently:
- Missing frontmatter fields that can be inferred (e.g.,
blocked: falsewhen status iscompleted) - Type field set to wrong value (correct to
session-report)
- Missing frontmatter fields that can be inferred (e.g.,
-
Report issues that need user input:
- Files with wrong naming convention (propose new name)
- Stale statuses (propose update to
completedor ask) - Contradictory status/blocked combos
If no issues are found, skip silently. Do not report "all clean."
-
Rollup check: if the project has 5+ sessions and no
Summary.md, mention it:"This project has [N] sessions and no summary. Run
/session-tidyfor a full rollup."
Step 5: Finalize
Copy a /rename command to the user's clipboard using echo -n "/rename [Project] - [Primary Outcome]" | clip.exe, then tell the user:
"Copied
/rename [Project] - [Primary Outcome]to your clipboard. Paste it to rename this session."
The primary outcome comes from the session title determined in Step 1.
Best Practices
- Each section in the session report is an outcome, not a process step ("Sources Fixed" not "We debugged source loading")
- Body should be self-contained -- no context needed beyond the note itself
- If the session was exploratory with no concrete outcome, use π§ or π sections to describe what was investigated and what's next
- Keep it scannable: a reader should grasp the session in 15 seconds from headers alone
- Tables are powerful -- use them whenever you have structured data (queued work, test results, file inventories)