Improve Obsidian daily notes — polish writing, add missing wikilinks, extract long sections into dedicated notes, suggest new vault entities, summarize Slack and GitHub activity, and enrich person notes from meetings. Use when asked to clean up a daily note, polish writing, add wikilinks, or enrich note context.
Improve an Obsidian daily note by polishing prose, adding missing wikilinks to maintain a rich knowledge graph, extracting long sections into dedicated notes, suggesting new vault entities, and capturing useful day-of context from Slack and GitHub.
When invoked with --auto (e.g., refine-daily-note --auto or refine-daily-note 2026-02-14 --auto), the skill runs fully unattended with no confirmation prompts. This is designed for unattended scheduled execution as well as interactive use.
In auto mode:
gh is available; skip quietly if GitHub access is unavailablevault backup: refine daily note {date}In interactive mode (default): Behavior is unchanged — all confirmation prompts remain.
obsidian vault info=path and use the returned path.refine-daily-note 2026-02-14), otherwise use today.obsidian daily:read for today or obsidian read path="Daily Notes/{date}.md" for another date.Daily Notes/{date}.md directly from disk. Error if missing.Build a catalog of all known entities so you can match them against the daily note text. Prefer Obsidian CLI discovery when available, but fall back to direct filesystem reads whenever needed.
Projects/ and extract project names from filenamesPersons/. If frontmatter aliases are available, read them from each person noteTopics/ and extract topic names from filenamesCoding/ for cross-reference awarenessMeetings/ for cross-reference awarenessThis gives you the full entity catalog to match against the daily note.
Always run this phase. If Slack tools are unavailable, skip gracefully with no error.
slack_search_public_and_private:
from:<@U07J89FDWPJ> on:{date}slack_read_channel with oldest/latest timestamps. Look for messages from Slackbot containing "A huddle started".
$VAULT/.cache/om/intervals-cache/slack-mappings.mdSlack activity not covered by time entries:
- #technomic-dev (2:30-3:15pm, 8 messages): discussed vector search PR issues → [[Technomic]]?
- #exsq-general (4:00-4:20pm, 4 messages): coordinated with team on AI Upskill → [[EXSQ]]? Add time entries for these?
Huddles detected:
- DM with [[Sol Parrot|Sol]] (12:16pm, ~1h54m): matches ✓
Using the data already gathered in Phase 1b, write a ### Slack Activity section into the daily note summarizing the day's interactions.
Group by channel/conversation: For each channel or DM where the user sent messages, build a brief summary:
slack_read_channel / slack_read_thread if threads were read in Phase 1b, otherwise summarize from search result snippets.Format the section as a bullet list under ### Slack Activity:
### Slack Activity
- **#technomic-dev** (2:30–3:15pm, 8 msgs) — Discussed vector search indexing issues; agreed to switch to HNSW. [[Technomic]]
- **#exsq-general** (4:00–4:20pm, 4 msgs) — Coordinated AI Upskill session logistics with [[Sol Parrot|Sol]]. [[EXSQ]]
- **DM with [[Adam Herrneckar|Adam]]** (3:05–3:30pm, 3 msgs + huddle ~25m) — Reviewed deployment pipeline changes.
Wikilink any people and projects mentioned, using the entity catalog from Phase 1.
Placement: Insert the section after the time entries block and before the first ### [[Project]] section (or at the end if no project sections exist). If a ### Slack Activity section already exists, replace it (idempotent).
Include in Phase 5 preview: Show the proposed Slack Activity section as part of the change summary for user approval.
If no Slack messages were found in Phase 1b, or Slack MCP tools were unavailable, skip this phase silently.
Always attempt this phase. If gh is unavailable, not authenticated, or returns no useful data, skip gracefully with no error.
bash scripts/fetch-github-activity.sh {date}
This returns JSON for:
.cache/om/intervals-cache/github-mappings.mdworked on OIDC stuff → mention the PR title or repo involvedreviewed PRs → list the most important PRs/repositories reviewedpipeline work → mention the repo and PR title when available.cache/om/intervals-cache/github-mappings.md.Using the data gathered in Phase 1d, write a ### GitHub Activity section into the daily note summarizing the day's engineering activity.
### GitHub Activity
- **Technomic** — Worked in `exsq/ignite-app` on OIDC/manual-trigger pipeline changes; updated [[repo/PR context if you keep such notes]] and reviewed follow-up deployment issues. [[Technomic]]
- **KHov** — Reviewed and iterated on mortgage-site preview/deployment PRs in `exsq/khov-web`. [[KHov]]
### Slack Activity section exists, insert ### GitHub Activity immediately after it.### [[Project]] section, or append it near the end if needed.### GitHub Activity section already exists, replace it (idempotent).If gh is unavailable or no meaningful GitHub activity is found, skip these phases silently.
Review each section of the daily note:
- [[Project]] - task - duration) is structured data for the intervals skill. Never modify these.Use vault-native link analysis to find and fix missing wikilinks:
obsidian unresolved to get all unresolved links in the vault — these are references to notes that don't exist yet. Filter for any that appear in today's daily note.obsidian links file="{date}" to see what the daily note already links to — avoid double-linking.[[Project Name]] links where project names appear unlinked[[Full Name]] or [[Full Name|Alias]] when a short name or alias is used[[Topic]] links where topic names appear unlinked### [[Project]] for project section headings consistentlyRules:
[[...]] or already in the obsidian links outputIdentify sections that are >~20 lines or contain substantial standalone content worth its own note.
For each extractable section:
Projects/ subtree or Topics/ based on contentobsidian create path="{destination}" content="{formatted content}":
# {Title}
{Extracted content}
## Related
- [[Daily Notes/{date}]]
[[wikilink]] to the new notePresent all proposed extractions to the user for approval before executing. Show what would be extracted, where it would go, and what the replacement summary would look like.
Identify mentions of people, projects, or topics that don't match any existing vault note.
For each candidate name, run qmd query "{name}" to check if the entity already exists under a different spelling or alias before suggesting creation. If qmd returns a high-confidence match (>70%), skip the suggestion and use the existing entity instead.
Present remaining candidates:
It looks like **Jane Smith** and **ProjectX** are mentioned but don't have vault pages yet.
Want me to create them?
For each confirmed new entity, create the note following vault conventions:
Person: $VAULT/Persons/{Name}.md
---
aliases:
- {short name}
---
# {Full Name}
**Role**: {if known}
**Projects**: {if known}
## Notes
Project: $VAULT/Projects/{Name}.md (or appropriate subdirectory)
# {Project Name}
{Brief description if known}
## Related
Topic: $VAULT/Topics/{Name}.md
# {Topic Name}
{Brief definition if known}
## Related
## Notes
After creating new entities:
Scan unchecked todos on project pages against today's content to suggest completions with high confidence.
obsidian tasks todo to get all open todos from project files. Filter to projects referenced in today's time entries.qmd query "{todo text}" to search for evidence across today's daily note, meeting notes, and coding sessions. Look for high-confidence semantic matches.These todos appear done based on today's work:
review PRs(Technomic.md) — Evidence: wrote detailed reviews for PRs #650, #636, #571, #469fix vector search(Technomic.md) — Evidence: coding session [[2026-02-20--TechnomicIgnite--fix-vector-search]] shows fixes deployed Mark as complete? (✅ 2026-02-20)
- [ ] to - [x] and append ✅ {date}. The Tasks plugin completion format ensures they appear in the daily note's "Done today" dataview.Rules:
When refining a previous day's note (not today), convert the "Done today" dataview query into plain markdown so it becomes a permanent historical record.
### Done today section and its dataview code block.obsidian tasks done and filter the output for items containing ✅ {target-date}.### Done today
- [x] [[Technomic]] - Investigate feature-22 login issue ✅ 2026-03-03
- [x] [[AI Upskill]] - Attend Panama Canal meeting ✅ 2026-03-03
Prefix each item with [[Project]] for context since the items originally live on project pages.- [x] ... ✅ {target-date} items from the project files' ## Todos sections to keep them tidy.If no completed tasks found for the target date, replace the dataview with an empty section (just the heading).
Scan the daily note for - [ ] lines written outside of dataview blocks and move them to the appropriate project page.
- [ ] [[Project]] ... that are NOT inside a dataview code block.[[Project]] wikilink$VAULT/Projects/## Todos section for duplicates (fuzzy match)Moving inline todos to project pages:
- [ ] [[Technomic]] fix login bug→ Technomic.md## Todos- [ ] [[KHov]] test Docker build→ Khov.md## Todos
[[Project]] prefix) to the project file's ## Todos sectionIf no inline todos found, skip this phase silently.
After all daily note changes are applied, update each referenced project's note with a summary of today's activity.
$VAULT/Projects/:
## Recent Activity section (or prepare to create it)- **{date}**: {hours}h — {brief summary} (meetings: [[links]], coding: [[links]])## Recent Activity section before ## Key Features or at the end of the note if no logical insertion pointAfter project updates, enrich person notes for anyone who appeared in today's meetings.
Collect today's meeting notes: Find all meeting notes linked from the daily note's time entries (wikilinks like [[2026-04-02 Technomic Weekly Status Meeting]]). Read each meeting note's frontmatter to extract the participants: list.
For each participant (deduplicated across all meetings):
a. Match to existing person file: Check if a file exists in $VAULT/Persons/ matching the wikilink target. Use the entity catalog from Phase 1 (which already loaded Persons/ files and aliases).
b. If person file exists: Read it and update the ## Recent Interactions section:
- **{date}**: [[{Meeting Title}]] — {1-line summary from meeting note}**Projects:** field doesn't include the meeting's project, add it
c. If no person file exists: Queue for creation (see step 3)Create new person files: For each participant without a matching Persons/ file:
---
aliases:
- {first name}
---
# {Full Name}
**Role:** {if known, otherwise omit}
**Projects:** [[{project from meeting}]]
## Recent Interactions
- **{date}**: [[{Meeting Title}]] — {1-line summary}
## Notes
Update aliases if needed: If a person was referred to by a name not in their aliases (e.g., transcript says "Bhrugen" but aliases only has "Bhru"), add the new alias.
Rules:
Persons/ filenames for wikilinks, not the short names from meeting frontmatter.## Recent Interactions section is the enrichment target. Don't modify other sections of person notes.## Todos in each project file. Daily notes show them via dataview queries (### Done today for completed, ### Open todos for unchecked).--auto mode)[[EXSQ]] - 1:1 sync with Sol - 2