# How do I manage the school calendar?

The parent-facing calendar lives at /calendar (day/week/month views, filterable by category and tag). Admin tools are gathered at Manage School Calendar (/calendar/admin):

Source: https://www.studentdirectory.app/help/admins/school-calendar
Last updated: 2026-11-04

*From the School Administrator manual, "School Calendar".*

The parent-facing calendar lives at `/calendar` (day/week/month views, filterable by category and
tag). Admin tools are gathered at **Manage School Calendar** (`/calendar/admin`):

- **+ Add Event** — one event at a time, with a category (General, Performance, Closure, Athletic,
  Other; only a Junior or Senior Admin can choose **Closure**, because a closure removes that day's
  occurrences from every repeating series that skips school closures; an Organization Editor's event
  or repeating event can't be a Closure), free-form tags, and an optional **Location** (for example "Gymnasium"). The location shows
  with a small pin under the event's title on the day view, and in the pop-up text of the event on the
  week and month views. It is also included when a parent subscribes to the calendar in their own
  calendar app.
- **Import Events (CSV/Excel)** — bulk-import a whole season or term from a spreadsheet template,
  same preview-then-confirm pattern as the student importer. One file can hold up to 1,000 events; a
  bigger file is refused at preview with a note to split it (for example by semester). If **Confirm
  import** fails, a red message says why and the preview stays so you can try again.
- **External Calendar Feeds** — see below.
- **Clear Calendar Events** — *Senior Admins only.* See below.

You can also add/edit/delete individual events directly from the day view on `/calendar` itself,
without going through the admin hub.

**Repeating events.** On **+ Add Event** (the school calendar, or an Organization, Class or Department
calendar) the **Repeat** section turns one event into a series, so a weekly rehearsal or a club that
meets Tuesday and Thursday is entered once:

- **Repeats:** Does not repeat, Daily, Weekly or Monthly, **Every** N days/weeks/months.
- **Weekly:** pick the weekdays (the week starts on Sunday; the weekday of your start date is already
  selected). **Weekdays (Mon to Fri)** selects all five in one click.
- **Monthly:** either "On the 22nd" (a 29th, 30th or 31st happens on the last day of shorter months, and
  the form says so) or "On the third Wednesday" (a fifth weekday is "the last").
- **Ends:** every repeat must end - on a date, or after a number of occurrences. By default the end is the
  next June 30. A series is limited to 400 events and 24 months; the form tells you if you go over.
- **Skip school closures:** leaves out any date covered by a Closure event. If a closure is added later,
  the events on it are removed; if it is removed, they come back. An occurrence you edited by hand is never
  removed automatically.
- The preview lists the exact first and last dates and how many events will be created before you save.

Each occurrence is an ordinary event, and the day view says "Repeats weekly on Mon, Wed until Dec 18".
When you **Edit** an occurrence, choose what to change: **This event** (only that occurrence, which then
counts as edited by hand), **This and following events** (it and every later one; earlier ones stay) or
**All events** (every occurrence you have not edited by hand). For the last two the dates stay as they are
and you can change the repeat itself. **Delete...** on the day view offers the same three choices; a
deleted occurrence is not recreated by a later change, and hand-edited occurrences are kept by "following"
and "all" (the page says how many). Organization Editors can repeat events on their own organization's,
class's or department's calendar; only an admin can make a school-wide repeating event. (The SwiftUI app
does not create repeating events yet.)

**Make an existing event repeat.** Open any ordinary event with **Edit** (not one that came from an
external calendar feed, and not one that already repeats) and use the **Repeat** section: choose Weekly,
Daily or Monthly, set the end, and press **Save and repeat**. Your other edits on that form are saved
first, and the event you opened becomes the first occurrence (it is not copied), so its day must be one
of the repeat days. If "Skip school closures" is on and the event itself falls on a closure, it is not
converted (turn the option off or pick another event).

**In the SwiftUI app** (iPhone, iPad, Mac): while editing an ordinary one-off event, the **Repeat**
section works the same way as on the web (your other edits are saved first and the event becomes the first
occurrence). A **Repeating events** screen (the Calendar tab's toolbar for admins; an Organization, Class or
Department page's Calendar section for admins and its Editors) lists the series with **Change repeat...**
(the whole series, or from a chosen occurrence on), **End now** and **Delete series**; to change a series'
title, time or location for all events, edit one of its events and choose **All Events**.

**Manage repeating events.** **Admin Functions > Manage School Calendar > Repeating Events** lists the
school-wide repeating events; on an Organization, Class or Department page, **Repeating events** (beside
Add Event) lists that calendar's. Each entry shows what it repeats, its first and last dates, how many
events it has, how many you edited by hand and any that need attention (on a school closure, or no longer
matching the repeat). From there: **Edit all** (opens the edit form on "All events"), **End now** (removes
every later event but keeps today's and earlier ones, and keeps later events you edited by hand; offered
only while the series is running with events still to come), and **Delete series** (removes every event,
including hand-edited ones, after a confirmation). **Events and split...** lists every occurrence, with
**Edit this** and **This and following...** (opens the edit form on that occurrence with "This and following
events" chosen, so the rest of the series can change from that date).

**SwiftUI app:** Admins see a **+** button on the Calendar tab (Day/Week/Month) to add a new event
— it's created for the general school calendar (viewing an Organization's own calendar instead
creates the event there — see "Organizations (Teams, Clubs & Groups)"). Opening any event's detail screen shows a pencil icon; tapping
it turns every field editable in place, with **Delete Event** available from within Edit mode
(behind a confirmation). Parents don't see either affordance.

## Calendar subscription links (parents subscribing to your calendar)
Any school member — not just admins — can go to **Subscribe** on the `/calendar` page to generate a
personal `.ics` link for their own calendar app (Apple Calendar, Google Calendar, Outlook). Leaving
every checkbox unchecked creates a link to the full calendar; checking specific categories/tags (and,
if Organizations is enabled, picking a specific Organization) creates a filtered link. These links
auto-update as events change — they're a live subscription, not a one-time export. Anyone with the
link can see what it covers, so treat it like a password; **Revoke** removes it immediately.

## Ingesting an external calendar feed
On **External Calendar Feeds** (`/calendar/feeds`), click **+ Add Feed** to register another
system's own `.ics` feed URL (e.g. a drama department's own rehearsal-scheduling tool) so its events
show up on your school calendar automatically — no manual re-entry. Registered feeds are checked
once a night. Timed events are shown in your school's time zone (School Settings), whatever time
zone the feed itself writes them in; a feed time with no zone at all is taken as written. Each feed shows its enabled/paused state and the outcome of its last check (event
count, or an error message if it failed). **Pause**/**Resume** and **Edit** are available per feed;
**Delete** removes the registration (already-imported events are kept). Important: an ingested
event that came from a feed reverts to the feed's own data on the next nightly check — if you need
to permanently change something, **Pause** that feed first. When an event is moved, cancelled or removed in the feed itself, the nightly check updates or removes it on your calendar too (only today's and later events are ever removed, never past ones). As a safeguard, if a night's check finds no events at all, or fewer than half of the upcoming events already on your calendar, nothing is removed that night — a broken feed can't empty your calendar. A feed must be a publicly reachable web address: addresses that only work inside a private network (such as `localhost` or a `192.168.…` address) are refused when you save, and a feed larger than about 5 MB is treated as an error.

## Clearing the calendar in bulk (Senior Admins only)
If an import came out wrong, or you've been experimenting and want a clean slate, **Clear Calendar
Events** (`/calendar/clear`) deletes events in bulk instead of one at a time. Junior Admins don't
have this — they can still delete individual events from the calendar itself.

Pick the categories you want cleared. **Nothing is selected when you arrive**, on purpose: you have
to actively choose what to remove, and anything you leave unchecked is kept. Then click **Review
what will be deleted** to see exactly how many events are involved before anything happens, and
confirm a second time in the dialog that follows. The category checkboxes are locked while the review
is being checked, so the count always matches what will be deleted. Deleted events cannot be recovered.

Two kinds of event are never removed by a bulk clear, and the review step tells you how many of each
it found:

- **Events from an external calendar feed.** These are owned by the feed and would simply reappear
  at the next nightly check. To remove them for good, **Delete** that feed under External Calendar
  Feeds first (its already-imported events then become ordinary events), then clear. Pausing the
  feed is not enough: a paused feed's events are still kept.
- **Events belonging to an Organization.** These are managed from that organization's own page by
  its own editors, so a school-wide clear leaves them alone.
