SyncMaster is a self-hosted automation tool that connects your Canvas LMS account with Google Calendar and Todoist, automatically creating events and tasks for upcoming assignments.
Overview
I designed SyncMaster to simplify my student workflow: instead of checking Canvas every day or reliying on the Canvas app to notify me, assignments would appear directly in my calendar and to-do app.
The system fetches data from Canvas, processes it through a Go backend, and syncs to external services all self-hosted in my homelab.
Architecture
- Frontend: Next.js (App Router) + tRPC + NextAuth + Drizzle ORM
- Backend: Go service handling all sync logic
- Database: Shared PostgreSQL instance
- Integrations: Canvas API, Google Calendar API, Todoist API
- Deployment: Docker Compose (frontend + backend + database)
Assignments are identified by deterministic SHA1 IDs to avoid duplicates, and every sync run is idempotent you can safely re-run it without breaking your data.
How It Works
- Connect your Canvas, Google, and Todoist accounts through the dashboard.
- SyncMaster fetches assignments and filters only upcoming, actionable ones.
- The backend worker creates or updates calendar events and Todoist tasks.
- Old or completed assignments are automatically cleaned up.
Current Status
The system is currently live at canvas.cachaza.cc used by me and a few friends.
It’s stable, functional, and running on my Proxmox-based homelab setup.
Built With
- Next.js 15 + TypeScript
- Go 1.23
- Postgres
- tRPC & Drizzle ORM
- NextAuth (Google OAuth)
- Docker + Cloudflare Tunnels for access
Next Steps
- Add metrics dashboard (sync success, failed tokens, retry count)
- Implement Notion / Outlook integration
- Improve per-course calendar configuration
Related Posts
→ Self-Hosted Gitea on Proxmox
→ Local CI/CD with GitHub Actions