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.2.tar.gz (18.4 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.2-py3-none-any.whl (11.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: zettelkasten_cli-1.0.2.tar.gz
  • Upload date:
  • Size: 18.4 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.2.tar.gz
Algorithm Hash digest
SHA256 9e6b98e44139757642eb2060b74d5b5340dc8e50d8bfcca4b2ca2a5aaec1f648
MD5 59b32530d84fd354f2ed7d5b72ffb548
BLAKE2b-256 a649beb14ec73f49c847218d64db52f6f4e6dfe6c46452827bbefc1e54c9f988

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zettelkasten_cli-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 5ed1f341d8cb0d995bba3c9e0bec13c06a08c55835916f1b4200e0de16813ec5
MD5 38e452f00f03c5dbfa916f2ba6d796fa
BLAKE2b-256 5419b266b6f4b4f9d1b221fb11e342f21cb1661c4f3cc47c5f8bc452e744c7cc

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