Modification Dates

When synchronizing notes across devices or using version control, the file’s modification time may not reflect when you actually last edited the note. Other external tools also might be touching the file while not changing the contents. zk offers custom Date Keys to allow overriding the modification date in the frontmatter of notes.

Configuration

First, configure zk to use the changed frontmatter key to obtain the modification date in .zk/config.toml:

[format.markdown.frontmatter]
modification-date-key = "changed"

See the configuration of Date Keys for more information.

Then update your notes’ frontmatter to include the key with a date value:

---
changed: 2025-12-29 09:48
---

Automatically Updating Dates

Since manually changing the modification date is tedious, external tools can be automated to automatically update the date in the changed key of the frontmatter.

Neovim with Autocommands

Add this to your Neovim configuration to update the changed field whenever you save a Markdown file:

vim.api.nvim_create_autocmd("BufWritePre", {
  pattern = "*.md",
  callback = function(args)
    local lines = vim.api.nvim_buf_get_lines(args.buf, 0, -1, false)
    local in_frontmatter = false

    for i, line in ipairs(lines) do
      if line:match("^%-%-%-$") then
        if not in_frontmatter then
          in_frontmatter = true
        else
          break
        end
      elseif in_frontmatter and line:match("^changed:%s") then
        local new_line = "changed: " .. os.date("%Y-%m-%d %H:%M")
        vim.api.nvim_buf_set_lines(args.buf, i - 1, i, false, { new_line })
        return
      end
    end
  end,
})

Git Pre-commit Hook

Create a Git pre-commit hook to automatically update modification dates before committing. Save this as .git/hooks/pre-commit in your notebook repository:

#!/usr/bin/env sh

git diff --cached --name-status | egrep -i "^(A|M).*\.(md)$" | while read a file; do
    sed --in-place "/---.*/,/---.*/s/^changed: [0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}$/changed: $(date "+%Y-%m-%d %H:%M")/" $file
    git add $file
done