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 #
Pre-built binaries are available on the Tangled releases page.
Download the binary for your platform and place it somewhere in your $PATH.
Click to expand installation with mise (recommended)
To install Lune with mise and follow updates, add the
following to your mise.toml or global ~/.config/mise/config.toml:
[tools."http:lune"]
version = "latest"
prerelease = true
url = 'https://tangled.org/secluded.site/lune/tags/v{{ version }}/download/lune-v{{ version }}-{{ os(macos="darwin") }}-{{ arch(x64="amd64") }}{% if os() == "windows" %}.exe{% endif %}'
bin = "lune"
version_list_url = "https://api.tangled.org/xrpc/sh.tangled.repo.tags?repo=at%3A%2F%2Fdid%3Aplc%3Aq3dqwhaox5kb57hcvg4aq4zc%2Fsh.tangled.repo%2Flune&limit=1"
version_json_path = ".tags[].name"
Run mise install to install Lune and mise upgrade to update it when a new
release is available.
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.
Some other tools if this one interested you:
- go-lunatask — the Go client library lune is built with
- agent-skills — collection of Agent Skills for extending LLM capabilities
- git-format — CLI that turns LLM input into well-formatted conventional commits and tags