Skip to content

RomanGumeniuk/stupid-simple

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

14 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🍬 Stupid Simple

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.

Features

  • πŸ”„ 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

Keyboard shortcuts

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

Install on Android πŸ“±

Stupid Simple also builds as an Android app (same codebase, Tauri 2).

  1. Grab the latest .apk from Releases (the arm64/universal one for a normal phone).
  2. Copy it to your phone and open it β€” Android will ask to allow installing from this source; accept.
  3. 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.

Install (the easy way)

  1. Go to Releases and download the latest .msi (or -setup.exe) installer.
  2. Run it. That's the whole install.
  3. 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.

Google setup β€” only if you build from source with your own keys

  1. Open https://console.cloud.google.com and create a new project (call it anything, e.g. "Stupid Simple").
  2. APIs & Services β†’ Library β†’ search for Google Calendar API β†’ Enable.
  3. 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")
  4. 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
  5. 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.

Troubleshooting

Error 400: redirect_uri_mismatch

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.

"App has not been verified" / access blocked

Add your Gmail address under OAuth consent screen β†’ Test users. Test apps can only be used by listed test users.

Sign-in never finishes

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.

Build from source

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).

Releasing

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.

Architecture (for the curious)

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 in extendedProperties.private, so they also show up in regular Google Calendar on your phone.

Known limitations (v1)

  • 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

License

MIT

About

🍬 A stupidly simple candy-colored desktop calendar with two-way Google Calendar sync, birthdays & time blocking (Tauri 2 + React)

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors