This plugin integrates a customizable Pomodoro timer into your Obsidian workspace, helping you focus and manage your time effectively.
- Customizable Timer: Set your work and break intervals to suit your productivity style.
- Audible Alerts: Stay on track with audio notifications signaling the end of each session.
- Status Bar Display: Monitor your progress directly from Obsidian's status bar to keep focusing.
- Daily Note Integration: Automatically log your sessions in your daily notes for better tracking.
- Task Tracking: Automatically refresh the 'actual time' field for the task in focus.
- Put the audio file into your vault.
- Set its path ralative to the vault's root.
For example: your audio file is in
AudioFiles
and namednotification.mp3
, your path would beAudioFiles/notification.mp3
. Don't forget the file extension (like.mp3
,.wav
etc.). - Click the
play
button next to the path to verify the audio
To activate this feature, first enable it in the settings. Then add pomodoros inline-field after your task's text description as below. The pomodoro timer will then automatically update the actual count at the end of each work session.
Important: Ensure to add this inline-field before the Tasks plugin's fields. Placing it elsewhere may result in incorrect rendering within the Tasks Plugin.
- [ ] Task with specified expected and actual pomodoros fields [🍅:: 3/10]
- [ ] Task with only the actual pomodoros field [🍅:: 5]
- [ ] With Task plugin enabled [🍅:: 5] ➕ 2023-12-29 📅 2024-01-10
The standard log formats are as follows For those requiring more detailed logging, consider setting up a custom [log template](#Custom Log Template) as described below.
Simple
**WORK(25m)**: 20:16 - 20:17
**BREAK(25m)**: 20:16 - 20:17
Verbose
- 🍅 (pomodoro::WORK) (duration:: 25m) (begin:: 2023-12-20 15:57) - (end:: 2023-12-20 15:58)
- 🥤 (pomodoro::BREAK) (duration:: 25m) (begin:: 2023-12-20 16:06) - (end:: 2023-12-20 16:07)
- Install the Templater plugin.
- Compose your log template script using the
log
object, which stores session information.
// TimerLog
{
duration: number, // duratin in minutes
session: number, // session length
finished: boolean, // if the session is finished?
mode: string, // 'WORK' or 'BREAK'
begin: Moment, // start time
end: Moment, // end time
task: TaskItem, // focused task
}
// TaskItem
{
path: string, // task file path
fileName: string, // task file name
text: string, // the full text of the task
name: string, // editable task name (default: task description)
status: string, // task checkbox symbol
blockLink: string, // block link id of the task
checked: boolean, // if the task's checkbox checked
done: string, // done date
due: string, // due date
created: string, // created date
cancelled: string, // cancelled date
scheduled: string, // scheduled date
start: string, // start date
description: string, // task description
priority: string, // task priority
recurrence: string, // task recurrence rule
tags: string[], // task tags
expected: number, // expected pomodoros
actual: number // actual pomodoros
}
here is an example
<%*
if (log.mode == "WORK") {
if (!log.finished) {
tR = `🟡 Focused ${log.task.name} ${log.duration} / ${log.session} minutes`;
} else {
tR = `🍅 Focused ${log.task.name} ${log.duration} minutes`;
}
} else {
tR = `☕️ Took a break from ${log.begin.format("HH:mm")} to ${log.end.format(
"HH:mm"
)}`;
}
%>
This DataView script generates a table showing Pomodoro sessions with their durations, start, and end times.
```dataviewjs const pages = dv.pages() const table = dv.markdownTable(['Pomodoro','Duration', 'Begin', 'End'], pages.file.lists .filter(item=>item.pomodoro) .sort(item => item.end, 'desc') .map(item=> { return [item.pomodoro, `${item.duration.as('minutes')} m`, item.begin, item.end] }) ) dv.paragraph(table) ```
This DataView script presents a summary of Pomodoro sessions, categorized by date.
```dataviewjs const pages = dv.pages(); const emoji = "🍅"; dv.table( ["Date", "Pomodoros", "Total"], pages.file.lists .filter((item) => item?.pomodoro == "WORK") .groupBy((item) => { if (item.end && item.end.length >= 10) { return item.end.substring(0, 10); } else { return "Unknown Date"; } }) .map((group) => { let sum = 0; group.rows.forEach((row) => (sum += row.duration.as("minutes"))); return [ group.key, group.rows.length > 5 ? `${emoji} ${group.rows.length}` : `${emoji.repeat(group.rows.length)}`, `${sum} min`, ]; }) ) ```
Variable | Default |
---|---|
--pomodoro-timer-color | var(--text-faint) |
--pomodoro-timer-elapsed-color | var(--color-green) |
--pomodoro-timer-text-color | var(--text-normal) |
--pomodoro-timer-dot-color | var(--color-ted) |
- How to Switch the Session
To switch sessions, simply click on the Work/Break
label displayed on the timer.
- How to completely disable
Break
sessions
You can adjust the break interval setting to 0
, this will turn off Break
sessions.