Skip to content

Pajn/todo-tray

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Todo Tray

A macOS menubar application for Todoist with optional Linear and GitHub integrations.

Built with Rust (core logic) + Swift (native UI) via UniFFI.

Features

  • 🔴 Shows count of overdue tasks in the menubar
  • 📋 Click to see today's tasks sorted chronologically
  • ⚠️ Overdue tasks appear at the top
  • ✅ Click a task to mark it as complete
  • ⏱️ Todoist submenu actions: Resolve + configurable Snooze durations
  • 🟦 Optional Linear integration for assigned in-progress issues
  • 🐙 Optional GitHub notifications with multiple accounts
  • 📅 Optional calendar events from iCal feeds (Google Calendar and others), with multiple feeds
  • 🔔 Notifications for newly overdue tasks
  • 🔄 Auto-refreshes every 5 minutes

Prerequisites

  • Rust 1.70+ (install via rustup)
  • Xcode 15+ with Xcode Command Line Tools
  • xcodegen (brew install xcodegen)
  • just (brew install just)

Installation

1. Get your Todoist API token

Go to Todoist Integrations Settings and copy your API token.

2. Create the config file

just setup-config
# Then edit the config file with your token:
open -e ~/Library/Application\ Support/todo-tray/config.toml

Or manually:

mkdir -p ~/Library/Application\ Support/todo-tray
cat > ~/Library/Application\ Support/todo-tray/config.toml << 'EOF'
todoist_api_token = "YOUR_API_TOKEN_HERE"

# Optional: Linear in-progress issues
# linear_api_token = "lin_api_..."

# Optional: GitHub notifications (repeat block for multiple accounts)
# [[github_accounts]]
# name = "work"
# token = "ghp_..."

# Optional: iCal feeds (repeat block for multiple calendars/providers)
# [[calendar_feeds]]
# name = "Work Calendar"
# ical_url = "https://calendar.google.com/calendar/ical/.../basic.ics"
#
# Alias also supported:
# url = "https://calendar.google.com/calendar/ical/.../basic.ics"

# Optional: Snooze durations (default: 30m, 1d)
# snooze_durations = ["30m", "1d"]

# Optional: show upcoming meetings in the tray before they start (default: 10)
# meeting_focus_lead_time_minutes = 10
EOF

3. Build and run

just run

Development

just build-core     # Build Rust library only
just build-app      # Build complete app
just rebuild        # Clean + full rebuild (use when Rust code changed)
just run            # Build and open app
just fresh          # Rebuild and run
just lint           # Run clippy
just fmt            # Format code

Configuration

Config file location: ~/Library/Application Support/todo-tray/config.toml

todoist_api_token = "your_todoist_api_token"

# Optional: include Linear issues assigned to you that are In Progress
linear_api_token = "your_linear_api_key"

# Optional: GitHub notifications grouped by account
[[github_accounts]]
name = "work"
token = "ghp_..."

[[github_accounts]]
name = "personal"
token = "ghp_..."

# Optional: calendar events grouped by feed/account
[[calendar_feeds]]
name = "Work Calendar"
ical_url = "https://calendar.google.com/calendar/ical/.../basic.ics"

[[calendar_feeds]]
name = "Personal Calendar"
ical_url = "https://calendar.google.com/calendar/ical/.../basic.ics"

# Optional: todoist snooze options
snooze_durations = ["30m", "1d"]

# Optional: switch the tray title to the active/next meeting before start
meeting_focus_lead_time_minutes = 10

# Optional: auto-launch at login
autostart = true

Architecture

  • Rust Core (src/): Business logic, API clients, state management
  • Swift UI (SwiftApp/TodoTray/Sources/): Native AppKit menubar app
  • UniFFI: Generates Swift bindings from Rust types

License

MIT

About

macOS menubar app to show tasks from todoist, linear and github notifications

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors