{"id":31532629,"url":"https://github.com/jayvicsanantonio/sync-flow","last_synced_at":"2026-05-18T03:03:07.192Z","repository":{"id":307195992,"uuid":"1028589342","full_name":"jayvicsanantonio/sync-flow","owner":"jayvicsanantonio","description":"Serverless API for bidirectional sync between Apple Reminders and Google Tasks. Built with Hono, TypeScript, and Vercel Edge Functions. Features OAuth 2.0, real-time webhooks, metadata preservation, and beta access system.","archived":false,"fork":false,"pushed_at":"2025-09-30T06:44:22.000Z","size":425,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-30T08:36:54.820Z","etag":null,"topics":["hono","oauth2","typescript","vercel-serverless-functions"],"latest_commit_sha":null,"homepage":"https://sync-flow-nine.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jayvicsanantonio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-07-29T18:53:17.000Z","updated_at":"2025-09-30T06:44:19.000Z","dependencies_parsed_at":"2025-07-30T01:02:16.873Z","dependency_job_id":"f0f5481b-44a5-402b-9ee8-fd4daaf8d849","html_url":"https://github.com/jayvicsanantonio/sync-flow","commit_stats":null,"previous_names":["jayvicsanantonio/sync-flow"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jayvicsanantonio/sync-flow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jayvicsanantonio%2Fsync-flow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jayvicsanantonio%2Fsync-flow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jayvicsanantonio%2Fsync-flow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jayvicsanantonio%2Fsync-flow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jayvicsanantonio","download_url":"https://codeload.github.com/jayvicsanantonio/sync-flow/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jayvicsanantonio%2Fsync-flow/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278262444,"owners_count":25957938,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hono","oauth2","typescript","vercel-serverless-functions"],"created_at":"2025-10-04T03:56:46.173Z","updated_at":"2025-10-04T03:56:57.194Z","avatar_url":"https://github.com/jayvicsanantonio.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Sync Flow Documentation\n\n## Overview\n\nSync Flow is a serverless API that enables bidirectional synchronization between Apple Reminders and Google Tasks. Built on Vercel Edge Functions, it provides webhook endpoints for real-time sync and uses OAuth 2.0 for secure Google account integration.\n\n## Quick Links\n\n- [Getting Started](./docs/GettingStarted.md) - Setup and run the project locally\n- [Architecture](./docs/Architecture.md) - System design and technical decisions\n- [API Reference](./docs/API.md) - Detailed endpoint documentation\n- [Deployment](./docs/Deployment.md) - Deploy to production on Vercel\n- [Development](./docs/Development.md) - Development workflow and best practices\n\n## Key Features\n\n- **Two-way Sync**: Changes in Apple Reminders sync to Google Tasks and vice versa\n- **OAuth 2.0**: Secure Google account integration\n- **Metadata Preservation**: Priority, URLs, and tags sync between platforms\n- **Automatic Token Refresh**: Seamless authentication experience\n- **Real-time Updates**: Webhook-based synchronization\n- **Beta Access System**: Email collection with automatic owner notifications\n- **Serverless**: Runs on Vercel Edge Functions for global performance\n\n## Technology Stack\n\n- **Runtime**: Node.js on Vercel Edge Functions\n- **Framework**: [Hono](https://hono.dev/) - Lightweight web framework\n- **Language**: TypeScript with ES modules\n- **Database**: [Upstash Redis](https://upstash.com/) - Serverless Redis\n- **Validation**: [Zod](https://zod.dev/) - Runtime type validation\n- **Authentication**: Google OAuth 2.0\n\n## Project Structure\n\n```\nsync-flow/\n├── api/\n│   └── index.ts         # Main API entry point (single Edge Function)\n├── src/                 # Source code (imported by API)\n│   ├── handlers/        # Request handlers for each endpoint\n│   │   ├── auth.ts      # OAuth callback handler\n│   │   ├── early-access.ts # Beta access handler\n│   │   ├── landing.ts   # Landing page handler\n│   │   ├── sync.ts      # Fetch updates handler\n│   │   └── webhook.ts   # Task CRUD webhook handlers\n│   ├── services/        # Business logic layer\n│   │   ├── email.ts     # Email notification service\n│   │   ├── google-auth.ts   # Google OAuth service\n│   │   ├── google-tasks.ts  # Google Tasks API service\n│   │   └── user.ts          # User data service\n│   ├── types/           # TypeScript type definitions\n│   │   ├── auth.ts      # Authentication types\n│   │   ├── google-api.ts # Google API types\n│   │   └── user.ts      # User model types\n│   └── utils/           # Utility functions\n│       ├── errors.ts    # Custom error classes\n│       └── rate-limit.ts # Rate limiting utilities\n├── docs/                # Documentation\n├── package.json         # Dependencies and scripts\n├── tsconfig.json        # TypeScript configuration\n├── vercel.json          # Vercel deployment config\n└── eslint.config.js     # Linting configuration\n```\n\n## How It Works\n\n1. **Authentication**: Users sign in with Google via OAuth 2.0\n2. **Task Creation**: Apple Reminders sends webhook requests to create tasks in Google Tasks\n3. **Task Updates**: Changes are synced bidirectionally via webhooks and polling\n4. **Metadata Handling**: Apple-specific fields (priority, URLs) are embedded in Google Task notes\n5. **Mapping Storage**: Redis maintains sync mappings between Apple syncIds and Google Task IDs\n\n## Beta Access System\n\nSyncFlow includes a built-in beta access request system that:\n\n- **Collects User Interest**: Landing page form captures email addresses\n- **Prevents Duplicates**: Redis-based deduplication\n- **Owner Notifications**: Automatic email alerts via Resend\n- **Admin Dashboard**: View and export beta requests\n- **Rate Limited**: Protects against spam (5 requests/hour per IP)\n\n### Environment Variables\n\nCopy `.env.example` to `.env.local` and configure:\n\n```bash\n# Required for Resend email notifications\nRESEND_API_KEY=re_your-resend-api-key\nBETA_NOTIFICATION_TO=owner@yourdomain.com\nBETA_NOTIFICATION_FROM=\"SyncFlow \u003cbeta@yourdomain.com\u003e\"\n\n# Optional (defaults to enabled)\nEMAIL_NOTIFICATIONS_ENABLED=true\n\n# Required for admin endpoints\nADMIN_SECRET=your-secure-admin-secret\n```\n\n## Contributing\n\nPlease read our [Development Guide](./docs/Development.md) for details on our code standards, development workflow, and the process for submitting pull requests.\n\n## Support\n\nFor issues and questions:\n\n- Review the [API Reference](./docs/API.md)\n- Examine the [Architecture](./docs/Architecture.md) for design decisions\n\n## License\n\nThis project is proprietary software. All rights reserved.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjayvicsanantonio%2Fsync-flow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjayvicsanantonio%2Fsync-flow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjayvicsanantonio%2Fsync-flow/lists"}