I've been using Claude Code × Obsidian Daily Notes for six months and have tried three improvements

I've been using Claude Code × Obsidian Daily Notes for six months and have tried three improvements

2026.01.02

This page has been translated by machine translation. View original

Introduction

I'm kasama from the Data Division.

It's been about six months since I started using Obsidian's Daily Note system, and after much trial and error, I've implemented three major improvements. In this article, I'll share what I've learned from my previous operations and the improvements I've made.

Prerequisites

This article covers improvements to the daily-morning and daily-evening commands introduced in my previous blog.

Previous blog post
https://dev.classmethod.jp/articles/claudecode-obsidian-vertex-ai-knowledge-system/
Most recent blog post
https://dev.classmethod.jp/articles/automate-obsidian-daily-notes-claude-code/

Here's a brief explanation of the two commands introduced in the previous blog.

The daily-morning command is executed when starting work in the morning. It retrieves "Tomorrow's tasks" from the previous day's Daily Note, reads Google Calendar events, and creates today's Daily Note.

The daily-evening command is executed at the end of the workday. It reads today's Daily Note, cross-references it with Google Calendar, and updates the Daily Note by answering six questions (achievements for each project, reflections, and plans for tomorrow).

Insights from Six Months of Operation

Ritualized Reflection

When I first started, I recorded reflections using three categories: "Gratitude, Good, Motto." However, after about two months, I noticed that my responses were becoming repetitive and weren't strongly connected to my growth objectives. Specifically, my reflections became generic like "I worked hard on tasks today, I was able to concentrate, I'm tired, nothing special."

Question Effort

With the daily-evening command, I needed to sequentially answer six questions, which was time-consuming. For example, if Project A had three tasks, I had to input all three tasks at once either by voice or manually for a single question. However, progress statuses were generally similar - not started, in progress, under review, or completed - so I wanted to reduce this effort.

Task States Visually Unclear

- [ ] API design
- [/] Implementation in progress
- [R] Waiting for code review
- [x] Testing completed

While I could distinguish these symbols in editors like VS Code, in Obsidian they all displayed as checkboxes, making it difficult to visually distinguish progress states. I wasn't properly managing statuses. In Obsidian, they actually display like this:
Screenshot 2025-12-26 at 17.37.30

I've modified the implementation to address these three issues, which I'll introduce next.

Implementation

The implementation code for these improvements is stored on GitHub for your reference.

https://github.com/cm-yoshikikasama/obsidian-claude-feedback-sample

I'll only introduce the updates since the previous blog.

daily-evening Implementation

.claude/commands/daily-evening.md
---
allowed-tools: Bash(cd:*), Bash(date:*), Bash(TZ=:*), Bash(uv:*), Bash(find:*), Write, Read, Glob, Edit, LS
argument-hint: [YYYY-MM-DD]
description: Update daily note with achievements and tomorrow's plan (Option: specific date)
---

# Daily Note Evening Assistant (Updated)

## Date Handling

- If date argument ($1) is specified in YYYY-MM-DD format, use that date
- If no argument is provided, use today's date (JST)
- Target date: ${TARGET_DATE}

## Environment Variables

```txt
PROJECT_A = "A Project"
PROJECT_B = "B Project"
PROJECT_C = "C Project"
GOAL_1 = "Technical skill improvement"
GOAL_2 = "Project management skill enhancement"
GOAL_3 = "Communication skill improvement"
```

## Tasks

1. Determine target date from argument or use today's date
2. Retrieve Google Calendar events for the target date
3. Search and load the daily note for the target date
4. Ask user five questions one by one about achievements and reflections
5. Update the existing daily note file with responses and automatically generated tasks for tomorrow

### Step 0: Determine Target Date

```bash
TARGET_DATE="$1"
if [ -z "$TARGET_DATE" ]; then
  # Explicitly use JST timezone
  TARGET_DATE=$(TZ=Asia/Tokyo date +%Y-%m-%d)
fi
echo "Processing daily note for: $TARGET_DATE"
```

### Step 1: Retrieve Calendar Events

```bash
cd .claude && uv run today_cal/today-calendar.py --date "$TARGET_DATE"
```

Parse calendar output to understand events for the target date and generate related questions.

### Step 2: Search for Target Date's Daily Note

- Important: Current directory is `.claude/`, so when using Glob, need to specify `path=".."`
- Use bash command `find ../01_Daily -name "${TARGET_DATE}.md" -type f` to search for the target daily note
- Or use `Glob(path="..", pattern="01_Daily/**/[TARGET_DATE].md")`
- File should be in format `01_Daily/YYYY/MM/[TARGET_DATE].md`
- Read file to understand current content structure

### Step 3: Ask User Questions Using Calendar Context (using AskUserQuestion tool)

First analyze Google Calendar events to map them to projects. Then use AskUserQuestion tool to ask checkbox-style questions.

Important: Use AskUserQuestion tool for all questions below. This provides an interactive checkbox/selection interface.

Status numbers: 1=Not started, 2=In progress, 3=Under review, 4=Completed

Cancelled tasks can be entered with strikethrough in the "Other" field (e.g., ~~Task name~~)

#### Question Pattern (For Each Project)

Important: For each project, use a single AskUserQuestion call that contains multiple questions (up to 4). This creates a tabbed interface allowing users to switch between questions.

For each project (PROJECT_A, PROJECT_B, PROJECT_C, Blog/Other):

1. Before asking questions, output a text message showing Google Calendar events for this project
2. Collect all tasks for this project from the daily note
3. Skip "Undetermined" tasks - don't ask about their status
4. Create one question per task (up to 3 tasks to leave room for additional task question)
5. Add a final question asking about additional tasks
6. If all tasks are "Undetermined", only ask the additional tasks question
7. Send all questions in a single AskUserQuestion call

First, output a text message like:

```text
## {PROJECT_NAME} Task Progress

Google Calendar Events
- [event 1]
- [event 2]
```

Then ask questions

Task Status Question Format (for each task in the project):

```text
Please tell me the status of task "[task content]".
```

header: "Task[N]" (e.g., "Task1", "Task2", etc.)

multiSelect: false

Task Status Options:

- label: "Not Started", description: "Haven't started the task yet"
- label: "In Progress", description: "Working on the task"
- label: "Under Review", description: "Waiting for review"
- label: "Completed", description: "Task is completed"

Cancelled tasks can be entered with strikethrough in the "Other" field (e.g., ~~Task name~~)

Additional Task Question Format (final question for the project):

```text
If you did any additional tasks for {PROJECT_NAME}, please enter them using "Other". If none, select "None".
```

header: "Additional Tasks"

multiSelect: false

Options (minimum 2 required):

- label: "None", description: "No additional tasks"
- label: "Enter", description: "Enter additional tasks in Other field"

Note: User can input additional tasks via the "Other" field.

Example: If PROJECT_A has 2 tasks, send a single AskUserQuestion call containing 3 questions (Task1, Task2, Additional Tasks) displayed as tabs.

#### Question 1: PROJECT_A Task Progress

Use AskUserQuestion tool for each task in PROJECT_A section

#### Question 2: PROJECT_B Task Progress

Use AskUserQuestion tool for each task in PROJECT_B section

#### Question 3: PROJECT_C Task Progress

Use AskUserQuestion tool for each task in PROJECT_C section

#### Question 4: Blog/Other Task Progress

Use AskUserQuestion tool for each task in Blog and Other sections

#### Question 5: Today's Reflection (based on goals)

Do not use AskUserQuestion tool for reflection. Instead, output a text message asking for reflection:

```text
Please reflect on today in KPT format based on your set goals (share relevant perspectives)

- Reflection related to {GOAL_1}
- Reflection related to {GOAL_2}
- Reflection related to {GOAL_3}
```

Wait for user's text response. User can provide free-form text responses for each category they want to reflect on.

Important: Once user has responded once, proceed directly to Step 4 without additional confirmation or questions. Accept the response even if they only mention one or two goals.

### Step 4: Update Daily Note File

After collecting all responses, update the daily note file:

1. Load the `01_Daily/YYYY/MM/[TARGET_DATE].md` file
2. Update MTG/Events section
    - Mark all Google Calendar events as `- [x]` (attended)
    - Mark events present in daily note but not in Google Calendar with strikethrough: `- [ ] ~~Event name~~ (not held)`
3. Update Today's Todo section
    - Mark completed items as `- [x]`
    - Update in-progress items as `- [/]`
    - Mark under-review items as `- [R]`
    - For cancelled items, keep checkbox as is but add strikethrough to task name `~~Task name~~`
    - Keep not-started items as `- [ ]`
    - Update progress details (e.g., "Implement" → "Implementation 80% complete, moving to validation")
4. Update Today's Reflection section
    - Include only the goals mentioned by the user
    - Keep sections for unmentioned goals empty (just `-`)
    - Add user responses as bullet points
5. Update Tomorrow's Tasks section
    - Automatically extract incomplete tasks from "Today's Todo" section (items not marked as [x])
    - Include tasks with these statuses: [ ] Not started, [/] In progress, [R] Under review
    - Exclude these tasks: [x] Completed, tasks with strikethrough (cancelled)
    - Copy these tasks to "Tomorrow's Tasks" section and reset all checkboxes to [ ]
    - If no tasks remain for a project, set to "[ ] Undetermined"

Execute all steps and update file immediately.

Update Example:

```markdown
## MTG/Events

- [x] 08:30 - (Project A) Implementation # Event that was in Google Calendar
- [x] 11:00 - (Project B) Internal MTG # Event that was in Google Calendar
- [ ] ~~14:00 - (Project C) Internal MTG~~ (not held) # Event that was in daily note but not in Google Calendar
- [x] All day - Home # Event that was in Google Calendar

## Today's Todo

- Project A
    - [x] Implementation 80% complete, moved to validation testing # Completed
    - [/] API testing in progress # In progress
- Project B
    - [x] Unit testing completed, integration testing started # Completed
    - [R] Waiting for code review # Under review
- Project C
    - [x] Architecture review completed, creating structure diagram # Completed
    - [ ] ~~Meeting postponed due to cancellation~~ # Cancelled
- Blog
    - [ ] (No plans) # Not started
- Other
    - [ ] (No plans)

## Today's Reflection

### {GOAL_1}

- [Include user response only if mentioned]

### {GOAL_2}

-

### {GOAL_3}

-

## Tomorrow's Tasks

- {PROJECT_A}
    - [ ] [Automatically extract incomplete tasks from Today's Todo]
- {PROJECT_B}
    - [ ] [Automatically extract incomplete tasks from Today's Todo]
- {PROJECT_C}
    - [ ] [Automatically extract incomplete tasks from Today's Todo]
- Blog
    - [ ] [Automatically extract incomplete tasks from Today's Todo]
- Other
    - [ ] [Automatically extract incomplete tasks from Today's Todo]
```

For the daily-evening command, I implemented two improvements:

The first is a revision of the reflection format. I established three perspectives (GOAL_1/2/3) directly linked to personal growth goals and changed to recording reflections in KPT format. This shifted daily reflections from "what I did" to "what I learned," enabling KPT (Keep, Problem, Try) analysis by goal during monthly reviews. It also makes growth clearer in terms of specific goals rather than abstract "good things." Personally, I struggle with mid-term and end-of-period reviews, finding it difficult to reflect on goal achievement using Backlog tickets. I honestly can't remember what I did six months ago when even last week is vague. By recording achievements daily and having AI summarize them at evaluation time, I believe the process can be much more efficient.

The second is the introduction of a Tab-format UI. I utilized the AskUserQuestion tool from Claude Code's Plan mode to enable questioning about task status for each project in a tabbed format.

Previously, I would respond to questions about each project's achievements in text format:

Question 1: Please tell me about your achievements for PROJECT_A
[User responds with text]

Question 2: Please tell me about your achievements for PROJECT_B

With the new method, I can switch between multiple tasks within each project using tabs to select their status:

Question 1: PROJECT_A Task Progress

Tab1: Status of "Proceed with implementation"
  ○ Not started ○ In progress ○ Under review ○ Completed

Tab2: Status of "Client regular meeting preparation"
  ○ Not started ○ In progress ○ Under review ○ Completed

Tab3: Additional Tasks
  ○ None ○ Enter

Question 2: PROJECT_B Task Progress

This change allows me to check and update multiple tasks within each project by switching tabs, making responses faster as I only need to select from checkboxes, and facilitating automatic updates.

monthly-review Implementation

.claude/commands/monthly-review.md
---
allowed-tools: Bash(cd:*), Bash(date:*), Bash(TZ=:*), Bash(find:*), Write, Read, Glob, LS
argument-hint: [YYYY-MM]
description: Generate monthly KPT-format review from daily notes (current month if no args, specified month if provided)
---

# KPT Format Monthly Review Generator

## Date Handling

- No arguments: Summary for current month (e.g., 2025-12 when executed on 2025-12-26)
- One argument (YYYY-MM format): Summary for specified month (e.g., 2025-11)
- Target dates: ${START_DATE} to ${END_DATE}

## Environment Variables

```txt
PROJECT_A = "A Project"
PROJECT_B = "B Project"
PROJECT_C = "C Project"
GOAL_1 = "Technical skill improvement"
GOAL_2 = "Project management skill enhancement"
GOAL_3 = "Communication skill improvement"
```

## Tasks

Execute the following steps in order to generate a complete review

### Step 0: Determine Target Period

If no argument is provided, use current month.

```bash
if [ -z "$1" ]; then
  # No argument: Use current month
  TARGET_MONTH=$(date +%Y-%m)
  echo "Generating review for current month: $TARGET_MONTH"
else
  # One argument: Use specified month
  TARGET_MONTH="$1"
  echo "Generating review for: $TARGET_MONTH"
fi

# Calculate start and end dates
START_DATE=$(date -j -f "%Y-%m" "$TARGET_MONTH" +%Y-%m-01)
# Get end of month
NEXT_MONTH=$(date -j -v+1m -f "%Y-%m" "$TARGET_MONTH" +%Y-%m-01)
END_DATE=$(date -j -v-1d -f "%Y-%m-%d" "$NEXT_MONTH" +%Y-%m-%d)
```

### Step 1: Search and Load Daily Notes

- Important: Current directory is `.claude/`, so need to search from parent directory
- Use bash command `find ../01_Daily -name "*.md" -type f | sort` to search for all daily notes
- If using Glob tool, explicitly specify `path=".."` parameter: `Glob(path="..", pattern="01_Daily/**/*.md")`
- Filter files within target date range (START_DATE to END_DATE)
- Daily notes follow pattern `01_Daily/YYYY/MM/YYYY-MM-DD.md`
- Load each file that falls within target period

### Step 2: Extract and Analyze Information

Systematically extract from each daily note:

1. MTG/Events - Completed meetings and events (items that meet these criteria):
    - Have [x] mark
    - And contain any of these keywords: "regular", "MTG", "meeting", "1on1", "○○ session"
    - Exclude work time blocks (project work that starts with parentheses)
2. Today's Todo - Tasks and status tracking by project category
    - [ ] Not started
    - [/] In progress
    - [R] Under review
    - [x] Completed
    - [-] Cancelled
3. Today's Reflection section (analyze from KPT perspective)
    - From {GOAL_1} content, extract Keep (what went well), Problem (issues), Try (things to try next)
    - From {GOAL_2} content, extract Keep, Problem, Try
    - From {GOAL_3} content, extract Keep, Problem, Try
4. Tomorrow's Tasks - Plans created
5. Other important content or achievements

### Step 3: Fact-Based Aggregation and Analysis (KPT Structure)

Organize extracted information based on facts

Important: Deduplicate tasks and MTG/events to create unique lists

1. Project-specific achievements - List completed tasks and results by {PROJECT_A}, {PROJECT_B}, {PROJECT_C}
    - Display task names that appear on multiple days only once
2. Goal achievement status (KPT format) - For each goal {GOAL_1}, {GOAL_2}, {GOAL_3}:
    - Keep: What went well, effective approaches, things to continue
    - Problem: Issues, problems, what didn't work, barriers
    - Try: Things to try next month, improvements, new approaches
3. Numerical achievements
    - Total tasks: Count all unique tasks (completed, in progress, not started, under review, cancelled) after deduplication
    - Completed tasks: Count unique tasks with [x] mark
    - Completion rate: Completed tasks ÷ Total tasks × 100 (to first decimal place)
    - MTG/Event participation: Count unique events with [x] mark that meet keyword criteria
    - Daily note recording days: Count number of daily notes that exist within target period
    - Important: Count all numbers accurately. Never estimate or approximate.

### Step 4: Create Review File

Generate file at `02_Monthly/YYYYMM_review.md`

Use the following template structure and fill in with actual data and insights

Review Template

```markdown
# Monthly Review (KPT) - [Period Display]

## Target Period

- [START_DATE] to [END_DATE]

## Project-Specific Achievements

### {PROJECT_A}

- Completed Tasks
    - [x] [Specific task content]
    - [x] [Specific task content]
- Participated MTGs/Events
    - [Date] [MTG name]

### {PROJECT_B}

- Completed Tasks
    - [x] [Specific task content]
- Participated MTGs/Events
    - [Date] [MTG name]

### {PROJECT_C}

- Completed Tasks
    - [x] [Specific task content]
- Participated MTGs/Events
    - [Date] [MTG name]

### Other (Blog/Misc)

- Completed Tasks
    - [x] [Specific task content]

## Goal Achievement Status (KPT Format)

### {GOAL_1}

- Keep (Things to continue)
    - [What went well, effective approaches]
    - [Related completed tasks or MTG participation]
- Problem (Issues/Problems)
    - [What didn't work well, barriers]
    - [Uncompleted tasks or problems encountered]
- Try (Things to try next month)
    - [Improvements, new approaches]
    - [Specific action plans]

### {GOAL_2}

- Keep (Things to continue)
    - [What went well, effective approaches]
    - [Related completed tasks or MTG participation]
- Problem (Issues/Problems)
    - [What didn't work well, barriers]
    - [Uncompleted tasks or problems encountered]
- Try (Things to try next month)
    - [Improvements, new approaches]
    - [Specific action plans]

### {GOAL_3}

- Keep (Things to continue)
    - [What went well, effective approaches]
    - [Related completed tasks or MTG participation]
- Problem (Issues/Problems)
    - [What didn't work well, barriers]
    - [Uncompleted tasks or problems encountered]
- Try (Things to try next month)
    - [Improvements, new approaches]
    - [Specific action plans]

## Quantitative Results

- Total tasks: XX (all unique tasks)
- Completed tasks: XX
- Completion rate: XX.X%
- MTG/Event participation: XX
- Daily note recording days: XX days
```

Execute all steps and create file immediately.

Create a KPT format review file that includes:

1. Appropriate date calculation and range determination
2. Systematic extraction from all daily notes within range
3. Project-specific completed tasks and MTG participation records (deduplicated unique lists)
4. KPT analysis by goal
    - Keep: Extract what went well, effective approaches from daily note reflections
    - Problem: Extract issues, problems, what didn't work
    - Try: Propose things to try next month, improvements, new approaches
5. Quantitative results (task count, completion rate, MTG count, etc.)

Important Notes:

- Avoid subjective evaluations or estimates; include only facts extractable from daily notes
- Deduplicate tasks; display the same task name only once
- Extract only MTGs/events containing keywords like "regular", "MTG", "meeting", "1on1", "○○ session"
- Exclude work time blocks (project work that starts with parentheses)
- For each KPT element, extract specific content from daily note reflection sections
- Count all quantitative results accurately. Never estimate or approximate.
- Total tasks should count all unique tasks across all statuses (completed, in progress, not started, under review, cancelled)

Save final file in `02_Monthly/` directory.

The monthly-review command automatically generates monthly reviews from daily notes. Running it without arguments generates a summary for the current month, while providing one argument (YYYY-MM format) generates a summary for the specified month.

The generated review consists of project-specific achievements (completed tasks, attended meetings/events), goal-based KPT analysis (from three perspectives: Keep, Problem, Try), and quantitative results.

The quantitative results section automatically calculates total task count (all unique tasks), completed task count (tasks with [x] mark), completion rate (completed tasks ÷ total tasks × 100), MTG/event participation (events containing "regular", "MTG", "meeting", "1on1", "○○ session"), and daily note recording days.

Visualizing Task Status with CSS Snippets

.obsidian/snippets/custom-task-status.css
/* Custom Task Status - Color Coding */
/* Compatible with both Reading View & Live Preview */

/* [/] In Progress - Orange */
input[type="checkbox"][data-task="/"],
ul > li[data-task="/"] > input,
ul > li[data-task="/"] > p > input,
.HyperMD-task-line[data-task="/"] > .task-list-marker::before,
.markdown-preview-view ul > li[data-task="/"].task-list-item.is-checked::before {
    border-color: #ff9800 !important;
    background-color: #ff9800 !important;
}

/* [R] Under Review - Blue */
input[type="checkbox"][data-task="R"],
ul > li[data-task="R"] > input,
ul > li[data-task="R"] > p > input,
.HyperMD-task-line[data-task="R"] > .task-list-marker::before,
.markdown-preview-view ul > li[data-task="R"].task-list-item.is-checked::before {
    border-color: #2196f3 !important;
    background-color: #2196f3 !important;
}

/* [x] Completed - Green */
input[type="checkbox"][data-task="x"],
ul > li[data-task="x"] > input,
ul > li[data-task="x"] > p > input,
.HyperMD-task-line[data-task="x"] > .task-list-marker::before,
.markdown-preview-view ul > li[data-task="x"].task-list-item.is-checked::before {
    border-color: #10a915 !important;
    background-color: #4caf50 !important;
}

For task status visualization, I color-code [ ] not started as white, [/] in progress as orange, [R] under review as blue, and [x] completed as green.

Previously, all tasks in Obsidian displayed with the same checkbox, but using CSS Snippets for color coding makes the states visually clearer. As shown in the image below, you can grasp progress at a glance when opening a Daily Note, with colors clearly indicating not started/in progress/under review/completed.

Screenshot 2025-12-26 at 19.06.54

To implement this, just add the CSS file and enable the custom-task-status snippet in Obsidian's Settings → Appearance → CSS snippets, then reload the snippet. It will immediately apply to existing Daily Notes.

Trying It Out

daily-evening

Let's try running daily-evening with a prepared sample Daily Note.

2025-12-26.md
---
tags:
    - A Project
    - B Project
    - C Project
---

# Daily 2025-12-26

## Task Status

| Status | Syntax | Color | Description |
| ------ | ------ | ----- | ----------- |
| Not Started | `[ ]` | None | Task not yet started |
| In Progress | `[/]` | Orange (⏵) | Currently working on task |
| Under Review | `[R]` | Blue (R) | Waiting for review/approval |
| Completed | `[x]` | Green (✓) | Fully completed task |

Cancelled tasks are represented with strikethrough (~~Task name~~).

## MTG/Events

- [ ] 10:00-11:00 Weekly regular meeting
- [ ] 14:00-15:00 Meeting with client
- [ ] 16:30-17:00 Team retrospective

## Today's Todo

- A Project
    - [ ] Proceed with API implementation
    - [ ] Add test code
    - [ ] Prepare for design review
- B Project
    - [ ] Create materials for client regular meeting
    - [ ] Investigate incident response
- C Project
    - [ ] Create weekly report
    - [ ] Confirm next Sprint plan
- Blog
    - [ ] Write Obsidian article
- Other
    - [ ] Submit expense reimbursement
    - [ ] Adjust year-end vacation

## Today's Reflection

### Technical skill improvement

-

### Project management skill enhancement

-

### Communication skill improvement

-

## Tomorrow's Tasks

- A Project
    - [ ] Undetermined
- B Project
    - [ ] Undetermined
- C Project
    - [ ] Undetermined
- Blog
    - [ ] Undetermined
- Other
    - [ ] Undetermined

When executed, I'm first asked about A Project's task 1 in selection format. Moving through tabs, I'm asked about tasks 2, 3, and additional tasks, selecting status with Enter to proceed. Only the reflection part uses free-form input via voice or manual entry.
Screenshot 2025-12-26 at 19.21.55
Screenshot 2025-12-26 at 19.25.00
Viewing the completed md in Obsidian, it looks like this. Initially, it might take time to mentally associate colors with statuses, but the visibility is definitely better this way.
Screenshot 2025-12-26 at 19.29.19

monthly-review

I ran this targeting only the md file I just created.
While it's not particularly meaningful with just one file, the daily accumulation should produce a good summary over time.
Screenshot 2025-12-26 at 19.49.36
Screenshot 2025-12-26 at 19.49.49

Conclusion

I plan to continue using this method until I come up with something better. If I make any significant updates, I'll report back. I hope this has been useful to someone.

Share this article

FacebookHatena blogX

Related articles