Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 21 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
<img
src="./docs/assets/floatick-product-hero-v5.png"
width="100%"
alt="Floatick floating todo list, Markdown editor, tags, and settings for macOS"
alt="Floatick floating workspace for macOS with an editor, tags, Sticky Boards, and settings"
/>
<h1>Floatick — Floating Todo List for macOS</h1>
<p><strong>An open-source, local-first macOS todo app and lightweight task manager.</strong></p>
<h1>Floatick — Floating Todos and Notes for macOS</h1>
<p><strong>An open-source, local-first macOS app for lightweight tasks and notes.</strong></p>
<p>
Capture and organize tasks one click away—without an account or cloud service.
Capture tasks and thoughts one click away—without an account or cloud service.
</p>
<p>
<a href="https://github.com/lucaslus/floatick/actions/workflows/ci.yml">
Expand All @@ -24,19 +24,21 @@
</p>
</div>

Floatick is an offline-friendly desktop todo app that rests above your workspace
as a small, draggable icon. Click it and the icon expands into a focused todo
panel; collapse it and the icon returns to the same anchor. The panel chooses
Floatick is an offline-friendly desktop todo and notes app that rests above your
workspace as a small, draggable icon. Click it and the icon expands into a
focused panel; collapse it and the icon returns to the same anchor. The panel chooses
its expansion direction from the available screen space, so it stays useful
near any display edge.

## A focused macOS task manager
## A focused macOS space for tasks and notes

- **Always within reach** — drag the floating icon anywhere, then click to open.
- **Fast task flow** — create, edit, complete, search, archive, restore, and
organize tasks in automatic daily sections.
- **Local by default** — no account, cloud service, or telemetry. Your todo data
remains in `~/.floatick`.
- **Lightweight notes** — capture ideas, logs, and snippets with search, pinning,
archiving, shared tags, autosave, and Markdown preview.
- **Local by default** — no account, cloud service, or telemetry. Your todo and
note data remains in `~/.floatick`.
- **Made for macOS** — transparent AppKit window behavior, keyboard shortcuts,
context-menu Quit, and support for Reduce Motion.
- **Comfortable in any workspace** — system, light, and dark themes with English
Expand Down Expand Up @@ -70,10 +72,12 @@ Only download Floatick from this repository's Releases page.
| Action | How |
| --- | --- |
| Reposition Floatick | Drag the floating icon |
| Open the todo list | Click the floating icon |
| Open Floatick | Click the floating icon |
| Collapse the panel | Click the collapse button or press `Esc` |
| Create a todo | Press `⌘N`, or use the input at the top |
| Search | Press `⌘F` |
| Switch between todos and notes | Use the tabs at the top of the panel |
| Create a note | Open Notes and choose New |
| Search the current workspace | Press `⌘F` |
| Edit a todo | Hover over the item and choose Edit |
| Complete a todo | Select its checkbox |
| Archive or restore | Use the action at the end of the item |
Expand All @@ -86,11 +90,13 @@ Floatick creates its working directory on first launch:
| Path | Purpose |
| --- | --- |
| `~/.floatick/todos.json` | Todos, completion state, and archive state |
| `~/.floatick/notes.json` | Notes, tags, pinning, and archive state |
| `~/.floatick/tags.json` | Reusable tags shared by todos and notes |
| `~/.floatick/settings.json` | Theme and language preferences |

Sparkle stores the automatic-update preference in standard macOS application
preferences. Floatick does not require an account and does not upload your todo
data. Network access is used only to check for and download application updates.
or note data. Network access is used only to check for and download application updates.

## Development

Expand Down Expand Up @@ -135,7 +141,7 @@ the macOS system boundaries that remain in Draft acceptance.
lib/
app/ App composition and themes
core/ Shared platform, storage, and UI primitives
features/ Todo, settings, and update features
features/ Todo, notes, settings, and update features
l10n/ English and Simplified Chinese resources
macos/Runner/ AppKit window shell and Sparkle integration
test/ Repository, ViewModel, and widget tests
Expand All @@ -144,7 +150,7 @@ tool/ Icon and release tooling
```

Flutter owns product UI and state. A small AppKit shell owns macOS-specific
window behavior and Sparkle. Todo data never crosses the platform channel.
window behavior and Sparkle. Product data never crosses the platform channel.
See [Architecture](./docs/ARCHITECTURE.md) for the dependency boundaries.

## Development and release model
Expand Down
32 changes: 19 additions & 13 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
<img
src="./docs/assets/floatick-product-hero-v5.png"
width="100%"
alt="Floatick macOS 悬浮待办、Markdown 编辑器、标签与设置"
alt="Floatick macOS 悬浮工作区,展示编辑器、标签、便利板与设置"
/>
<h1>Floatick — macOS 悬浮待办清单</h1>
<p><strong>一款开源、仅存本地的 macOS 待办应用与轻量任务管理工具。</strong></p>
<h1>Floatick — macOS 悬浮 Todo 与笔记</h1>
<p><strong>一款开源、本地优先的 macOS 轻量 Todo 与笔记应用。</strong></p>
<p>
无需账号或云服务,让任务记录与整理始终触手可及
无需账号或云服务,让任务和想法始终触手可及
</p>
<p>
<a href="https://github.com/lucaslus/floatick/actions/workflows/ci.yml">
Expand All @@ -24,16 +24,18 @@
</p>
</div>

Floatick 是一款支持离线使用的 macOS 桌面待办应用。它平时以一个小巧、
可拖动的图标悬浮在工作区上方;点击图标会展开专注的待办面板,收起后则会准确
Floatick 是一款支持离线使用的 macOS 桌面 Todo 与笔记应用。它平时以一个小巧、
可拖动的图标悬浮在工作区上方;点击图标会展开专注的面板,收起后则会准确
回到原来的锚点。面板还会根据图标附近的屏幕空间自动选择展开方向,因此放在
屏幕边缘也能自然使用。

## 专注而轻量的 macOS 任务管理工具
## 专注而轻量的 macOS Todo 与笔记空间

- **随时可用**——图标可以拖到任意位置,点击即可展开。
- **完整待办流程**——支持创建、编辑、完成、搜索、归档和恢复,并按天自动分组。
- **默认仅存本地**——不需要账号、云服务或遥测,待办数据保存在 `~/.floatick`。
- **轻量笔记空间**——记录灵感、日志和片段,支持搜索、置顶、归档、共享标签、
自动保存与 Markdown 预览。
- **默认仅存本地**——不需要账号、云服务或遥测,Todo 与笔记数据保存在 `~/.floatick`。
- **贴合 macOS**——使用 AppKit 管理透明悬浮窗口,支持快捷键、右键退出和
“减少动态效果”。
- **适应不同工作环境**——支持跟随系统、浅色和深色主题,以及英文和简体中文。
Expand Down Expand Up @@ -64,10 +66,12 @@ Floatick 目前仍处于早期预览阶段,下载包暂未使用 Apple Develop
| 操作 | 使用方式 |
| --- | --- |
| 调整位置 | 拖动悬浮图标 |
| 展开待办列表 | 点击悬浮图标 |
| 展开 Floatick | 点击悬浮图标 |
| 收起面板 | 点击收起按钮或按 `Esc` |
| 创建待办 | 按 `⌘N`,或使用顶部输入框 |
| 搜索 | 按 `⌘F` |
| 切换 Todo 与笔记 | 使用面板顶部的标签页 |
| 创建笔记 | 打开 Notes 并点击新建 |
| 搜索当前空间 | 按 `⌘F` |
| 编辑待办 | 将鼠标悬浮到待办上并点击编辑 |
| 完成待办 | 点击待办前的复选框 |
| 归档或恢复 | 使用待办末尾的操作按钮 |
Expand All @@ -80,10 +84,12 @@ Floatick 第一次启动时会自动创建工作目录:
| 路径 | 用途 |
| --- | --- |
| `~/.floatick/todos.json` | 待办、完成状态与归档状态 |
| `~/.floatick/notes.json` | 笔记、标签、置顶与归档状态 |
| `~/.floatick/tags.json` | Todo 与笔记共享的可复用标签 |
| `~/.floatick/settings.json` | 主题与语言设置 |

Sparkle 会将自动更新偏好保存在 macOS 标准应用偏好中。Floatick 不需要账号,
也不会上传待办数据;网络访问仅用于检查和下载应用更新。
也不会上传 Todo 或笔记数据;网络访问仅用于检查和下载应用更新。

## 本地开发

Expand Down Expand Up @@ -128,7 +134,7 @@ Release 应用位于
lib/
app/ 应用装配与主题
core/ 共享的平台、存储和 UI 基元
features/ Todo、设置和更新功能
features/ Todo、笔记、设置和更新功能
l10n/ 英文与简体中文资源
macos/Runner/ AppKit 窗口外壳与 Sparkle 集成
test/ Repository、ViewModel 和 Widget 测试
Expand All @@ -137,7 +143,7 @@ tool/ 图标与发布工具
```

Flutter 负责产品 UI 和状态;轻量 AppKit 外壳负责 macOS 专属窗口行为与
Sparkle。待办数据不会经过平台通道。依赖边界详见
Sparkle。产品数据不会经过平台通道。依赖边界详见
[架构说明](./docs/ARCHITECTURE.md)。

## 开发与发布模型
Expand Down
18 changes: 11 additions & 7 deletions docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ lib/
storage/
ui/
features/
notes/
data/
domain/
presentation/
settings/
data/
domain/
Expand Down Expand Up @@ -63,16 +67,16 @@ tool/
- `l10n`: English source copy, Simplified Chinese translations, and generated
Flutter localization accessors.
- `macos/Runner`: transparent floating window behavior and the Sparkle update
service; todo data does not cross either platform channel.
service; todo and note data does not cross either platform channel.

## State and persistence

`TodoViewModel`, `SettingsViewModel`, and `UpdateViewModel` own presentation
state. Repositories own file I/O, JSON compatibility, or typed platform-channel
`TodoViewModel`, `NoteViewModel`, `SettingsViewModel`, and `UpdateViewModel` own
presentation state. Repositories own file I/O, JSON compatibility, or typed platform-channel
boundaries. Repositories are constructor-injected so state behavior can be
tested without touching the user's home directory or launching Sparkle.

Todo data and Floatick-owned interface settings only use `~/.floatick`.
Todo data, note data, shared tags, and Floatick-owned interface settings only use `~/.floatick`.
Repositories create it on first load and never read or write another hidden
application directory. Sparkle owns its automatic-check preference in the
standard macOS application `UserDefaults`; Floatick does not duplicate that
Expand All @@ -84,9 +88,9 @@ channel to a typed, informational state in Settings; other connectivity
failures remain recoverable errors. Sparkle still owns appcast parsing,
signature validation, download, and installation once the feed is available.

Writes are serialized by `TodoViewModel` to prevent overlapping mutations from
losing updates. A write failure leaves the last persisted in-memory state
unchanged and exposes a recoverable UI error.
Writes are serialized by `TodoViewModel` and `NoteViewModel` to prevent
overlapping mutations from losing updates. A write failure leaves the last
persisted in-memory state unchanged and exposes a recoverable UI error.

## Testing

Expand Down
2 changes: 2 additions & 0 deletions docs/RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ Download the DMG from the Draft Release and verify at least:
- floating icon drag, expand direction, collapse position, and right-click
Quit work;
- create, edit, complete, search, archive, and restore work;
- switch to Notes, then create, edit, search, pin, tag, archive, restore, and
relaunch with note content preserved;
- Chinese, English, system/light/dark themes, and Settings persistence work;
- relaunch preserves `~/.floatick` data;
- before the first stable release, manual update checks show the compact
Expand Down
2 changes: 2 additions & 0 deletions docs/TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ tool/test/run_ui_tests.sh
| 双击详情、完成、归档、恢复、搜索 | Integration |
| 退出前后的本地 JSON 持久化 | Integration |
| Tag 创建、Todo 关联、多选 OR 筛选和清空 | Integration |
| Notes 切换、创建、标签入口与空草稿处理 | Widget |
| Note 搜索、置顶、归档、恢复、共享标签与失败回滚 | Unit + Widget |
| Sticky Board 创建、添加现有 Todo、Pin/Unpin | Integration |
| 置顶、登录启动、主题等设置与原生调用边界 | Integration |
| 悬浮图标的 macOS Accessibility button/press contract | XCTest |
Expand Down
7 changes: 7 additions & 0 deletions lib/app/floatick_app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:flutter/services.dart';

import '../core/platform/window_bridge.dart';
import '../core/ui/floatick_surface_metrics.dart';
import '../features/notes/presentation/note_view_model.dart';
import '../features/settings/domain/app_settings.dart';
import '../features/settings/presentation/settings_view_model.dart';
import '../features/sticky_boards/presentation/sticky_board_view_model.dart';
Expand All @@ -18,6 +19,7 @@ import 'theme/floatick_theme.dart';
class FloatickApp extends StatelessWidget {
const FloatickApp({
required this.controller,
this.noteController,
required this.settingsController,
required this.updateController,
required this.stickyBoardController,
Expand All @@ -28,6 +30,7 @@ class FloatickApp extends StatelessWidget {
});

final TodoViewModel controller;
final NoteViewModel? noteController;
final SettingsViewModel settingsController;
final UpdateViewModel updateController;
final StickyBoardViewModel stickyBoardController;
Expand Down Expand Up @@ -61,6 +64,7 @@ class FloatickApp extends StatelessWidget {
},
home: _FloatickShell(
controller: controller,
noteController: noteController,
settingsController: settingsController,
updateController: updateController,
stickyBoardController: stickyBoardController,
Expand All @@ -76,6 +80,7 @@ class FloatickApp extends StatelessWidget {
class _FloatickShell extends StatefulWidget {
const _FloatickShell({
required this.controller,
required this.noteController,
required this.settingsController,
required this.updateController,
required this.stickyBoardController,
Expand All @@ -84,6 +89,7 @@ class _FloatickShell extends StatefulWidget {
});

final TodoViewModel controller;
final NoteViewModel? noteController;
final SettingsViewModel settingsController;
final UpdateViewModel updateController;
final StickyBoardViewModel stickyBoardController;
Expand Down Expand Up @@ -470,6 +476,7 @@ class _FloatickShellState extends State<_FloatickShell> {
visible: _panelTooltipsEnabled,
child: TodoPanel(
controller: widget.controller,
noteController: widget.noteController,
settingsController: widget.settingsController,
updateController: widget.updateController,
stickyBoardController: widget.stickyBoardController,
Expand Down
Loading