Find a file
Tristan Michael 67eb90c2a0 Introduce windowDecorations enum with three options
Replace the previous boolean systemDecorations with a windowDecorations
enum ("custom", "none", "system") to allow three distinct decoration
modes. Update UI to use a select control in Settings, adapt App.svelte
conditionals to check for the "custom" value when applying custom
borders/rounded styles, and rename localStorage key to persist the new
enum. Also ensure the native system decorations are enabled when the
setting is "system" and export the new setter name setWindowDecorations
in the store.
Enable setting window decorations

Add the "core🪟allow-set-decorations" capability to allow the app
to control window decorations (e.g., system titlebar). This fixes the
issue where the system titlebar was not working by permitting the code
to modify decoration state.

Also ensure the capability list remains properly comma-separated after
insertion.
Add outline support for borderless mode

Allow border outline in non-system decoration modes on Linux. The change
updates the condition for applying the linux-window-border class so the
outline is applied when window decorations are custom or any non-system
mode, enabling an outline for borderless windows while keeping
system-decorated windows unaffected.
Respect borderless mode: remove rounded corners

Remove rounded corners from popups and overlays when window decorations
are disabled. The App component now passes the windowDecorations state
into the root div via a data-decorations attribute, and the CSS adds a
rule that forces square corners for all elements under
[data-decorations="none"] to ensure borderless mode yields true square
UI without rounded popups/toasts.
Do not override button/input/select border-radius in borderless mode

Prevent borderless mode from removing rounded corners on interactive
form elements. The previous selector applied border-radius: 0 to all
descendants, unintentionally flattening buttons, inputs, and selects.
Restrict the rule so it excludes button, input, and select elements to
preserve their expected styling.
Strengthen dropdown drop-shadows

Make the kebab and other dropdown menu shadows more pronounced by
replacing the tailwind shadow-lg class with shadow-2xl across
TaskDetailView.svelte and TasksScreen.svelte. This improves visual
contrast and makes menus stand out more clearly against the background,
addressing the request to make the dropshadow on the kebab menus
stronger.
Use consistent menu shadow class

Replace multiple inline shadow utility classes with a shared
"menu-shadow" class for dropdown and context menus across
TaskDetailView, SettingsScreen, and TasksScreen. This unifies styling,
reduces duplication, and allows easier tweaks to the menu drop-shadow
(potentially addressing blurry rendering) by centralizing the shadow
definition.
Add subtle shadow for dropdown/kebab menus

Soften dropdown/kebab menu appearance by adding a subtle box-shadow
utility and a darker variant for dark mode. Also refine the borderless
mode rule to avoid overriding elements that use rounded-full classes so
those intentional circular controls keep their shape.
Make dropdown buttons square-cornered in borderless mode

Ensure dropdown menu buttons use square corners when decorations are
disabled. The CSS update adds a selector to force border-radius: 0 for
buttons inside .dropdown-menu under [data-decorations="none"]. Several
dropdown container divs across TaskDetailView, SettingsScreen,
TasksScreen, and related components are given a .dropdown-menu class so
the new rule applies consistently and makes dropdown buttons match the
rest of the borderless UI.
when workspace settings is up, can we make it so I can drag the header to move the app around?

- Added data-tauri-drag-region to the header and title in SettingsScreen.svelte so the settings header can be used to drag/move the window
<task-notification>
<task-id>bzp4p2vsp</task-id>
<summary>Monitor event: "Tauri rebuild — Finished or error"</summary>
<event>[Monitor timed out — re-arm if needed.]</event>
</task-notification>


Apply decorations-none class for borderless mode

Ensure the "decorations-none" CSS class is applied/removed on the
document root when window decorations are set to "none" so borderless
mode styles take effect. The CSS selector was also adjusted to
explicitly list rounded utility classes so the rule targets known
rounded elements while keeping dropdown-menu buttons included.
2026-04-14 06:02:30 -07: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 Introduce windowDecorations enum with three options 2026-04-14 06:02:30 -07:00
crates feat: add onyx dark theme support 2026-04-06 17:17:00 -07:00
docs Update documentation to reflect audit fixes 2026-04-06 11:07:29 +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
Cargo.lock chore: update lock files for log dependency 2026-04-03 10:11:40 -07:00
Cargo.toml Use reqwest with rustls-tls and disable default features 2026-04-03 10:11:40 -07:00
CLAUDE.md Fix documentation and code inconsistencies found during audit 2026-04-06 12:08:22 +00:00
LICENSE docs: update documentation, add LICENSE, fix outdated info 2026-03-30 16:24:46 -07:00
PLAN.md Fix documentation and code inconsistencies found during audit 2026-04-06 12:08:22 +00:00
README.md Docs: update frontmatter examples and Task struct for version counter 2026-04-05 19:23:52 -07: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): Tauri Android cfg-gated, needs tauri android init + build

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-due-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
  • Dark mode (GNOME-style neutral grays, cyan-blue accent)
  • Due date picker/editor with optional time
  • Subtask hierarchy with three-panel slide navigation
  • Move tasks between lists
  • List rename, group-by-due-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
  • 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

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 due date
cargo run -p onyx-cli -- add "Review PR #123" --list "Work" --due "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
due: 2026-11-15T14:00:00Z
---

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.