A simple and intuitive cross-platform task manager built with Avalonia and .NET. It provides a clean graphical interface (inspired by macOS Reminders) for efficiently creating, organizing, and tracking tasks. Whether you're managing personal to-dos or team projects, Taskly helps you stay organized and focused.
English · 中文
- Task CRUD — create, edit, and delete tasks with ease (quick add input + detail dialog + inline editing)
- Customizable lists — organize tasks into lists with emoji icons and colors
- Due dates with smart shortcuts — natural-language parsing (
+10m,@10am,2025-08-07) - Completion feedback — mark tasks as complete with visual feedback (Reminders-style circular checkbox)
- Automatic persistence — data stored automatically using SQLite
- Cross-platform — Windows, macOS, and Linux desktops
- macOS Reminders UI — clean interface with smart-list tiles (Today / Planned / All / Completed)
- MVVM state management — reactive state via CommunityToolkit.Mvvm
- Modular architecture — clean layered design, easy to maintain
- Responsive design — adapts to different screen sizes
- Bilingual — English and Chinese, switchable at runtime
- Light & Dark themes — full theme support
| Dependency | Purpose / Version |
|---|---|
| .NET SDK | 10.0 or later (8.0 also compatible) |
| Avalonia | 11.2 (resolved automatically) |
| Git | Source control |
| IDE | Visual Studio, Rider, or VS Code with C# Dev Kit (recommended) |
git clone https://github.com/turinglambdaai/taskly.git
cd tasklycd src/Taskly
dotnet restore# Run on the current platform (Windows, macOS, or Linux)
dotnet runOn first launch, use the File menu to create or open a
.dbdatabase file. Your settings and last database path are persisted in~/.taskly/config.ini.
Taskly follows a modular MVVM architecture with clear separation of concerns:
src/Taskly/
├── Models/ # Data models
│ ├── TaskItem.cs # Task data model (matches tasks table)
│ ├── TodoList.cs # Todo list data model (matches lists table)
│ ├── TaskViewType.cs # Smart-view enum
│ └── AppError.cs # Error types
├── Data/ # Data access layer
│ ├── SQLiteDatabase.cs # SQLite service (schema + migrations + queries)
│ ├── ConfigService.cs # config.ini read/write
│ └── PathUtils.cs # File path utilities
├── Repositories/ # Repositories with validation
│ ├── IListRepository.cs # List CRUD
│ └── ITaskRepository.cs # Task CRUD + getTasksByView dispatch
├── Services/ # Core services
│ ├── I18nService.cs # Internationalization (zh / en)
│ ├── DateParser.cs # Natural-language date parsing
│ ├── ValidationHelper.cs # Input validation
│ ├── AppTheme.cs # Light/Dark theme
│ └── DialogService.cs # Dialog host
├── ViewModels/ # MVVM view models
│ ├── MainViewModel.cs # App-wide state
│ ├── ListPaneViewModel.cs # List state
│ └── TaskPaneViewModel.cs # Task state
├── Views/ # UI views (AXAML)
│ ├── MainWindow.axaml # Main window (menu + sidebar + content + status bar)
│ ├── ListPane.axaml # Sidebar (smart tiles + lists)
│ ├── TaskPane.axaml # Main content (title + quick add + tasks)
│ ├── TaskItemRow.axaml # Single task row
│ └── Dialogs/ # Task detail, list edit, emoji/color pickers, date/time
├── Themes/ # Colors, styles, design constants
└── Converters/ # Value converters
- User interacts with UI views
- Views trigger commands in view models
- View models call repositories for data operations
- Repositories use the database service for SQLite access
- Database changes are reflected back to view models
- View models update the UI views reactively
- All data is automatically persisted to the
.dbfile
Taskly uses SQLite for data persistence with a simple schema (compatible with the previous Flutter release, user_version = 4):
-- Lists table
CREATE TABLE lists (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
icon TEXT, -- emoji string
color INTEGER, -- ARGB int
created_at TEXT NOT NULL
);
-- Tasks table
CREATE TABLE tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
list_id INTEGER,
text TEXT NOT NULL, -- task content
due_date TEXT, -- 'yyyy-MM-dd'
due_time TEXT, -- 'HH:mm'
completed INTEGER DEFAULT 0,
created_at TEXT NOT NULL,
notes TEXT,
FOREIGN KEY (list_id) REFERENCES lists (id)
);Migration history is preserved: v2 adds indexes, v3 adds icon/color, v4 adds due_time/notes. A default list named "工作" (Work) is created on first launch.
# Build the project
dotnet build
# Run the application
dotnet run- Use your IDE's debugger for UI applications
- The database file is created under
~/.taskly/— inspect it with any SQLite tool - Open DevTools with F12 during development to inspect the Avalonia visual tree
- Test core logic (date parsing, repository) in isolation before UI integration
Release builds are produced automatically by GitHub Actions when a v* tag is pushed. To build locally:
# Windows
dotnet publish -c Release -r win-x64 --self-contained false
# macOS (Apple Silicon)
dotnet publish -c Release -r osx-arm64 --self-contained false
# macOS (Intel)
dotnet publish -c Release -r osx-x64 --self-contained false
# Linux
dotnet publish -c Release -r linux-x64 --self-contained false- Releases are managed through GitHub Releases
- Version numbers follow semantic versioning (MAJOR.MINOR.PATCH)
- Release notes are generated automatically from commit messages
- See
.github/workflows/release.ymlfor the full build matrix
Licensed under the Apache License 2.0.