![]()
Calendee is the calendar app I use on my Mac. It replaced Fantastical, which I had used since at least 2022 (see Fantastical). It opens on 1 week, every action has a key, and it uses my NicAI design.
Claude Code planned it and built version 1 on 3rd October 2026, the same day I answered its 7 questions. I used it every day after that and asked for changes as they came up. It reached version 1.6 on 23rd October 2026, and on 24th October it got the CLI that lets my agents read it.
Why I replaced Fantastical
When Claude Code looked at how I used Fantastical, the answer was short:
- I used the week view and almost nothing else. No invitations from my personal calendars, no tasks, no iPhone-specific features.
- The only extra I needed was a second time zone next to the hours.
- Every calendar it showed was already synced by macOS. Fantastical added 1 subscribed feed, and macOS already mirrored that feed too.
So a native app on top of Apple's own calendar store could do my whole job. It doesn't need an account, a sync engine or a subscription. And I could make it open faster and work with the keyboard the way I want.
What it does
| Feature | How it works |
|---|---|
| Week view | 7 days, or 5 with W. All-day lane, a line for the current time, working hours lighter |
| Month and year | ⌘2 month, ⌘3 year. The year view shades each day by how busy it is |
| Second time zone | A 2nd column of hours beside the first. Z on or off, ⇧Z next zone |
| Quick add | N in the app, ⌃⌥Space from any app. English, French and German |
| Join the call | J joins the selected event, or the call that is on or starts within 15 minutes |
| Free slots | C copies my free slots for the next 7 days, 09:00 to 18:00, in both zones |
| Copy events | ⌥-drag leaves the original and moves a copy. ⌘C and ⌘V paste at the pointer |
| Search | / searches 1 year back and 1 year ahead. G goes to a date |
| Menu bar | The next meeting with a countdown. A notification 1 minute before a call, with Join |
| Read-only feeds | A busy/free feed shows as plain blocks, without titles, and can't be edited |
? shows every key, so I never need to remember them.
Quick add in 3 languages
I write in English, French and German all day, and my events come in all 3. Quick add parses all of them with 1 deterministic parser, not a language model:
- Dates: "tomorrow", "next Friday", "12 oct", "12. Oktober", "1er mai", "24/12", "in 3 days".
- Times: "1pm", "14h30", "à 9h", "um 15 Uhr", "noon", "midi", "Mittag".
- Ranges and durations: "1-2pm", "de 14h à 15h30", "von 10 bis 11 Uhr", "for 30 min", "für 3 Stunden".
- Repeats: "every monday", "tous les jours", "jeden Montag".
- Place and calendar:
@takes the rest of the line as the location,/picks a calendar by name.
No time gives an all-day event. No date and no time gives the next half hour, 1 hour long. Dates are day-first and weeks start on Monday, as they should in Europe.
Free slots, the job I do most
C copies my free time for the next 7 days as text, working days only, 09:00 to 18:00, in both time zones, ready to paste in an email. I first built this as a Python script in 2023 that read Google Calendar (see Calendee): that is where the name comes from. Now it's 1 key.
How it's built
Stack
- Swift, SwiftUI and AppKit, no packages. About 5,000 lines of Swift in 2 targets.
- CalendeeCore holds the logic with no UI: the quick-add parser, the week layout, the join links, the free-slot finder. 10 unit tests cover it, the parser with 25 phrases in 3 languages.
- EventKit only. macOS syncs the calendars, and Calendee reads and writes them through Apple's framework. No sync code, no database, no account. Settings live in the standard macOS defaults.
Engineering notes
- Sign the app with a real certificate. With an ad hoc signature, macOS treats every build as a new app and asks for calendar access again. A stable signature keeps the permission across rebuilds.
- Square corners cost a private API. I like square windows. macOS 26 has no public way to change the window shape, so Calendee answers the private AppKit method
_cornerMask. If a later macOS stops calling it, the windows go back to rounded and nothing else breaks. - A radius of 0 is slow. SwiftUI draws a
RoundedRectanglewith radius 0 on a slow path: the window took 0.7 s longer to draw. Every radius now has a floor of 0.01, which looks square and draws fast. - The Dock icon shows today's date. Finder shows a fixed date, as Apple's Calendar does. While Calendee runs, it draws today's month and day on the icon and updates it at midnight. The live icon matches macOS's own render of the static one to 0.14% of the pixels.
- QA without a permission prompt. A
--snapshotmode renders any view to a PNG from a read-only copy of the calendar store, then quits. It can also run a list of actions first (open the editor, type in quick add, copy an event), so Claude Code checked each change by looking at the result. - It opens full screen on my 1080p monitor at every launch, and in its last window position when that monitor isn't there.
Agent interface
The CLI lets my agents read my calendar inside a task, see What is NicAI. Every command takes --json, and none of them creates or changes an event: writes stay in the app.
calendee status --json # running, view, open sheet, events today, next event
calendee events --date tomorrow --json # the visible events of 1 day
calendee next --json # the next real meeting, minutes to go, join link
calendee free --days 7 --json # free slots, and the text the C key copies
The CLI is about 450 lines of Python with the standard library only. It reads the calendar store read-only and applies Calendee's own view rules, so an agent sees what I see.
How I built it
- Plan. Claude Code read how I used Fantastical and the calendars on my Mac, then asked 7 questions. The answers set the scope: week view first, EventKit only, a second time zone, quick add in 3 languages, Mac only.
- Build. I said "build now, QA in the back". Version 1 was installed the same day, 3rd October 2026.
- Use and change. Over 3 weeks I asked for the light theme, month and year views, the icon (20 options, then 10 more on my app icon layout), square corners, full screen and event copies.
- Agent interface. On 24th October 2026 it got the CLI and its git repository.
What I left out
- Invitations. EventKit can't add attendees or answer invitations. Building that on CalDAV directly would cost about 1 more day, for a feature I don't use on my personal calendars.
- An iPhone app. CalendeeCore has no Mac-only code, so it's possible. Estimated at 2 to 3 sessions, and not needed yet.
Further reading
The app Calendee replaced:

The Apple framework it's built on:

The tool I built it with:

- see Filee: my own file manager for macOS: the file manager whose corner settings Calendee copied, with the same keys.
- see The era of personal software is here: why I now build the apps I use.
- All my apps: see My apps: everything I built for myself.