A stupidly simple, candy-colored desktop calendar for Windows with two-way Google Calendar sync, a birthday module that reminds you a week ahead, time blocking, and desktop notifications. Jelly-bean events, springy animations, bubblegum/mango/mint/berry palette.
Built with Tauri 2 + React + TypeScript β the whole app is a few small files.
- π Two-way Google Calendar sync β anything you add/change/delete in Stupid Simple lands in Google instantly; changes from Google (your phone, the browser) come back automatically every minute
- π Birthdays β type a name + day and month; you get a yearly event with a reminder 7 days ahead and on the day itself; the sidebar counts down to upcoming birthdays
- π§± Time blocking β drag across the hour grid in day/week view to block time; drag across days in month view to create multi-day events
- π Desktop notifications β 10 minutes before and at event start, plus a separate one when someone has a birthday today
- β Daily tasks β a checklist per day in the sidebar: add, check off, edit inline, delete; the month view shows a done/total badge on each day (stored locally, not synced)
- π₯ Backlog β undated someday-tasks; the π button on any task moves it to today, tomorrow, a picked date, or back to the backlog
- π Tasks board β a dedicated tab (press
B) with Backlog, Overdue, Today, Tomorrow and Upcoming columns; overdue days offer a one-click "move all to today"; the sidebar is resizable by dragging its edge - β¨ AI quick-add β type "gym tomorrow 18:00" and AI files it as an event or task; works with a free Gemini API key from aistudio.google.com/apikey (paste it in Settings)
- π Sidebar sections collapse and remember their state
- βοΈ Settings β default view, 12/24-hour clock, dark mode, and five accent colors
- π Day / week / month views, a "now" line, candy colors, event editing and deleting, optimistic saves with rollback on error; click a day number in month view to jump to that day
- π Event details at a glance β descriptions show up right on the calendar (inline in month view, under the title in week/day view, full text on hover); click any event for a details card with the complete description, then edit or delete from there
| Key | Action |
|---|---|
β / β |
previous / next day, week or month |
T |
jump to today |
D / W / M / B |
day / week / month / tasks-board view |
N |
new event |
+ / - (or Ctrl+scroll) |
zoom the hour grid in week/day view |
Esc |
close dialog |
Stupid Simple also builds as an Android app (same codebase, Tauri 2).
- Grab the latest
.apkfrom Releases (thearm64/universalone for a normal phone). - Copy it to your phone and open it β Android will ask to allow installing from this source; accept.
- Open the app, tap Connect Google Calendar, sign in. The sidebar lives behind the β° button; day view is the default on phones.
The phone build is signed with the project's release key, so updates install cleanly over each other.
- Go to Releases and download the latest
.msi(or-setup.exe) installer. - Run it. That's the whole install.
- Launch Stupid Simple, click Connect Google Calendar, sign in in the browser β done. Releases from v1.4.1 on ship with a built-in OAuth client, so there's nothing to configure.
While the app awaits Google's verification, the browser may show "Google hasn't verified this app" β click Advanced β Go to Stupid Simple (unsafe) to continue. Your data goes straight from your machine to Google; there's no server in between.
- Open https://console.cloud.google.com and create a new project (call it anything, e.g. "Stupid Simple").
- APIs & Services β Library β search for Google Calendar API β Enable.
- APIs & Services β OAuth consent screen:
- User type: External β Create
- Fill in the app name and your e-mail, skip the rest β Save
- Under Test users add your own Gmail address (important β without this Google blocks sign-in with "app has not been verified")
- APIs & Services β Credentials β Create Credentials β OAuth client ID:
- Application type: Desktop app
β οΈ (not "Web application" β see troubleshooting below) - Any name β Create
- Copy the Client ID and Client Secret
- Application type: Desktop app
- Paste both into the app on the first-launch screen β Save keys β Connect Google Calendar β your browser opens β sign in and approve. Done β the keys are remembered.
Google shows this in the browser when your OAuth client was created as
"Web application" instead of "Desktop app". Desktop apps sign in via
http://127.0.0.1:<random port>, which Google only permits for Desktop-app
clients.
Fix: in Google Cloud Console go to APIs & Services β Credentials β Create Credentials β OAuth client ID, pick Application type: Desktop app, then paste the new Client ID and Secret into the app (login screen β Use different API keys). You can delete the old Web client.
Add your Gmail address under OAuth consent screen β Test users. Test apps can only be used by listed test users.
The browser tab must end on a "Signed in!" page. If your firewall prompts
about the app listening on 127.0.0.1, allow it β that's the one-shot local
listener Google redirects back to.
Prerequisites (Windows): Node.js 20+, Rust, Visual Studio C++ Build Tools (check "Desktop development with C++"), and WebView2 (usually already on Windows 10/11). Full checklist: https://tauri.app/start/prerequisites/
git clone https://github.com/RomanGumeniuk/stupid-simple.git
cd stupid-simple
npm install
npm run tauri dev # development mode (first Rust compile takes a few minutes)
npm run tauri build # installer ends up in src-tauri/target/release/bundle/Optionally copy .env.example to .env and fill in your keys to bake them
into your own build β then the app skips the key screen entirely. Don't
commit .env (it's already in .gitignore).
Push a tag like v1.0.1 (or run the Release workflow manually) and
GitHub Actions builds the Windows installer and attaches it to a GitHub
Release automatically.
src/ β frontend (React + TS)
lib/google.ts β OAuth + Google Calendar API v3 client
lib/store.ts β Zustand: state + sync engine
lib/notify.ts β notifications + date helpers
components/ β Sidebar, MonthView, WeekView, modals
src-tauri/
src/lib.rs β the only Rust: OAuth loopback listener (pure std)
- OAuth: the standard desktop loopback flow β Rust binds a random port on 127.0.0.1, the app opens the system browser, Google redirects back to localhost with a code, and the code is exchanged for tokens. Exactly what VS Code and Spotify do. (Google's Device Flow is not an option here β it doesn't allow the Calendar scope.)
- Sync: mutations (create/patch/delete) hit the API immediately (optimistic UI with rollback); remote changes are pulled by polling every 60 s and after every mutation.
- Birthdays: plain Google events with
RRULE:FREQ=YEARLY+reminders.overrides(10080 min = 7 days) + a marker inextendedProperties.private, so they also show up in regular Google Calendar on your phone.
- Only the primary calendar is synced β multi-calendar support would be a good v1.1
- Editing a single occurrence of a recurring event changes that occurrence
(that's how the API returns them with
singleEvents=true) - Tokens live in the app window's localStorage β fine for personal use; v2 could move them to the system keychain