retr0h/jot

Terminal notes + todos with linked tasks.

โ˜… 0Forks 0GoGitHub โ†—Compare
cligolangjotmacosmarkdownmcpnotesretroterminaltodo

README

go report card license build codecov conventional commits built with just github commit activity hovnokod

jot

Terminal-first markdown notes + todos with linked tasks.

Plain .md files with YAML frontmatter, edited in nvim with obsidian.nvim. Write [[slug]] wiki links to connect notes, embed checkbox tasks with #tags to create linked todos, and let jot track everything in git โ€” every save is a commit. Sensitive notes encrypt at rest via kvlt (age + SSH keys). An MCP server exposes the full surface to LLM agents. No database: files are the source of truth.

๐Ÿ“ฆ Install

Requires neovim with plugins โ€” see nvim Setup below. Also requires ripgrep and fzf for search.

curl -fsSL https://github.com/retr0h/jot/raw/main/install.sh | bash

๐Ÿ”จ Build from source

git clone https://github.com/retr0h/jot.git
cd jot
go build -o jot .

๐Ÿš€ Quick Start

jot init
jot note new --title "Sprint Planning"
jot note new --title "network/Switch Config"
jot note new --title "secrets/API Keys" --secure
cat meeting.md | jot note new --title "Meeting Notes"
echo "secret stuff" | jot note new --title "Credentials" --secure
jot note list
jot note search --query "kubernetes"
jot task list
jot task due
jot git log

โœจ Features

Feature Description
Markdown notes .md files with YAML frontmatter, edited in nvim
[[wiki links]] Cross-reference notes by slug; obsidian.nvim navigates
Checkbox tasks - [ ] desc | due:date #tag with due dates + tags
Git-backed Every edit auto-commits; jot git log/diff/show
Secure vaults --secure encrypts notes via kvlt (age + SSH keys)
Full-text search Concurrent goroutine file scan โ€” no index, no database
MCP server 8 tools over stdio for Claude / Cursor / any MCP client
Subdirectory nesting jot note new --title "ops/runbook" for organization
nvim plugin Ships lua/jot/ โ€” auto-configures obsidian.nvim
Max Headroom palette Magenta #c678dd accent across CLI, installer, nvim

๐Ÿ“ Note Format

---
title: Team standup 2026-05-14
tags: [work, meetings]
created: 2026-05-14
---

# Team standup 2026-05-14

Discussed the [[deployment-runbook]] and next steps.

- [ ] follow up on infra ticket | due:friday #work #ops
- [ ] review PR before EOD #work
- [x] Send meeting summary | done:2026-05-14
- [ ] Update [[deployment-runbook]]

[[slug]] links connect notes. Checkbox tasks create linked todos. #tags are searchable via CLI (jot tag list) and nvim (<leader>jt). Frontmatter tags: arrays are also recognized.

๐Ÿ–ฅ๏ธ nvim Setup

vim.pack.add({"https://github.com/epwalsh/obsidian.nvim.git"})
vim.pack.add({"https://github.com/OXY2DEV/markview.nvim.git"})
vim.pack.add({"https://github.com/retr0h/jot.git"})

jot ships an nvim plugin that auto-configures obsidian.nvim and markview.nvim when $JOT_NOTES_DIR is set (jot sets this automatically when spawning the editor). Zero manual config.

Keybindings

Key Action
<leader>j? Show keybindings (:JotHelp)
<leader>jf Follow [[link]] under cursor
<leader>jj Jump to note (fuzzy switch)
<leader>js Search notes (ripgrep)
<leader>jt Browse #tags
<leader>jb Backlinks to current note
<leader>jl Links in current note
<leader>jn New note
<leader>jx Toggle [ ] / [x] done
[[ Autocomplete note slugs
# Autocomplete tags

Snippets

Type task then Enter to expand with tab-stop placeholders:

- [ ] description | due:today #tag

Tab jumps between placeholders. Date completions (next 7 days + day names) appear automatically while typing the due field.

๐Ÿค– MCP Server

Auto-discovered by Claude Code via .mcp.json:

{
  "mcpServers": {
    "jot": { "command": "jot", "args": ["mcp", "start"] }
  }
}
Tool Description
list_notes List notes, optionally filtered by tag
get_note Read full markdown by slug (transparently decrypts secure notes)
create_note Create a note with frontmatter (supports secure: true)
delete_note Remove a note file
search_notes Full-text search
rename_note Rename a note and rewrite all [[wikilinks]]
encrypt_note Encrypt an existing note via kvlt
decrypt_note Decrypt a secure note back to plaintext
list_tasks Tasks filtered by status/tag
task_done Mark a task as complete
tasks_due Tasks due in a date range
list_tags All tags across notes

Secure notes over MCP require passphrase-free SSH keys configured in ssh_keys โ€” there is no TTY for interactive prompts.

โš™๏ธ Configuration

~/.config/jot/jot.yaml:

# notes_dir: ""       # override notes directory
# ssh_keys: []        # SSH key paths for kvlt (empty = auto-discover ~/.ssh/)

Git is always on โ€” every edit auto-commits. See Configuration for the full reference (env vars, flags, precedence, SSH keys).

๐Ÿ“– Documentation

  • Configuration โ€” env vars, flags, SSH keys, data layout
  • Development โ€” architecture, testing conventions, adding commands
  • Contributing โ€” commit style, lint chain, PR checklist

๐Ÿ“„ License

MIT

Contributors

retr0hdependabot[bot]

Issues