A mobile-responsive web app that integrates multiple Google Calendars with Todoist tasks, featuring drag-and-drop time blocking.
- Multi-Calendar Support: Connect and view multiple Google Calendar accounts
- Todoist Integration: View and manage your Todoist tasks
- Drag-and-Drop Time Blocking: Drag tasks from the sidebar directly to your calendar to schedule them
- Task Filtering: Toggle visibility of all-day tasks and completed tasks
- Mobile Responsive:
- Desktop: Traditional week/day/month calendar views
- Mobile: Horizontal week view with 7 rows (one per day) for better touch interaction
- Real-time Updates: Changes sync immediately with Google Calendar and Todoist
Frontend:
- React 18
- Vite
- FullCalendar
- Axios
Backend:
- Node.js
- Express
- Google Calendar API
- Todoist API
- Node.js 18+
- Google Cloud Project with Calendar API enabled
- Todoist account and API credentials
-
Navigate to the server directory:
cd server -
Install dependencies:
npm install
-
Create a
.envfile based on.env.example:cp .env.example .env
-
Configure environment variables in
.env:PORT=3001 # Google OAuth GOOGLE_CLIENT_ID=your_google_client_id GOOGLE_CLIENT_SECRET=your_google_client_secret GOOGLE_REDIRECT_URI=http://localhost:3001/api/google/callback # Todoist API Token TODOIST_API_TOKEN=your_todoist_api_token -
Start the server:
npm run dev
-
Navigate to the client directory:
cd client -
Install dependencies:
npm install
-
Start the development server:
npm run dev
-
Open your browser to
http://localhost:3000
- Google Calendar: Click "Connect" in the setup guide or navigate to
/api/google/auth - Todoist: Add your API token to the
.envfile (get it from Todoist Settings → Integrations → Developer)
- Find a task in the left sidebar
- Drag it to a time slot on the calendar
- The task will be scheduled at that time in Todoist
Use the toggles in the task panel to:
- Show/hide all-day tasks
- Show/hide completed tasks
On mobile devices (< 768px width), the week view automatically switches to a horizontal layout where each day is displayed as a row, making it easier to scroll through your week.
GET /api/calendar/events?startDate=<ISO>&endDate=<ISO>- Get events from all connected Google accounts
GET /api/todoist/tasks- Get all Todoist tasksPOST /api/todoist/tasks/:id/schedule- Schedule a task{ "datetime": "2024-01-15T14:00:00Z" }
GET /api/google/auth- Initiate Google OAuth flowGET /api/google/callback- Google OAuth callbackGET /api/todoist/status- Check if Todoist API token is configured
calendar-app/
├── client/ # React frontend
│ ├── src/
│ │ ├── components/ # React components
│ │ ├── hooks/ # Custom React hooks
│ │ ├── App.jsx # Main app component
│ │ └── main.jsx # Entry point
│ ├── package.json
│ └── vite.config.js
│
└── server/ # Express backend
├── src/
│ ├── config/ # Configuration files
│ ├── routes/ # API routes
│ ├── services/ # Business logic
│ └── server.js # Server entry point
└── package.json
To add another Google account:
- Visit
/api/google/authwhile logged into the desired Google account - Grant permissions
- The calendar will automatically include events from this account
- Verify Todoist authentication at
/api/todoist/auth - Check browser console for API errors
- Verify Google authentication at
/api/google/auth - Ensure date range is correct
- Check that calendars have events in the selected time period
- Ensure JavaScript is enabled
- Try refreshing the page
- Check browser console for errors
ISC