# API wish list Changes to the API that would help this app, collected during the rewrite. None of them block it. Done items move to the bottom. ## Open - **List the calendars.** Ids, slugs and names are hardcoded in `lib/calendars.ts` and must be kept in step with `calendarNames` in `events.router.ts`. An endpoint would make a new calendar a data change. - **All calendars in one request.** The admin list makes five parallel requests on every load. - **Restore / history.** Every save already writes a row to `event_versions`, and delete is a `DELETED` version - so "Wiederherstellen" and a change history are possible without schema changes, only endpoints are missing. The UI's delete dialog says it can't be undone "hier". - **Don't return deleted events** from the admin feed (or behind a flag). They arrive as rows with every field `null` except `status`, and the client has to know to drop them. - **Richer recurrence.** `repeatFrequency` goes out as `RRULE:FREQ=` with no interval, end or count. With those, recurrence could become editable in the form (today only Geburtstage get `YEARLY`, automatically). - **A failed update should not be a 200.** `PUT /calendar/events/:id` answers 200 `{"message": "0 rows were updated"}` when nothing was written; the client treats that body as an error. A 404/409 would say it properly. - **Explicit time zones.** The API relies on the process running in Berlin time for the iCal output (see the API's `docs/calendar-ical.md`). Setting `TZ` explicitly at start-up, or formatting with an explicit zone, would remove the dependency on the server's configuration. - **`ORGANIZER` as a cal-address** (`ORGANIZER;CN=Name:mailto:…`) instead of a bare name. - **`DB_PORT` for every pool.** Only the admin pool reads it; calendar, feedback and tickets always use 3306. ## Done - iCal escaping, line folding and CRLF; `text/calendar` content type (API branch `feature/calendar-ical-escaping-subscriptions`, 2026-09-28). - `GET /calendar/events/subscriptions` for the "Abonnieren" dialog (same branch).