Wenlan
Wenlan is a source-backed AI knowledge base and LLM wiki for AI work: organize documents and decisions into pages you can find, inspect, and review.
翻訳待ち
リポジトリ情報はまだ収集していません。
No updates detected yet. GitHub releases will appear here.
sYnX is a to-do list app
翻訳待ち
Loading the full README.
Read the full 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
This is the beginning of the README. Read the rest at the original. Read the full README ↗