尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
sYnX is a to-do list app
翻译准备中
正在加载完整 README。
查看完整 README ↗sYnX is a to-do list app for the web and Android. The web app is a Remix app on Cloudflare Workers with a Cloudflare D1 database. The Android app is built with Expo and React Native, and uses the same account and data through the web app's REST API. Both live in this repo.
Live at synx.christran.io.
Lists and tasks (web and mobile)
Checklist, Study, Shopping, Movies, Work, Personal, Travel, Fitness, or a custom one.5m to 60m presets or a custom value), and subtasks nested under their parent task.Sharing
Accounts and guest mode
auth.christran.io, with PKCE. Sessions renew in the background.Reminders and notifications
Web extras
For the Android app's extras, see Mobile app.
| Framework | Remix 2.17 (on Vite 5) with React 19, running on Cloudflare Workers with static assets |
| Database | Cloudflare D1 (synx-db, binding DB) |
| Styling | Tailwind CSS 3 |
| Auth | OpenAuth client (@openauthjs/openauth) against sYnID |
| Validation | Valibot |
| Tooling | Wrangler 4, TypeScript 5.8, ESLint 9 (flat config), Vitest 4 with @cloudflare/vitest-pool-workers |
server.ts is the Worker entry. Its fetch handler serves the Remix app, and its scheduled handler is the every-minute reminder cron (triggers.crons in wrangler.jsonc).
/api/v1)The mobile app uses these routes. They expect a sYnID access token in an Authorization: Bearer <token> header.
| Route | Methods |
|---|---|
/api/v1/lists | GET, POST |
/api/v1/lists/:id | GET, PUT, DELETE |
/api/v1/lists/:id/share-mode | PUT |
/api/v1/lists/:id/shared | DELETE (remove from Shared with me) |
/api/v1/todos | GET, POST |
/api/v1/todos/:id | PUT, DELETE |
/api/v1/todos/:id/completed | POST |
/api/v1/todos/:id/toggle | POST |
/api/v1/todos/:id/mark-reminder-sent | POST |
/api/v1/todos/clear-completed | POST |
/api/v1/settings | GET, PUT |
/api/v1/settings/time-zone | PUT |
/api/v1/devices | POST (register a push token), DELETE (unregister it) |
Set these on the Worker in the Cloudflare dashboard, or locally in a .dev.vars file (gitignored). Only DB is needed to run locally. Each notification channel is skipped when its secret isn't set.
| Name | Used for |
|---|---|
DB | D1 binding, set up in wrangler.jsonc |
OPENAUTH_ISSUER | sYnID issuer URL (defaults to https://auth.christran.io) |
CLIENT_ID_MAP | Optional JSON map from hostname to OAuth client ID (defaults to synx) |
SYNX_ALLOWED_CLIENT_IDS | Optional comma-separated list of accepted token audiences (defaults to synx) |
RESEND_API_KEY | Reminder emails and email-to-SMS |
TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_FROM_NUMBER | Text messages through Twilio, used when no carrier is set |
FIREBASE_SERVICE_ACCOUNT_JSON | Push notifications through FCM |
The Android app lives in mobile/. It's an Expo SDK 58 app (React Native 0.88, React 19.3) in the Expo project synx, owned by chris-tran, with the Android package io.christran.synx. It uses the production web app's /api/v1 routes.
Features
以上为 README 的开头部分。其余内容请阅读原文。 查看完整 README ↗