Skip to main content

A CLI for managing your Neovim + Obsidian Zettelkasten

Project description

Zettelkasten CLI

A bespoke CLI for my Neovim + Obsidian Zettelkasten written in Python.

Installation

From PyPI

pip install zettelkasten-cli

Or with uv:

uv tool install zettelkasten-cli

From Source

git clone https://github.com/mischavandenburg/zettelkasten-cli.git
cd zettelkasten-cli
uv sync
uv run zk --help

Configuration

Environment Variables

Variable Required Default Description
ZETTELKASTEN Yes - Path to your Zettelkasten root directory
ZETTELKASTEN_INBOX_DIR No 0 Inbox Directory for new notes (relative to root)
ZETTELKASTEN_DAILY_DIR No periodic-notes/daily-notes Directory for daily notes (relative to root)
ZETTELKASTEN_WEEKLY_DIR No periodic-notes/weekly-notes Directory for weekly notes (relative to root)
ZETTELKASTEN_DAILY_TEMPLATE No zk/daily.md Path to daily note template (relative to root)
ZETTELKASTEN_WEEKLY_TEMPLATE No zk/weekly.md Path to weekly note template (relative to root)
ZETTELKASTEN_EDITOR No nvim Editor command (nvim, vim, hx, code, etc.)
ZETTELKASTEN_NVIM_ARGS No + normal Gzzo Arguments passed to Neovim when opening notes
ZETTELKASTEN_NVIM_COMMANDS No :NoNeckPain Comma-separated Neovim commands to run on open

Add to your shell profile (e.g., ~/.bashrc or ~/.zshrc):

export ZETTELKASTEN="$HOME/Documents/Zettelkasten"

# Optional: customize inbox directory
export ZETTELKASTEN_INBOX_DIR="Inbox"

# Optional: customize periodic notes directories
export ZETTELKASTEN_DAILY_DIR="daily-notes"
export ZETTELKASTEN_WEEKLY_DIR="weekly-notes"

# Optional: customize template locations
export ZETTELKASTEN_DAILY_TEMPLATE="templates/daily.md"
export ZETTELKASTEN_WEEKLY_TEMPLATE="templates/weekly.md"

# Optional: use a different editor
export ZETTELKASTEN_EDITOR="hx"  # or vim, code, etc.

# Optional: customize Neovim behavior (only applies when using nvim)
export ZETTELKASTEN_NVIM_ARGS="+ normal Gzzo"
export ZETTELKASTEN_NVIM_COMMANDS=":NoNeckPain,:set wrap"

Default Directory Structure

With default settings, the CLI expects the following structure:

$ZETTELKASTEN/
├── 0 Inbox/              # New notes are created here
├── periodic-notes/
│   ├── daily-notes/      # Daily notes (YYYY-MM-DD.md)
│   ├── weekly-notes/     # Weekly notes (YYYY-Www.md)
│   ├── monthly-notes/    # (not yet implemented)
│   └── yearly-notes/     # (not yet implemented)
└── zk/
    ├── daily.md          # Template for daily notes
    └── weekly.md         # Template for weekly notes

All paths are configurable via environment variables.

Templates

Templates are read from the configured template paths. If templates don't exist, minimal defaults are used.

Usage

zk [OPTIONS] COMMAND [ARGS]...

Options:

  • --install-completion: Install completion for the current shell.
  • --show-completion: Show completion for the current shell.
  • --help: Show this message and exit.

Commands:

  • day: Open daily note or create if it doesn't exist.
  • week: Open weekly note or create if it doesn't exist.
  • new: Create a new note with the provided title.

zk day

Open daily note or create if it doesn't exist.

zk day [OPTIONS]

zk week

Open weekly note or create if it doesn't exist.

zk week [OPTIONS]

zk new

Create a new note with the provided title. Will prompt if no title given. Adds Obsidian markdown link to the daily note.

zk new [OPTIONS] [TITLE]

Arguments:

  • [TITLE] - Note title (optional, will prompt if not provided)

Options:

  • --vim: Indicates input is coming from Neovim. Suppresses rich output.

Development

# Install dependencies
uv sync

# Run linter
uv run ruff check .

# Run tests
uv run pytest

# Build package
uv build

Releasing

This project uses release-please for automated releases.

  1. Use Conventional Commits for commit messages:

    • feat: for new features (bumps minor version)
    • fix: for bug fixes (bumps patch version)
    • feat!: or fix!: for breaking changes (bumps major version)
  2. When commits are pushed to main, release-please creates/updates a release PR

  3. Merging the release PR automatically:

    • Creates a GitHub release with changelog
    • Publishes to PyPI

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

zettelkasten_cli-1.0.1.tar.gz (18.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

zettelkasten_cli-1.0.1-py3-none-any.whl (11.0 kB view details)

Uploaded Python 3

File details

Details for the file zettelkasten_cli-1.0.1.tar.gz.

File metadata

  • Download URL: zettelkasten_cli-1.0.1.tar.gz
  • Upload date:
  • Size: 18.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for zettelkasten_cli-1.0.1.tar.gz
Algorithm Hash digest
SHA256 9cf8b5fc76c90836344ee3b02263ff6d7fd976e7318bf53252792a59c88d9665
MD5 9072c776cd9d696d5d81c60de1f74adb
BLAKE2b-256 014cfe81796673f062f65a3e1bf81341c06946df7514e51e3ac3f7ec130a0e86

See more details on using hashes here.

File details

Details for the file zettelkasten_cli-1.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for zettelkasten_cli-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 56c35207f4b12cd19539f2707d6c1e44c7bfdee972d569fd723bcdefd7f89d25
MD5 aa2649ad6a114ce5f8d762cc095aad3f
BLAKE2b-256 383fb21b2df1074c932d5b98c56fb98dc6b1da869893955b9171b18c3815d8de

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page