Skip to content
| Marketplace
Sign in
Visual Studio Code>Other>Task LoggerNew to Visual Studio Code? Get it now.
Task Logger

Task Logger

TreehouseTechLabs

| (0) | Free
Log tasks from Markdown with a shortcut. Keep a history of your work.
Installation
Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
Copied to clipboard
More Info

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)*

Supported Format

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:

  1. The nearest Markdown header (# … ######) at or above the line.
  2. 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

  • Visual Studio Code

Run locally

  1. Open the repository in VS Code.
  2. Press F5.
  3. A new Extension Development Host window opens.
  4. 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

Document Covers
Technical guide How the extension works internally
Deployment and setup guide Installing, packaging, publishing, setup

Status

Early, lightweight implementation focused on fast Markdown task logging.

  • Contact us
  • Jobs
  • Privacy
  • Manage cookies
  • Terms of use
  • Trademarks
© 2026 Microsoft