lune
Lune (/lyn/, French for "moon" and rhymes with it) is a delightful CLI for Lunatask.
tl;dr
lune init # Interactive setup wizard
lune add "Review PR" -a work -s next # Create task in work area
lune done ID # Mark task completed
lune jrnl "Productive day!" # Quick journal entry
lune habit track meditation # Track a habit
Features
- Interactive setup — guided wizard configures areas, goals, notebooks, habits, and your access token
- Secure storage — access token lives in the system keyring, not a file
- Natural language dates — "yesterday", "-2 days", "next Monday" all work
- Deep link support — paste
lunatask://URLs or plain IDs - Stdin-friendly — use
-to pipe content into tasks, notes, and journal entries - Shell completion — tab-complete areas, goals, notebooks, and habits
- JSON output — most commands support
--jsonfor scripting - Config keys — use short aliases like
workinstead of UUIDs
Installation
- Using bin (recommended to
centralise and automate updating of binaries/CLI tools like this, but
still requires the Go toolchain):
bin install goinstall://git.secluded.site/lune@latest - Using the Go toolchain without bin (requires
tracking updates manually):
go install git.secluded.site/lune@latest
Then run lune init to configure your access token and copy areas,
goals, notebooks, and habits from the Lunatask desktop app.
Usage
Shortcuts
Quick commands for the most common actions:
| Command | Description |
|---|---|
lune add NAME |
Create task (alias for task add) |
lune done ID |
Mark task completed |
lune jrnl TEXT |
Add journal entry |
Resources
Full CRUD for Lunatask resources:
# Tasks
lune task add "Name" -a AREA -g GOAL -s STATUS -n "note" -p PRIORITY
lune task list [-a AREA] [-s STATUS] [--all] [--json]
lune task show ID [--json]
lune task update ID [-s STATUS] [--name "new name"] [--schedule "tomorrow"]
lune task delete ID [-f]
# Notes
lune note add "Title" -b NOTEBOOK -c "content"
lune note list [-b NOTEBOOK] [--json]
lune note show ID [--json]
lune note update ID [-c "new content"]
lune note delete ID [-f]
# Journal
lune journal add [CONTENT] [-d DATE] [-n NAME]
# Habits
lune habit track KEY [-d DATE]
# People (relationship tracker)
lune person add FIRST LAST [-r RELATIONSHIP]
lune person list [--json]
lune person show ID [--json]
lune person timeline ID -c "Met for coffee" [-d DATE]
lune person update ID [-r RELATIONSHIP]
lune person delete ID [-f]
# Config inspection
lune area list [--json]
lune area show KEY [--json]
lune goal list [-a AREA] [--all] [--json]
lune goal show KEY [--json]
Flag reference
Task flags:
-a, --area— area key from config-g, --goal— goal key (requires area)-s, --status— later, next, in-progress, waiting, completed-n, --note— task note (use-for stdin)-p, --priority— lowest, low, normal, high, highest-e, --estimate— time estimate in minutes (0-720)-m, --motivation— must, should, want--important,--not-important— Eisenhower matrix--urgent,--not-urgent— Eisenhower matrix--schedule— scheduled date (natural language)
Habit flags:
-d, --date— date performed (default: today)
Journal flags:
-d, --date— entry date (default: today)-n, --name— entry title (default: weekday name)
Person flags:
-r, --relationship— family, intimate-friends, close-friends, casual-friends, acquaintances, business-contacts, almost-strangers
Stdin support
Read content from stdin using -:
# Task name from stdin
echo "Review quarterly report" | lune add -
# Note content from stdin
cat meeting-notes.md | lune note add "Meeting Notes" -b work -c -
# Journal entry from stdin
echo "Wrapped up the project" | lune jrnl -
Configuration
Config lives at ~/.config/lune/config.toml. Run lune init anytime to
modify it through the interactive wizard, or edit directly:
[ui]
color = "auto" # "always", "never", or "auto"
[defaults]
area = "work"
notebook = "notes"
[[areas]]
id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
name = "Work"
key = "work"
[[areas.goals]]
id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
name = "Q1 Goals"
key = "q1"
[[notebooks]]
id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
name = "Work Notes"
key = "notes"
[[habits]]
id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
name = "Meditation"
key = "meditation"
Where to find IDs: In the Lunatask desktop app, open any item's settings modal and click "Copy [Item] ID" in the bottom left.
A note on end-to-end encryption
Lunatask is end-to-end encrypted, which means lune can only access metadata (IDs, timestamps, status, etc.)—not the names or contents of your tasks, notes, habits, etc. This is by design. When listing items, you'll see IDs and dates but not titles.
Creating items works because you provide the plain content and the desktop app encrypts it. The API can't decrypt anything so it can't read encrypted content back to you.
Contributions
Patch requests are in amolith/lune on
pr.pico.sh. You don't need a new account to contribute,
you don't need to fork this repo, you don't need to fiddle with git send-email, you don't need to faff with your email client to get git request-pull working...
You just need:
- Git
- SSH
- An SSH key
# Clone this repo, make your changes, and commit them
# Create a new patch request with
git format-patch origin/main --stdout | ssh pr.pico.sh pr create amolith/lune
# After potential feedback, submit a revision to an existing patch request with
git format-patch origin/main --stdout | ssh pr.pico.sh pr add {prID}
# List patch requests
ssh pr.pico.sh pr ls amolith/lune
See "How do Patch Requests work?" on pr.pico.sh's home page for a more complete example workflow.
Some other tools if this one interested you:
- go-lunatask — the Go client library lune is built with
- lunatask-mcp-server — MCP server for interacting with Lunatask via LLMs