Create more powerful shortcuts with shell functions:
Bash/Zsh
Fish
~/.bashrc or ~/.zshrc
# Quick thought with timestamptt() { timo add "$(date '+%H:%M') - $*"}# Add urgent thoughturgent() { timo add "URGENT: $*" -l urgent}# Search and show labelstsearch() { timo search "$*" -s}# Show today's work thoughtstoday() { timo list -l work -s}# Quick idea captureidea() { timo add "💡 $*" -l ideas}
~/.config/fish/functions/
# In tt.fishfunction tt timo add (date '+%H:%M') "- $argv"end# In urgent.fishfunction urgent timo add "URGENT: $argv" -l urgentend# In tsearch.fishfunction tsearch timo search $argv -send
Usage examples:
tt Met with design team about new logourgent Database backup failingidea Use WebSocket for real-time updates
# Capture thoughts for different projectstimo add Implement user authentication -l project-alphatimo add Fix navigation bug -l project-alphatimo add Design database schema -l project-betatimo add Write API documentation -l project-beta# Focus on one project at a timetimo list -l project-alpha -s# Search within a projecttimo search bug -l project-alpha# When project is complete, clean uptimo list -l project-alpha # Review all items# Remove completed items one by onetimo remove 1 2 3
Create a global keyboard shortcut that opens your terminal and focuses the input.On macOS with iTerm2:
Set up a hotkey window
Bind it to Ctrl+Shift+Space
Set the profile to run: timo add
2
Use shell aliases
The shorter the command, the faster the capture:
alias t="timo add"
Now just: t Quick thought here
3
Create smart defaults
Use functions with sensible defaults:
t() { local label="work" # During work hours (9-18), default to work label if [ $(date +%H) -ge 9 ] && [ $(date +%H) -lt 18 ]; then label="work" else label="personal" fi timo add "$*" -l "$label"}
# Morning: Review what you captured yesterdaytimo list -s# Process urgent itemstimo search urgent -s# Remove completed itemstimo remove 2 5 7
# Review all thoughtstimo list -s# Check each labeltimo list -l work -stimo list -l personal -stimo list -l ideas -s# Archive or remove old itemstimo remove 1 3 4 8 12
# Export thoughts for archivalsqlite3 ~/.local/share/.timo.db -json \ "SELECT * FROM tasks" > archive-$(date +%Y%m).json# Clear completed thoughtstimo list -s # Review one last time# Remove old itemstimo remove 1 2 3 4 5 6# Or start fresh if everything is processedtimo clear --confirmed
Integrate with fzf for interactive thought selection:
~/.bashrc or ~/.zshrc
# Fuzzy search and removetrm() { local ids=$(timo list -s | fzf -m | grep -oP '^\[\K[0-9]+') if [ -n "$ids" ]; then timo remove $ids fi}# Fuzzy search thoughtstf() { timo list -s | fzf}
Now you can interactively select thoughts to remove:
trm # Opens fzf with all thoughts, select with tab, enter to remove
# From a filewhile IFS= read -r line; do timo add "$line" -l importeddone < thoughts.txt# From clipboard (macOS)pbpaste | while IFS= read -r line; do timo add "$line"done# From clipboard (Linux with xclip)xclip -o | while IFS= read -r line; do timo add "$line"done
# Search for multiple termstimo list | grep -E "(meeting|call|schedule)"# Search thoughts, count resultstimo search important | wc -l# Search and copy to clipboard (macOS)timo search documentation | pbcopy# Search and save to filetimo search bug -l work > bugs-to-fix.txt
#!/bin/bash# standup.sh - Generate standup notes from yesterday's thoughtsecho "Yesterday's accomplishments:"timo list -l work -s | grep -i "done\|completed\|finished"echo -e "\nToday's plan:"timo list -l work -s | grep -i "todo\|plan\|next"echo -e "\nBlockers:"timo list -l work -s | grep -i "blocked\|issue\|problem"
#!/bin/bash# meeting.sh - Quick meeting notesmeeting_name="$1"echo "Capturing notes for: $meeting_name"echo "Enter thoughts (Ctrl-D to finish):"while IFS= read -r line; do timo add "[$meeting_name] $line" -l meetingsdoneecho "Notes saved!"
Usage:
./meeting.sh "Design Review"# Enter thoughts, then Ctrl-D
#!/bin/bash# eod-summary.sh - End of day summarytotal=$(sqlite3 ~/.local/share/.timo.db "SELECT COUNT(*) FROM tasks")work=$(sqlite3 ~/.local/share/.timo.db "SELECT COUNT(*) FROM tasks WHERE label='work'")urgent=$(sqlite3 ~/.local/share/.timo.db "SELECT COUNT(*) FROM tasks WHERE label='urgent'")echo "End of Day Summary"echo "=================="echo "Total thoughts: $total"echo "Work items: $work"echo "Urgent items: $urgent"echo ""if [ "$urgent" -gt 0 ]; then echo "⚠️ Urgent items remaining:" timo list -l urgent -sfi
# Add thought with current branch namegitt() { local branch=$(git branch --show-current 2>/dev/null) if [ -n "$branch" ]; then timo add "[$branch] $*" -l dev else timo add "$*" -l dev fi}# Review thoughts for current branchgit-thoughts() { local branch=$(git branch --show-current) timo search "[$branch]" -l dev -s}
Usage:
gitt Need to add error handlinggitt Refactor database queriesgit-thoughts # See all thoughts for this branch
#!/bin/bash# timo-remind.sh - Show notification if urgent thoughts existcount=$(sqlite3 ~/.local/share/.timo.db \ "SELECT COUNT(*) FROM tasks WHERE label='urgent'" 2>/dev/null)if [ "$count" -gt 0 ]; then osascript -e "display notification \"You have $count urgent thoughts\" with title \"Timo Reminder\"" timo list -l urgent -sfi
The golden rule: Capture fast, process regularly, keep it simple.
Capture quickly: Don’t overthink when adding thoughts
Use labels consistently: Stick to a small set of meaningful labels
Review regularly: Process your thoughts daily or weekly
Remove liberally: Timo is for active thoughts, not permanent storage
Create aliases: Make common operations fast and frictionless
Stay organized: Use labels to separate contexts
Export important data: Archive thoughts before clearing
Remember, Timo is designed to be a lightweight thought capture tool. If you find yourself needing complex features, consider whether a different tool might be better suited for that particular workflow.