Find a file
Claude 7754ea4b45
fix(tauri): surface errors from toggle_task cascade
When a parent task was toggled, `update_task` failures on child tasks
were silently swallowed with `let _ = ...`, leaving subtasks out of
sync with the parent's status and giving the user no feedback. Map the
error and propagate so the UI can show it and the user can retry.
2026-04-20 07:35:12 +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 fix(tauri): surface errors from toggle_task cascade 2026-04-20 07:35:12 +00:00
crates refactor(sync): remove dead .listdata.json guard in conflict path 2026-04-20 07:33:12 +00:00
docs Merge pull request #53 from SteelDynamite/claude/dreamy-brown-pFY5T 2026-04-19 09:12:08 +01: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 markdown docs with current codebase state 2026-04-18 08:53:10 +00:00
LICENSE docs: update documentation, add LICENSE, fix outdated info 2026-03-30 16:24:46 -07:00
PLAN.md Merge pull request #53 from SteelDynamite/claude/dreamy-brown-pFY5T 2026-04-19 09:12:08 +01:00
README.md Merge remote-tracking branch 'origin/main' into pr51-merge 2026-04-17 15:01:58 +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.

Onyx setup screen

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)
│       └── tauri-plugin-credentials/  # Cross-platform credential storage plugin
└── docs/
    ├── API.md                    # Core library API reference
    └── DEVELOPMENT.md            # Development guide

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 tauri android init, 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, workspace 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
  • Safe area insets for mobile (viewport-fit=cover)
  • Accessibility: ARIA labels/roles, keyboard handlers, prefers-reduced-motion support
  • 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 (in progress): Complete Android build (tauri android init + verification), iOS setup on macOS CI
  • Phase 5: GUI advanced features (rich markdown editor, search/filter, change storage folder)
  • 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.