Task Logger
A lightweight VS Code extension for quickly moving task details from Markdown checklists into a task-log.md file using a keyboard shortcut.
Features
- Log selected text — highlight part of a task and press
Ctrl + Alt + L.
- Log entire task details — place the cursor on a task without selecting text and press
Ctrl + Alt + L.
- Toggle a task — press
Ctrl + Alt + C to tick or untick the checkbox on the current line (or every line in the selection).
- Open the task log — press
Ctrl + Alt + Shift + L to jump straight to task-log.md.
- Open the universal log — press
Ctrl + Alt + Shift + U for this month's shared log; press it again to reveal the folder.
- Automatically removes logged content from the original Markdown file.
- Preserves the task title in the log.
- Stamps every entry with its source — a link back to the Markdown file the text came from and the time it was logged (can be turned off).
- Works on plain task lines too — with no
**Task Name:** on the line, the nearest Markdown header above it stands in as the title, falling back to the file name.
- Atomic undo — one
Ctrl + Z reverses both the source file and the log entry (can be turned off).
- Optional universal log — point the extension at a folder and every logged task is also appended to a shared monthly log, on top of the local
task-log.md.
- Automatically creates
task-log.md if it doesn't exist.
- No external services or dependencies.
Installation
Install a packaged build with:
code --install-extension .\task-logger-1.0.0.vsix
or use Install from VSIX… in the Extensions view (Ctrl + Shift + X → … menu).
To run it from source instead, see Development below.
Packaging, publishing, team distribution, post-install configuration, and troubleshooting are
covered in
-worktable/docs/guides/deployment-and-setup-guide.md.
Example
Given sprint.md:
1. [ ] **Project Alpha:** Deploy containers + update billing
Select update billing and press Ctrl + Alt + L:
1. [ ] **Project Alpha:** Deploy containers +
task-log.md:
- **Project Alpha:** update billing *([sprint.md](vscode://file/c:/work/sprint.md) · 2026-08-14 14:32)*
Alternatively, with no selection, pressing Ctrl + Alt + L logs the entire task content:
- **Project Alpha:** Deploy containers + update billing *([sprint.md](vscode://file/c:/work/sprint.md) · 2026-08-14 14:32)*
The preferred task line contains an explicit title:
**Task Title:** Task details
For example:
1. [ ] **Project Alpha:** Investigate deployment issue
Lines without a task title
The shortcut still works when the line has no **Task Title:**. The title is then taken from, in order:
- The nearest Markdown header (
# … ######) at or above the line.
- The file name, when there is no header above the line.
Given sprint.md:
## Project Alpha
- [ ] Investigate deployment issue
Pressing Ctrl + Alt + L on the task line leaves:
## Project Alpha
and logs:
- **Project Alpha:** Investigate deployment issue *([sprint.md](vscode://file/c:/work/sprint.md) · 2026-08-14 14:32)*
With no header anywhere above the line, the entry would read - **sprint:** Investigate deployment issue followed by the same stamp.
Because there is no **Task Name:** to keep the line meaningful, the whole line goes — bullet, number, and checkbox included — rather than leaving an empty list item behind. Lines that do have a title keep their **Task Name:** as before.
Highlighting part of such a line works the same way as always, removing just the highlighted text. Pressing the shortcut on a header line itself logs nothing, since the header is what supplies the title.
Settings
| Setting |
Type |
Default |
Description |
taskLogger.atomicUndo |
boolean |
true |
Treat the source-file change and the task-log.md change as one operation. |
taskLogger.stampSource |
boolean |
true |
Add a source-file link and a timestamp to each log entry. |
taskLogger.universalLogFolder |
string |
"" |
Parent folder of an optional second, shared log. Empty means local only. |
Source stamp
Logging is destructive — the text is removed from the Markdown file, so the log entry becomes its only copy. Each entry therefore ends with a stamp saying where that copy came from and when it was made:
- **Project Alpha:** update billing *([sprint.md](vscode://file/c:/work/sprint.md) · 2026-08-14 14:32)*
The file name is a link, so Ctrl + click in the Markdown preview opens the source file. This matters most because a single task-log.md serves every Markdown file in its directory — without the stamp, entries from sprint.md and backlog.md are indistinguishable, especially when both fall back to a header for their title.
The link target is an absolute path rather than a relative one, so it still resolves after the log has been moved, copied into another document, or opened from a different folder. The visible text stays the bare file name to keep entries readable; the full path lives in the link.
It is written as a vscode://file/... URI rather than the more obvious file:///.... Markdown will not render a file: link at all — the parser behind VS Code's preview blocks that scheme for security and leaves the raw [text](https://github.com/AnesAbbas/Task-Logger-VS-Code-Extension-/blob/HEAD/url) on the page. The editor's own scheme is allowed through and opens the file. The scheme follows the edition you run, so Insiders and VSCodium get links into their own window.
One consequence: the link is only useful inside the editor. Viewed on GitHub or another web host, the stamp still reads correctly but the file name will not be clickable, because web renderers only linkify http and a few similar schemes.
The timestamp is local time, in YYYY-MM-DD HH:MM form.
Because the link holds an absolute path, a shared or committed task-log.md carries the folder structure of the machine it was written on. Turn the setting off if that matters for a given log.
No line number is recorded. The logged text is gone from that line as soon as the entry is written — and a line logged without a **Task Name:** is removed entirely, shifting everything below it — so a line number would be wrong from the start. The stamp records what stays true: the file and the time.
Turn taskLogger.stampSource off for plain - **Title:** content entries.
Atomic undo
With taskLogger.atomicUndo on (the default), logging applies every change in a single VS Code workspace edit. Pressing Ctrl + Z in the source file restores the task text and removes the log entry — VS Code asks for confirmation before undoing across files when the log has been edited since. If the extension had to create task-log.md, undo removes the file again.
When a universal log is configured, its entry joins the same edit, so one Ctrl + Z reverses all three files together (see below).
Log entries are saved to disk as usual, so undoing leaves the log files with unsaved changes until you save them.
Turn the setting off to restore the original behavior: the log file is written straight to disk, and undo in the source file leaves the log entry in place.
Universal task log
task-log.md is local by design — one log per folder, sitting next to the Markdown files it came from. That keeps each project's history with the project, but it also means a week's work is scattered across as many logs as there are folders.
The universal task log is an optional second destination that collects all of it in one place. It changes nothing about the local log: every logged task still goes into task-log.md exactly as before, and is then copied to the universal log as well.
Setting it up
Run Task Logger: Set Universal Log Folder from the Command Palette. A native folder picker opens; choose the folder you want the log to live under. The path is saved to taskLogger.universalLogFolder in your user settings — there is nothing to type, and no path to mistype.
The command works with no workspace open, and the setting is stored globally, so the same universal log serves every folder and window.
Where entries go
The folder you pick is the parent. The extension keeps its own subfolder inside it and splits entries into one file per month:
C:\Users\User\Documents\Task Logs\ ← the folder you pick
└── Universal Task Log\ ← created by the extension
├── 2026-07.md
└── 2026-08.md
So a task logged in August 2026 lands in:
C:\Users\User\Documents\Task Logs\Universal Task Log\2026-08.md
The Universal Task Log folder is created automatically when the first task is logged — not when you pick the folder — so choosing a folder never leaves an empty directory behind. Picking a parent that already contains other files is fine; everything the extension writes stays inside its own subfolder.
Reading it back
Ctrl + Alt + Shift + U opens the current month's file — the one holding what you logged today. Press it again, while that file is still the active editor, and the folder opens in Windows Explorer with the file selected, so you can get at earlier months.
The first press works from anywhere in the workbench, including with no file open. If no universal folder is set yet, it offers to run the picker rather than just complaining. An empty month file is created if this month has nothing in it yet, so the shortcut always ends in an open editor.
The entry is byte-for-byte the one written to task-log.md, source stamp included. The stamp matters more here than anywhere: entries from every folder on the machine share these files, and the link is what says where each one came from.
Behavior notes
- Local logging is unchanged. Turning the universal log on adds a destination; it never redirects or replaces
task-log.md.
- Undo covers it too. With
taskLogger.atomicUndo on (the default), the source file, task-log.md, and the universal log are all changed in one workspace edit, so a single Ctrl + Z removes both log entries along with restoring the task text. The two logs can never drift apart. With the setting off, both logs are written straight to disk and neither takes part in undo.
- If the universal folder can't be reached — an unplugged drive, a read-only folder — the extension says so and falls back to logging locally only. The task is never lost to a problem with the second destination.
- To turn it off, clear
taskLogger.universalLogFolder in Settings. Files already written are left alone.
Development
Requirements
Run locally
- Open the repository in VS Code.
- Press
F5.
- A new Extension Development Host window opens.
- Open a Markdown file and test
Ctrl + Alt + L.
No external dependencies are currently required.
Package a build
npx @vscode/vsce package
This needs a publisher field in package.json and a .vscodeignore file — see
-worktable/docs/guides/deployment-and-setup-guide.md
section 5.
Keyboard Shortcuts
| Shortcut |
Action |
Ctrl + Alt + L |
Log selected text or current task |
Ctrl + Alt + C |
Toggle the task(s) on the current line(s) |
Ctrl + Alt + Shift + L |
Open task-log.md for the current file |
Ctrl + Alt + Shift + U |
Open this month's universal log; again for the folder |
Task Logger: Set Universal Log Folder has no shortcut — it is a one-off setup step, run from the Command Palette.
Toggle task
Ctrl + Alt + C toggles the checkbox, so the same shortcut completes a task and reopens it.
1. [ ] **Website:** Fix authentication
becomes:
1. [x] **Website:** Fix authentication
and pressing it again returns the line to [ ].
It works on -, *, +, and numbered list items, and toggles every task line covered by the selection in a single undo step. Each line is toggled on its own state, so a mixed selection ends up inverted rather than forced in one direction.
Open task log
Ctrl + Alt + Shift + L opens the task-log.md sitting next to the current file, creating an empty one if it doesn't exist yet. With no saved file in focus, it falls back to the workspace root.
Open universal task log
Ctrl + Alt + Shift + U opens the current month's universal log — see Universal task log above. Pressing it a second time, with that file still focused, reveals the folder in Windows Explorer so earlier months are one click away.
Project Structure
task-logger/
├── package.json
├── extension.js
├── readme.md
└── -worktable/
├── todos.md
└── docs/
├── candidate-names.md
├── candidate-taglines.md
├── guides/
│ ├── technical-guide.md
│ └── deployment-and-setup-guide.md
└── assesment/
├── concept.md
└── ext-vs-app.md
package.json and extension.js are the only files that ship in a packaged build. Everything
under -worktable/ is working material and is excluded at packaging time — see the
.vscodeignore in the deployment guide.
Documentation
Status
Early, lightweight implementation focused on fast Markdown task logging.