shouldivibecodeit

Should I vibe codeMorgen?

Unify calendars and tasks, create booking pages, and plan work across time zones

A unified day view is one sitting. Two-way sync is a machine that emails your colleagues every time it is wrong.

?

Their verdict, the Pro price and the build-time estimate come from their entry, MIT-licensed. Checked 2026-08-04.

Can you build it?asked by canivibecodeit.com ↗KINDAweekend project · one sitting
?

Our verdict, the regret score and everything below it. Editorial and unsponsored — nobody can pay to be moved.

Should you ship it?asked by usDEMO ONLYvibe the v0, throw it away.

The honest answer

why the verdict is what it is

The demo is genuinely one sitting: pull three calendars and a task list into one column, drag a task onto a free slot, feel briefly excellent. Everything past that is bidirectional sync between systems that each believe they own the record, and calendars are the worst possible place to learn that lesson, because a calendar write is not a write — it is an email to everyone on the invite. Add the booking page and you have also published an unauthenticated endpoint whose job is to create events on your real calendar from strangers. Build the read-only version; it is the good project hiding inside this one.

What actually breaks

not "if". the specific failures.

  • The sync loop. Your app writes an event, the provider's change notification fires, your app reads it back as a remote edit and writes again — and every lap sends an updated invite to everyone on it
  • Expired sync tokens. Google returns 410 GONE once your nextSyncToken goes stale, and code that treats 410 as a generic error simply stops syncing while the UI keeps rendering last Tuesday
  • Recurring events. Move one instance of a standing meeting and a naive implementation rewrites the series, so eleven people get a reschedule for the next six months
  • The task mapping. Todoist, Asana, Notion and Google Tasks disagree about what a due date is, whether it has a time, what recurrence means and what completion does — every round trip drops a field
  • All-day events and timezones. Date-only values, floating times and a DST boundary are three different bugs that all look like 'my day is off by an hour'
  • The booking page: a public write endpoint into your calendar with no rate limit, computing availability from a cache that is a minute behind reality

Is that you?

the verdict is a default, not a law

ship it if
  • It is read-only — one column that renders calendars and tasks it never writes back to
  • The only writes are to a calendar you own with no attendees on anything
  • There is no booking page, or the booking page is a link to a service that already does this
don’t ship it if
  • It edits events that have other people on them
  • The booking page is public and you have not written the rate limit yet
  • A cancellation could be sent by a background job while you are asleep
  • It is the only place a commitment exists, rather than a nicer window onto Google or CalDAV

If you build it anyway

the checklist, then the prompt that enforces it

  1. Read-only until it is genuinely useful. A unified day view that never writes is most of what you actually wanted, and it cannot email anybody.
  2. When writes arrive, restrict them to events your app created, in a dedicated calendar, with no attendees. Never touch an invite you did not originate.
  3. Handle 410 GONE from Google's sync token as an explicit 'full resync required' state on screen. Silent sync death is the standard ending for this project.
  4. Every write is idempotent and tagged with your own id in extendedProperties, so a re-run reconciles instead of duplicating.
  5. Never modify a recurring series when the user touched one instance. Write the exception, and put a test around it before you ship the drag handle.
  6. The booking page gets rate limits, a token per link, an expiry, and a hold-then-confirm flow that re-checks free/busy at the provider rather than trusting your cache.
  7. Use a real RRULE library and store every time as a UTC instant plus an IANA zone. 'Thursday 15:00' is not a time.
the guardrail prompt
I am building a planner that unifies my calendars and task apps into one day view, and eventually offers a booking page. Apply these constraints first and push back if I ask you to break one.

1. Build the whole thing read-only first. Pull events and tasks, render the
   day, and issue zero writes to any provider. Tell me when that is done and
   make me ask for writes explicitly.
2. When writes are allowed, they may only touch events my app created, in a
   calendar my app owns, with no attendees. Refuse to modify or delete an
   event that has other people on it.
3. Tag every event you create with your own identifier in the provider's
   extended properties, and make every write idempotent on that id. A re-run
   must reconcile, never duplicate.
4. Implement incremental sync with sync tokens, and treat a 410 GONE as an
   explicit 'full resync required' state surfaced in the UI. Never swallow it
   as a generic error.
5. Add loop protection before the first write: ignore change notifications for
   revisions your own writer produced, and cap writes per event per hour. Tell
   me plainly that each write to an event with attendees sends mail to real
   people.
6. Never rewrite a recurring series when I edit one occurrence. Create the
   instance exception, and write a test that asserts the series is untouched.
7. Use an established RRULE library. Do not hand-roll recurrence.
8. Store every time as a UTC instant plus an IANA timezone name; keep all-day
   events as date-only values and never coerce them into midnight local.
9. Task providers disagree about due dates, recurrence and completion. Write
   the mapping table into the README, and list explicitly which fields are
   lost in each direction rather than silently dropping them.
10. The booking page comes last, and only with: a high-entropy token per link,
    an expiry, per-IP and per-link rate limits, and a hold-then-confirm flow
    that re-checks free/busy at the provider before creating anything.
11. No background job may send a cancellation. Deletions are interactive and
    confirmed, always.
12. Out of scope, and say so rather than half-building: meeting-notes
    capture, routines, and any AI that reschedules without asking. Then tell
    me that Morgen is $15 a month on the annual plan.
paste this before you build — not after something breaks34 lines · 2290 chars

That one keeps you out of trouble. For the prompt that actually builds it, canivibecodeit.com has one.

their build prompt ↗

Or don’t build it

the boring option, and the way back out

just pay for it

When you want it to be the thing you plan your week in. Morgen is $30 a month month-to-month, $15 if you pay for the year, and it is buying you the connectors and the sync semantics rather than the layout. If the booking page is really what you were after, Cal.diy self-hosts that half for nothing and has already been attacked by people who were not you.

$30/mo is cheaper than your weekend.

your exit plan, if you already built it

The exit is free if you never take ownership: leave the events in Google, Outlook or CalDAV and the tasks in whatever app already holds them, and your planner is a view you can delete on a Tuesday with nothing lost. The moment you introduce state that lives only in your app — your own time blocks, your priorities, your booking links — mirror it into a real calendar or export it to .ics on a schedule, because that is the part nobody else can reconstruct.

prior art · someone already did this
Vikunja

Mature open-source task manager with lists, kanban, recurring work and a CalDAV interface.

Cal.diy

The open-source community edition of Cal.com, covering the booking-page half; its README warns it is meant for personal, non-production self-hosting.

Questions

Why is a calendar write treated as irreversible?

Because the provider mails everyone on the invite the moment the event changes. You can delete the event your code created; you cannot unsend the update notification, and you certainly cannot unsend the cancellation. That is the difference between a bug in a task app, where you fix the row, and a bug in a calendar app, where you fix the row and then explain yourself to eleven people.

Is the read-only version actually satisfying?

It is most of the appeal. The thing people love about Morgen is seeing calendars and tasks in one column with sane time blocks, and none of that requires writing anything anywhere. Read-only also collapses the risk on this page to roughly zero: worst case your day view is wrong and you refresh it.

What breaks first in practice?

A sync token expires. Google hands back 410 GONE, your error handler logs it and moves on, and the app keeps rendering the last successful pull with total confidence. You find out when you miss something, and by then you cannot tell how long the view has been fiction.

did you build it?

Every week, someone ships something they shouldn’t have.

New verdicts, the worst thing that landed in the trap, and the occasional incident report. No other email, ever.

also on the regret index
TickTickSHIP IT

Tasks, habits, a timer. Three small features you will actually use because you chose them.

Things 3SHIP IT

A personal task manager is the app every developer builds. Yours will fit your brain better.

RoutineDEMO ONLY

A planner you don't fully trust is worse than no planner, and trust lives in the sync layer, not the UI.

last reviewed 2026-08-04 · verdict is editorial and unsponsored · shared entry data from canivibecodeit under MIT · not legal advice