Establishing connection...

sYnX


sYnX is a fast, collaborative to-do list app for organizing and tracking personal and professional tasks on the web and on Android. The web app is built with React Router 8 and runs 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. Sign-in goes through sYnID, the sYnVerse single sign-on server.

sYnX is open source under the GNU AGPL-3.0 license. The full source is on GitHub.

Technical Stack

Application Layer

FrameworkReact Router 8 with React 19
Build ToolVite (using @react-router/dev & Cloudflare Vite Plugin)
LanguageTypeScript
StylingTailwind CSS
ValidationValibot

Edge Deployment

HostingCloudflare Workers Assets (Static + Dynamic routing)
DatabaseCloudflare D1 (Serverless SQL, versioned migrations)
Data LoadingStreaming Deferred Loaders (Suspense + <Await>)
RemindersCron Trigger (runs every minute)
AuthsYnID (OpenAuth, PKCE)
CI/CDGitHub Actions + Cloudflare Workers Builds

Mobile App

PlatformAndroid
FrameworkExpo SDK 58 with React Native 0.88
Updates & CIOver-the-Air (OTA) via expo-updates + EAS Fingerprint
Data SyncsYnX REST API + TanStack Query (offline persistence)
Push & CalendarFirebase Cloud Messaging + Device Calendar Sync
VersioningDynamic runtime versioning with expo-application

Cloudflare D1 Database Binding: The developer setup utilizes Cloudflare’s Dev Proxy to dynamically bridge bindings (such as the synx-db D1 database) directly into the local React Router Vite server during development.

Core Features

  • Collaborative Sharing & Creator Deletes — Share task lists as Private, View-Only, or Collaborative. Lists opened from someone else’s link appear under “Shared with me” with the owner’s display name, and emails are never shown. On Collaborative lists, collaborators can delete tasks they added themselves immediately without waiting for owner approval, while deleting tasks added by others still routes through owner approval queues.
  • Activity Log — Shared lists keep an owner-only Activity log of who added, edited, completed, or deleted tasks and who requested deletes. Entries are removed automatically after 90 days.
  • Completed Section — Completed tasks and subtasks automatically move into a collapsible “Completed (N)” section at the bottom of lists and subtask lists on both web and mobile, keeping workflows tidy while preserving one-tap unchecking and restoration.
  • Nested Subtasks & Dedicated Editing — Break tasks down into subtasks nested under their parent task. On mobile, a dedicated subtask editing modal provides pencil actions, multiline title text wrapping, and compact duration indicators.
  • Priorities, Durations & Category Emojis — Assign priority levels with visual colored left stripes on mobile, optional task durations with narrow-screen responsive pickers, and category tags displaying preset emoji indicators (🛒 Shopping, 🎬 Movies, 📚 Study, ✈️ Travel, etc.) across web and mobile, with support for clearing back to None.
  • Reminders & Recurring Tasks — Set reminders with quick presets or a custom date and time picker (with distinct reminder date and time indicators on mobile task cards), and repeat tasks Daily, Weekly, or Monthly. Repeating tasks preserve their local time in your home time zone across daylight saving changes.
  • Calendar View & Device Sync — View tasks on an interactive calendar next to the list view. On the web, drag unscheduled tasks onto any day; on mobile, synchronize reminders directly to device calendars with interactive permission prompt detection.
  • Search & Sorting Options — Search tasks and subtasks with isolated matching subtasks and highlighted query terms. Filter by All, Active, or Done, and sort by Reminder Time (with priority fallback), Date Created, or Name, remembered per list.
  • Streaming Performance & Instant Navigation — The web app utilizes React Router deferred loaders to render task lists instantly while streaming activity logs, delete queues, and profile avatars via Suspense. Sidebar list switching leverages client-side prefetching (Link prefetch=“intent”) for instantaneous transitions without full-page reloads.
  • Over-The-Air (OTA) Mobile Updates — The mobile app receives rapid over-the-air JavaScript and asset updates through expo-updates. The EAS CI/CD pipeline calculates runtime fingerprints to auto-publish OTA updates when native code is untouched, and only builds new preview APKs when native dependencies change.
  • Multi-Channel Notifications — An every-minute cron trigger sends due reminders by email, text message (supporting all major carriers), Discord webhook, and push notifications to phones, with real-time browser notifications while the web app is open.
  • Single Sign-On & Guest Mode — Sign in once with sYnID, with sessions that renew seamlessly in the background and support OAuth profiles (Google, GitHub, Microsoft). Without signing in, guest mode stores lists in local browser storage and seamlessly migrates them upon authentication. Guests can view shared lists in read-only mode and sign in to collaborate.
  • Android App & Interactive Widgets — Native Android app featuring Tasks, Calendar, Lists, and Settings screens, plus three home screen widgets. The Pinned List widget allows switching the active list directly from the home screen widget and adheres to the list’s custom task sort order.
  • Theme Customizer — Choose between Midnight Indigo, Emerald Forest, Sunset Rose, Cyberpunk Neon, and Light Pastel themes on the web, and light, dark, or system themes on Android.

What’s Next

The next major release (web v6 and Android v4) adds smart quick add, where typing something like “call mom tomorrow 5pm” fills in the date and time, plus time tracking with a Start button and stats on how long tasks take. Progress is tracked in the public sYnX: Web v6 / Mobile v4 project on GitHub.

React RouterCloudflare Workers AssetsCloudflare D1TypeScriptViteReactReact NativeExpoexpo-updatesTailwind CSS
visitor@christran.io — bash
visitor@christran.io:~$type a command and press Enter. try help or ls
visitor@christran.io:~$