Snail TodoList 是一款面向个人与小团队的任务管理应用,强调"足够强大但保持轻量"。项目采用 React + 多后端架构,支持云端(Supabase)和本地离线(IndexedDB)两种存储模式,可自行部署并掌控数据,适合希望在现有工具之外获得更强可定制性的使用者。
- 可控的数据与部署:支持云端 Supabase 或完全本地离线模式,数据完全由你掌控。
- 灵活的存储模式:用户可随时在登录页或设置中切换在线/离线模式,支持数据导入导出迁移。
- 合适的功能密度:保留拖拽、标签、富文本等常用特性,同时避免臃肿的工作流系统。
- 易于拓展:采用 shadcn/ui + Tailwind 的组件体系,便于快速新增模块或重新设计界面。
- 任务管理:新增、编辑、完成、放弃、恢复,支持项目分组与排序
- 日期视图:快速查看"今天""最近 7 天",按需筛选逾期任务
- 标签体系:支持标签增删、过滤、跨项目复用
- 富文本详情:Milkdown 提供 Markdown 编辑、图片上传、代码块等能力
- 打卡与统计:内置打卡日历、连续天数统计、总次数概览
- 深浅色主题 + 响应式布局,桌面与移动端体验一致
- 完全本地存储:使用 IndexedDB 存储所有数据,无需网络连接
- 无需登录:离线模式下可直接使用,无需注册账号
- 用户可控切换:在登录页点击"离线模式"按钮,或在设置中随时切换
- 数据隔离:在线/离线数据完全独立,通过导入导出进行迁移
- 桌面端支持:Tauri 桌面客户端完美支持离线模式
- 一键导出:将所有清单、任务、标签导出为 ZIP 压缩包
- 灵活导入:支持"合并"或"替换"两种导入模式
- 跨模式迁移:在线/离线模式间自由迁移数据
- 进度显示:导入导出过程实时显示进度
| 分类 | 使用技术 |
|---|---|
| 前端框架 | React 18 · TypeScript |
| 构建工具 | Vite |
| UI 体系 | shadcn/ui · Radix UI · Tailwind CSS |
| 状态与数据 | TanStack Query · Zustand · React Context |
| 后端服务 | Supabase(PostgreSQL · Auth · Storage · Realtime) |
| 本地存储 | IndexedDB(离线模式) |
| 富文本 & 日期 | Milkdown · react-day-picker · date-fns |
| 其它组件 | React Router 6 · React Hook Form · Recharts · JSZip |
| 桌面客户端 | Tauri |
src/
├── components/
│ ├── checkin/ # 打卡模块
│ ├── settings/ # 设置页面组件
│ ├── sidebar/
│ ├── tasks/
│ └── ui/ # 基础 UI 封装
├── config/ # 存储模式配置
├── contexts/ # Auth、Task、Project 等全局上下文
├── hooks/ # 自定义 Hooks
├── integrations/ # Supabase client 等集成
├── lib/ # 公共工具与样式辅助
├── queries/ # TanStack Query 配置与 keys
├── services/ # API 调用与数据传输服务
├── storage/ # 存储抽象层
│ ├── indexeddb/ # IndexedDB 适配器
│ ├── supabase/ # Supabase 适配器
│ └── types.ts # 存储接口定义
├── store/ # Zustand store 定义
├── utils/ # 辅助函数与常量
└── pages/ # 路由页面
无需配置后端,开箱即用:
git clone https://github.com/wuuJiawei/snail-todolist.git
cd snail-todolist
npm install
npm run dev打开 http://localhost:5173,点击登录页的"离线模式"按钮即可开始使用。
- Node.js 18+
- npm / pnpm / yarn
- Supabase 项目(已启用数据库与 Storage)
git clone https://github.com/wuuJiawei/snail-todolist.git
cd snail-todolist
npm install
cp .env.example .env在 .env 中设置:
VITE_SUPABASE_URL=你的_supabase_url
VITE_SUPABASE_ANON_KEY=你的_supabase_anon_key参考 docs/SETUP.md(如无,可在 Supabase 控制台创建下列数据表:projects、tasks、tags、checkin_records 等,并配置 RLS 规则与 Realtime)。
npm run dev默认运行在 http://localhost:5173。
- 点击"离线模式"按钮直接进入离线模式
- 使用账号登录则进入在线模式
- 进入 设置 → 数据管理
- 在"存储模式"区域切换开关
- 确认切换(建议先导出数据)
- 应用将自动重载
在线/离线模式的数据完全隔离,需通过导入导出迁移:
- 在当前模式下导出数据(设置 → 数据管理 → 导出)
- 切换到目标模式
- 导入之前导出的数据包
| 命令 | 说明 |
|---|---|
npm run dev |
开发服务器 |
npm run build |
生产构建 |
npm run preview |
预览生产构建 |
npm run lint |
ESLint 检查 |
npm run test |
运行测试 |
npm run tauri:dev |
桌面客户端调试 |
npm run tauri:build |
桌面客户端打包 |
- Fork 或 Clone 本仓库到你的 GitHub 账号。
- 登录 Vercel 并导入项目。
- 在 Project → Settings → Environment Variables 中添加:
VITE_SUPABASE_URLVITE_SUPABASE_ANON_KEY分别填入 Supabase 项目的 URL 与 anon key,并确保在 Production / Preview / Development 环境都配置。
- 点击 Deploy,稍待片刻即可访问线上版本。
若部署后页面提示 "Missing VITE_SUPABASE_URL",通常是环境变量未正确设置或未推送到所需环境。
💡 即使未配置 Supabase,用户仍可使用离线模式。
- 运行
npm run build生成dist/静态资源。 - 将
dist/上传至 Netlify、Cloudflare Pages、GitHub Pages、S3/OSS 等平台,或自行托管于 Nginx/Apache。
npm run tauri:build生成的安装包位于 src-tauri/target/ 对应目录,可按平台分发。
首次打开未签名的应用可能遇到 "应用已损坏,无法打开" 或 "无法验证开发者" 提示,可执行以下命令解除隔离:
xattr -cr "/Applications/Snail TodoList.app"若安装路径不同,请替换为实际路径。之后重新打开应用即可。
若被 Windows Defender 拦截:
- 点击"更多信息"。
- 选择"仍要运行"。
- 可将程序添加至白名单,避免后续再次提示。
- 任务管理(增删改查、完成、放弃、恢复)
- 项目分组与排序
- 标签体系
- 富文本编辑(Milkdown)
- 打卡与统计
- 深浅色主题
- 响应式布局
- Tauri 桌面客户端
- 离线模式(IndexedDB 本地存储)
- 用户可控模式切换(在线/离线)
- 数据导入导出
- 自建后端服务(替代 Supabase)
- RESTful API 设计
- 用户认证(JWT)
- Docker 一键部署
- 支持 SQLite / PostgreSQL
- 数据同步(离线 ↔ 在线)
- 任务提醒与通知
- 日历视图
- 番茄钟集成
- 多语言支持(i18n)
- 移动端 App(React Native / Flutter)
- Fork 仓库并创建分支:
git checkout -b feature/xxx - 提交修改:
git commit -m "feat: xxx" - 推送到远程:
git push origin feature/xxx - 提交 Pull Request,附上修改说明
如需帮助或想参与讨论,请访问 Issues。
本项目采用 MIT License。欢迎在遵循许可的前提下自由使用、修改与分发。
愿你在蜗牛般的步调中,也能持续推进每一个目标 🐌。