The wiki CLI intelligently discovers your notebook patih.
wiki new --title "My Note"
wiki list --match="pattern"
wiki list --format=json | jq .
Use discovered notebook (auto-discovers path internally)
Common Workflows with wiki CLI
Single Note: Create → Link → Search → Export
# 1. Create new note (auto-discovers notebook)
NOTE_PATH=$(wiki new --title "Research Topic" --print-path)
# 2. Edit file and add links (manual)
echo -e "\n\nRelated: [existing-note-id](Existing Note Title)" >> "$NOTE_PATH"
# 3. Search for related notes
wiki list --match="Research" --format=long
# 4. Export results
wiki list --match="Research" --format=json | jq .
Register Project with Notebook
# Register current project with notebook (for context matching)
wiki project add
Export All Notes from Project
# Get notebook, then export
NOTEBOOK=$(wiki project discover)
wiki list --format=json > all-notes.json
# Validate export
jq . < all-notes.json > /dev/null && echo "Valid JSON"
When to Use
Symptoms:
-
Need to export notes in various formats
-
Want automatic project-to-notebook mapping
-
Working with multiple projects and notebooks When NOT to use:
-
Editing notebook configuration (see zk documentation for
config.toml) -
Advanced templating (templates are Handlebars, see zk docs)
-
LSP setup (language server integration, separate config)
wiki vs. Direct zk Commands
| Notebook auto-discovery
| wiki CLI
| wiki new --title "Note" (auto-discovers)
| Explicit notebook control
| Direct zk
| zk list -W /path --match="x" (explicit control)
| Register project context
| wiki project add
| Helps future discovery for this project
Quick Reference: wiki CLI Commands
| Create note
| wiki new --title "Title" --print-path
| Auto-discovers notebook; returns path
| List all notes
| wiki list
| Defaults to table format
| Search pattern
| wiki list --match="pattern"
| Regex or plain text
| Export JSON
| wiki list --format=json > file.json
| Use redirection for output
| Export CSV
| wiki list --format=csv > file.csv
| RFC 4180 compliant; use CSV parser
| Export oneline
| wiki list --format=oneline > file.txt
| Minimal format, easy to parse
| Find backlinks
| wiki list --linked-by=<note-id>
| Shows notes linking to target
| Show note details
| wiki list --match=<note-id> --format=long
| Includes metadata and preview
Quick Reference: Direct zk Commands (When You Need Explicit Control)
| Create note
| zk new -W <dir> --title "Title" --print-path
| Explicit notebook path required
| List all notes
| zk list -W <dir>
| Always include -W flag
| Search pattern
| zk list -W <dir> --match="pattern"
| Regex or plain text
| Export JSON
| zk list -W <dir> --format=json > file.json
| Use redirection for output
| Export CSV
| zk list -W <dir> --format=csv > file.csv
| RFC 4180 compliant; use CSV parser
| Find backlinks
| zk list -W <dir> --linked-by=<note-id>
| Shows notes linking to target
Filtering Options
| Title/body
| --match="pattern"
| zk list -W /nb --match="daily"
| Regex or plain text search
| Linked-by
| --linked-by=<id>
| zk list -W /nb --linked-by=abc123
| Show notes linking to abc123
| Other filters
| Check zk list --help
| zk list --help | grep -i filter
| ZK may have additional filters not listed
Important: For any filtering not shown here, always verify with zk list --help before assuming syntax. ZK may add new filters in newer versions. |
|---|
Understanding Notebook Discovery
The wiki CLI automatically handles notebook discovery using a smart search algorithm. No need to manually specify -W flags.
How wiki Discovers Your Notebook
When you run any wiki command, it searches in this order:
-
Environment variable
NOTEBOOK_PATH(if explicitly set) -
Ancestor directories for
.zk/config.toml(finds project-local notebooks) -
Context registry in
~/Notes/(matches your project path to a registered notebook) -
Global fallback
~/.config/zk/config.toml(if it defines anotebook.dir) Advantage: You don't need to worry about getting the path wrong. Just runwikicommands.
Direct zk Commands: Explicit -W Flag Required
If you bypass wiki and use zk directly, you must always include -W:
# ❌ DON'T - unsafe, ambiguous which notebook is used
zk list --match="search"
# ✅ DO - explicit notebook path
zk list -W /path/to/notebook --match="search"
If you're in ~/projects/project-a/notes/ and run zk list without -W, it might find ~/projects/.zk instead.
Troubleshooting: Verify Which Notebook Is Active
# Using wiki (recommended)
wiki project discover
# Returns: /path/to/notebook
# Using direct zk with explicit path
zk info -W /path/to/notebook
# Shows: notebook path, config, note count
Link Creation Patterns
ZK does not have a zk link command. Links are created by editing markdown files directly:
Wiki-style Links (Most Common)
This note connects to [[other-note-id]] and [[another-one]].
ZK automatically resolves these to matching note IDs. The ID can be filename without extension or explicit ID field in note frontmatter.
Markdown Links (Also Valid)
See [related note](/path/to/note.md) for details.
ZK understands both formats. Wiki-style [[]] is preferred for cross-referencing.
Backlink Discovery
Find all notes linking to a specific note:
zk list -W /notebook --linked-by=target-note-id
Export Workflows
Pattern: Use zk list with --format flag + output redirection
Before Any Bulk Export: Safety Checklist
Bulk exports (100+ notes) can be dangerous if not validated:
Do you have a backup of the notebook? (cp -r /notebook /notebook.backup)
Are you exporting to test data first? (Start with --match="test" to validate format)
Do you understand what you're exporting? (Links as refs? Full body? Metadata?)
Is the output format valid? (Test with head -5 export.json | jq .)
Example: Safe bulk export
# 1. Validate on one note
zk list -W /notebook --match="note-id" --format=json | jq .
# 2. Check structure is what you expect
# (inspect the JSON output)
# 3. Export to temp file first
zk list -W /notebook --format=json > /tmp/export.json
# 4. Validate output is valid JSON
jq . < /tmp/export.json > /dev/null && echo "Valid JSON"
# 5. Move to final location
mv /tmp/export.json ~/exports/notes.json
JSON Export (Programmatic)
zk list -W /notebook --match="tag:project" --format=json > export.json
Output includes: id, title, path, body, tags, relationships
CSV Export (Spreadsheet Import)
zk list -W /notebook --format=csv > notes.csv
Output columns: title, path, modified date. Parse with CSV reader, not awk.
Oneline Export (Grep-able)
zk list -W /notebook --format=oneline > index.txt
Output: id - title - path on single line per note
Common Mistakes
| Using zk without -W flag
| Ambiguous which notebook is used
| Use wiki CLI (auto-discovers) or explicit -W /path
| zk export
| No export command exists
| Use wiki list --format=X > file (or zk list -W <dir>...)
| zk link note1 note2
| No link command
| Edit markdown files, add [[note-id]] manually
| wiki list --match="x" fails
| Notebook not discovered
| Run wiki project discover to verify path
| --format json (no redirection)
| Output prints to stdout, not file
| Use > file.json to capture output
| [[filepath]] instead of [[id]]
| Wiki-links use ID, not path
| Use note ID or filename without extension
| Assuming links created CLI-side | Links are manually edited | Always add links by editing note files directly
| Hardcoding notebook paths in scripts
| Breaks when project moves
| Use wiki CLI or wiki project discover instead
Reference: Output Formats
Table (Default)
id | title | path
Long (Includes Metadata)
id: xxx
title: My Note
path: /notebook/notes/xxx.md
links: [[id1]], [[id2]]
JSON (Programmatic Parsing)
[{"id":"xxx","title":"My Note","tags":["tag1"],"path":"/notebook/notes/xxx.md"}]
CSV (Spreadsheet Import) — RFC 4180 Compliant
Format: Quoted fields, comma-separated, includes header row
title,path,modified
"My Note",/notebook/notes/xxx.md,2025-01-15
"Note with, comma",/notebook/notes/yyy.md,2025-01-14
Important: Parse CSV with a proper CSV parser, not awk -F',', because titles can contain commas. Example with Python:
import csv
with open('notes.csv') as f:
for row in csv.DictReader(f):
print(row['title'], row['path'])
Oneline (Grep-able)
xxx - My Note - /notebook/notes/xxx.md
Workflow Examples
Single Note: Create → Link → Search → Export (Using wiki CLI)
# 1. Create new note (notebook auto-discovered)
NOTE_PATH=$(wiki new --title "Research Topic" --print-path)
# 2. Edit file and add links (manual)
echo -e "\n\nRelated: [[existing-note-id]]" >> "$NOTE_PATH"
# 3. Search for related notes
wiki list --match="Research" --format=long
# 4. Export results
wiki list --match="Research" --linked-by="research-topic-id" --format=json > related-notes.json
Advantage: No need to discover notebook path manually. wiki handles it.
Single Note: Using Direct zk (When You Need Explicit Control)
# 1. Create new note with explicit notebook path
NOTEBOOK="/path/to/notebook"
NOTE_PATH=$(zk new -W "$NOTEBOOK" --title "Research Topic" --print-path)
# 2. Edit file and add links (manual)
echo -e "\n\nRelated: [[existing-note-id]]" >> "$NOTE_PATH"
# 3. Search for related notes
zk list -W "$NOTEBOOK" --match="Research" --format=long
# 4. Export results
zk list -W "$NOTEBOOK" --match="Research" --linked-by="research-topic-id" --format=json > related-notes.json
Note: Step 2 requires manual file editing. No CLI command creates links; you add them to markdown content.
Bulk: Create Multiple Notes & Link to Master (Using wiki)
For creating 10+ notes that all link to a master note:
#!/bin/bash
MASTER_ID="master-index"
# Create notes in a loop (notebook auto-discovered)
for i in {1..10}; do
NOTE_PATH=$(wiki new \
--title "Topic $i" \
--print-path)
# Add link to master note
echo "" >> "$NOTE_PATH"
echo "See master: [[${MASTER_ID}]]" >> "$NOTE_PATH"
done
# Verify all notes link to master
wiki list --linked-by="$MASTER_ID" --format=long
Advantage: No need to discover or pass notebook path. wiki handles it automatically.
Bulk: Using Direct zk (Explicit Notebook Path)
For explicit control over notebook:
#!/bin/bash
NOTEBOOK="/path/to/notebook"
MASTER_ID="master-index"
# Create notes in a loop
for i in {1..10}; do
NOTE_PATH=$(zk new -W "$NOTEBOOK" \
--title "Topic $i" \
--print-path)
# Add link to master note
echo "" >> "$NOTE_PATH"
echo "See master: [[${MASTER_ID}]]" >> "$NOTE_PATH"
done
# Verify all notes link to master
zk list -W "$NOTEBOOK" --linked-by="$MASTER_ID" --format=long
Constraint: ZK doesn't have a bulk-link command. Manual editing via script is the standard approach.
Export Large Notebook Safely (Using wiki)
#!/bin/bash
EXPORT_DIR="$HOME/exports"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# Create export directory with timestamp
mkdir -p "$EXPORT_DIR"
# Test export format on small sample (notebook auto-discovered)
echo "=== Testing format on 1 note ==="
wiki list -l 1 --format=json | jq . > /dev/null
if [ $? -ne 0 ]; then
echo "ERROR: JSON validation failed"
exit 1
fi
# Full export
echo "=== Exporting all notes ==="
wiki list --format=json > "$EXPORT_DIR/export_${TIMESTAMP}.json"
# Validate output
jq . < "$EXPORT_DIR/export_${TIMESTAMP}.json" > /dev/null
if [ $? -eq 0 ]; then
echo "✓ Export successful: $EXPORT_DIR/export_${TIMESTAMP}.json"
else
echo "✗ Export failed: JSON is invalid"
exit 1
fi
Advantage: No manual path discovery needed.
Export Large Notebook Safely (Direct zk with Explicit Path)
#!/bin/bash
NOTEBOOK="/path/to/notebook"
EXPORT_DIR="$HOME/exports"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# Create export directory with timestamp
mkdir -p "$EXPORT_DIR"
# Test export format on small sample
echo "=== Testing format on 1 note ==="
zk list -W "$NOTEBOOK" -l 1 --format=json | jq . > /dev/null
if [ $? -ne 0 ]; then
echo "ERROR: JSON validation failed"
exit 1
fi
# Full export
echo "=== Exporting all notes ==="
zk list -W "$NOTEBOOK" --format=json > "$EXPORT_DIR/export_${TIMESTAMP}.json"
# Validate output
jq . < "$EXPORT_DIR/export_${TIMESTAMP}.json" > /dev/null
if [ $? -eq 0 ]; then
echo "✓ Export successful: $EXPORT_DIR/export_${TIMESTAMP}.json"
else
echo "✗ Export failed: JSON is invalid"
exit 1
fi
Real-World Impact
Without this skill: Agents waste time guessing at nonexistent commands (zk export, zk link), get confused by -W flag, and struggle with format options.
With this skill: Agents know exactly which commands exist, understand working directory behavior, master export patterns, and avoid wasted attempts at missing commands.