Find a file
Claude 855fa46a0e
refactor: simplify forgetMissingWorkspace now that removeWorkspace handles switch
removeWorkspace already switches to the next available workspace (or falls
back to setup). forgetMissingWorkspace can just delegate, dropping the
duplicate branch that previously never ran anyway because current_workspace
was always null after removal.
2026-04-17 16:13:46 +00:00
.claude feat: add Claude tool hooks configuration 2026-04-06 11:21:29 -07:00
.idea bevy hello world 2025-08-24 05:45:43 -07:00
apps/tauri refactor: simplify forgetMissingWorkspace now that removeWorkspace handles switch 2026-04-17 16:13:46 +00:00
crates Fix nine GUI bugs found during local-workspace smoke test 2026-04-17 14:24:59 +00:00
docs Merge main into claude/dreamy-brown-d12z7 2026-04-17 14:35:39 +00:00
screenshots/smoke-test Fix nine GUI bugs found during local-workspace smoke test 2026-04-17 14:24:59 +00:00
.gitattributes fix: reset tasks and remount screen on workspace change 2026-04-06 09:10:36 -07:00
.gitignore docs: update documentation, add LICENSE, fix outdated info 2026-03-30 16:24:46 -07:00
Audit.md fix: audit — debounced save data loss, silent workspace errors, code duplication 2026-04-15 07:16:40 +00:00
Cargo.lock Add Google Tasks read-only workspace and sync 2026-04-14 07:02:50 -07:00
Cargo.toml remove flutter 2026-04-02 08:10:30 -07:00
CLAUDE.md docs: sync all markdown files with current codebase state 2026-04-15 20:51:01 +00:00
LICENSE docs: update documentation, add LICENSE, fix outdated info 2026-03-30 16:24:46 -07:00
PLAN.md Merge main into claude/dreamy-brown-d12z7 2026-04-17 14:35:39 +00:00
README.md Merge main into claude/dreamy-brown-d12z7 2026-04-17 14:35:39 +00:00
screenshot.png Add screenshot of Tauri app setup screen 2026-04-17 12:06:35 +00:00

Onyx

A local-first, cross-platform tasks application built with Rust. Inspired by Google Tasks, designed for speed and flexibility.

Core Principles

  • Local-First: Your data, your folder, your control
  • Fast: Sub-second startup, instant response
  • Cross-Platform: Single codebase, all platforms
  • Flexible: Multiple workspaces for different contexts

Project Structure

onyx/
├── Cargo.toml                    # Workspace definition
├── PLAN.md                       # Detailed project plan
├── README.md                     # This file
├── crates/
│   ├── onyx-core/          # Core library (backend)
│   └── onyx-cli/           # CLI frontend
├── apps/
│   └── tauri/                    # Tauri v2 GUI (Svelte 5 + Tailwind CSS 4)
└── docs/

Project Status

  • Phase 1 (Core + CLI): Complete
  • Phase 2 (WebDAV Sync): Complete — backend, CLI, and GUI all wired
  • Phase 3 (GUI MVP): Complete
  • Phase 4 (Mobile): In progress — Android preliminaries done (file-watcher gating, tauri-plugin-credentials, safe area insets, Android targets configured); needs build verification and iOS setup

Core Library (onyx-core)

  • Data models (Task, TaskList, AppConfig, WorkspaceConfig)
  • Markdown file I/O with YAML frontmatter
  • Local storage with repository pattern
  • Multiple workspace support
  • Task ordering and grouping
  • Subtask hierarchy (parent_id)
  • WebDAV sync with three-way diff and offline queue
  • Platform keychain credential storage (feature-gated for Android)
  • Checksum-based conflict resolution (remote wins, local recovered as duplicate)

CLI (onyx-cli)

  • Workspace management (init, add, list, switch, remove, retarget, migrate)
  • Task list management (create, show, delete)
  • Task operations (add, complete, delete, edit)
  • Group-by-date toggle
  • WebDAV sync (setup, push, pull, status)

GUI (apps/tauri/)

  • Tauri v2 + Svelte 5 + Tailwind CSS 4
  • Task CRUD with animated transitions
  • Drag-and-drop reordering
  • Sliding lists drawer, settings popup
  • Workspace switcher with add/remove
  • Per-workspace theme system (System default, Light, Dark, Nord, Dracula, Solarized Dark, Black and Gold, Ink)
  • Due date picker/editor with optional time
  • Subtask hierarchy with three-panel slide navigation
  • Move tasks between lists
  • List rename, group-by-date toggle, delete completed tasks
  • Keyboard shortcuts (Escape priority chain)
  • WebDAV setup flow with credential auto-population
  • File watcher (auto-reloads on external changes)
  • Auto-sync with configurable interval, status indicators
  • Swipe gestures on mobile (swipe to toggle completion)
  • Custom confirmation dialogs
  • Desktop packaging (Linux: AppImage + .deb; Windows: MSI)

Development Setup

Prerequisites

  • Rust 1.70+ (install from rustup.rs)
  • Git
  • Node.js 18+ (for Tauri GUI)

Build

# Clone and build
git clone https://github.com/SteelDynamite/onyx.git
cd onyx
cargo build

# Run tests
cargo test -p onyx-core

# Run CLI
cargo run -p onyx-cli -- --help

# Run Tauri GUI
cd apps/tauri && npm install
npm run tauri dev                # (Wayland: WEBKIT_DISABLE_DMABUF_RENDERER=1 npm run tauri dev)

Quick Start

Initialize your first workspace

# Initialize a new workspace
cargo run -p onyx-cli -- init ~/Documents/Tasks --name personal

# This creates:
# - A workspace named "personal" at ~/Documents/Tasks
# - A default list called "My Tasks"
# - Sets "personal" as the current workspace

Add and manage tasks

# Add a task
cargo run -p onyx-cli -- add "Buy groceries"

# Add a task with a date
cargo run -p onyx-cli -- add "Review PR #123" --list "Work" --date "2026-11-15"

# List all tasks
cargo run -p onyx-cli -- list show

# Complete a task
cargo run -p onyx-cli -- complete <task-id>

# Edit a task (opens in $EDITOR)
cargo run -p onyx-cli -- edit <task-id>

# Delete a task
cargo run -p onyx-cli -- delete <task-id>

Manage workspaces

# Add another workspace
cargo run -p onyx-cli -- workspace add shared ~/Dropbox/TeamTasks

# List workspaces
cargo run -p onyx-cli -- workspace list

# Switch workspace
cargo run -p onyx-cli -- workspace switch shared

# Use specific workspace for a command
cargo run -p onyx-cli -- add "Team meeting" --workspace shared

Manage task lists

# Create a new list
cargo run -p onyx-cli -- list create "Work"

# Show tasks in a specific list
cargo run -p onyx-cli -- list show --list "Work"

# Delete a list
cargo run -p onyx-cli -- list delete "Work"

Data Format

Tasks are stored as markdown files with YAML frontmatter (Obsidian-compatible):

---
id: 550e8400-e29b-41d4-a716-446655440000
status: backlog
version: 3
date: 2026-11-15T14:00:00Z
has_time: true
parent: 550e8400-e29b-41d4-a716-446655440001
---

Task description and notes go here in **markdown** format.

- Can include lists
- Rich formatting
- Links, etc.

File System Structure

~/Documents/Tasks/           # User-selected folder
├── .onyx-workspace.json     # Workspace metadata: list ordering, detection
├── My Tasks/                # Task list folder
│   ├── .listdata.json       # List metadata: task order, id, timestamps
│   ├── Buy groceries.md     # Individual task files
│   └── Call dentist.md
└── Work/
    ├── .listdata.json
    ├── Review PRs.md
    └── Team meeting prep.md

Testing

Run the test suite:

# Run all tests
cargo test

# Run tests for specific crate
cargo test -p onyx-core

# Run tests with output
cargo test -- --nocapture

What's Next?

  • Phase 4: Mobile support (iOS & Android via Tauri v2 mobile)
  • Phase 5: GUI advanced features (rich markdown editor, search/filter)
  • Phase 6: Mobile polish and platform-specific integrations
  • Phase 7: Google Tasks importer and unique features

See PLAN.md for detailed roadmap.

License

GNU General Public License v3.0 (GPL-3.0)

This project is free and open-source software.