Skip to content

EP Calendar

EP Calendar is a phone-first calendar for a PageMotor site. It brings together what your EP Suite plugins already schedule (events from EP Events, appointments from EP Booking) with calendar entries of its own, publishes calendar feeds that Apple Calendar, Google Calendar and Outlook can subscribe to, and shows calendars you keep elsewhere alongside your own.

It gathers calendars; it is not a calendar server. Your site becomes the one place where everything you have scheduled can be seen, on any phone.

Published by ElmsPark Studio.

Each entry has a title, a start and end (or all day), a time zone, a location, notes, a link, who can see it (public or private), and an optional repeat: daily, weekly, monthly (on the same day of the month, or on a weekday such as “the last Friday”) or yearly, every so often, with an optional end date. You can change or delete just one date of a repeat. New entries are private unless you change the default in the settings.

Signed-in administrators and producers can add, change and delete entries straight from the calendar page on a phone, and see an “Overlaps with …” note on any timed item that clashes with another, from any source. Visitors only ever see public entries, and never the overlap notes.

When EP Events is active, its live events appear automatically. When EP Booking is active, its appointments appear too, but only for signed-in administrators and producers, never for visitors. Nothing is copied: each source is read when the calendar is shown, so the calendar always matches the plugin it came from.

Buttons above the calendar switch each source on and off: events, appointments, your own entries and each external feed.

With EP Booking 2.5.0 or later, link a staff member to a site user under EP Booking, Staff, Block with EP Calendar entries of. Every entry that user makes here then blocks that staff member’s booking slots straight away, private entries included, and a repeating entry blocks every repeat. Cancelled entries never block; all-day entries block only when EP Booking’s All-day calendar events setting is on.

External feeds can block slots too: set a feed’s Blocks booking slots for to a person, and its events block the slots of every staff member linked to that person. EP Booking only learns when someone is busy, never the title, place or notes of what they are busy with.

Agenda, Week and Month, with Previous, Today and Next. The agenda works without JavaScript. On a phone the week is a list of seven days; on a wide screen it becomes seven columns. The page address remembers the view, the date and which sources are showing, so a shared link opens exactly what you were looking at.

  • [ep-calendar] shows the calendar. Options: view (agenda, week or month, the first view shown), days (how many days the agenda covers), sources (which sources show first: ep-events, ep-booking, ep-calendar, external) and pwa="no" to leave the phone-app features off that page.
  • [ep-calendar-subscribe] adds Apple Calendar, Google Calendar, Outlook and Copy link buttons for your public calendar. Signed-in editors also see a link to their personal feed settings.
  • [ep-calendar-feed-link] adds a simple “Subscribe to this calendar” link and a link to the calendar file.

You do not need to place the shortcode yourself: Create calendar page in the settings makes the page for you.

The public feed carries your public entries, your live events and any public external feeds. It never carries appointments or private entries. Anyone can subscribe to it with the buttons from [ep-calendar-subscribe].

Personal feed links carry everything you are allowed to see, private entries and appointments included. Make them under Personal feed in the settings, one per device if you like. Each link is shown once, so copy it into your calendar app straight away. The settings list when each link was last used, and you can revoke any of them at any time; a revoked link stops working at once.

Repeating entries keep their local time across clock changes, so a 09:00 weekly entry stays at 09:00 in October and March. Calendar apps decide how often they check a subscribed feed. Google Calendar in particular can take several hours to show a change.

Paste the private iCal address of a Google, Apple or Outlook calendar under External feeds and its events appear in your calendar as read-only entries, in a colour you choose and labelled with the feed’s name. Each feed can be private (seen only by signed-in administrators and producers) or public (also shown on the public calendar), and switched off without deleting it.

Feeds refresh every 15 minutes through EP Cron, and also when someone opens the calendar. If a feed cannot be reached, its last good copy stays on the calendar, a quiet line says it may be out of date, and it is retried less often until it answers again.

Treat a private iCal address as a password: anyone holding it can read that calendar. EP Calendar never shows the full address again once saved, only its host and last few characters.

Add the calendar page to your phone’s home screen and it opens full screen with its own name, colour and icon. Once visited, it opens without a signal, and says plainly when a page has not been saved for offline use. A signed-in editor’s calendar, which can hold private entries, is never stored for offline use.

  • Status shows every source with its entries for the next 31 days, the time zone in use and where it comes from (with a warning when none is set, so times would show in UTC), any failing external feed, when the background refresh last ran, your personal links and your public feed address.
  • Calendar basics sets the time zone, the first view, the default visibility for new entries, the agenda length, the app name, short name and colour, and creates the calendar page if there is none.
  • Personal feed makes, lists and revokes your personal feed links.
  • External feeds adds, edits, refreshes and removes the calendars you mirror in.

Every calendar action is available through the PageMotor API (class EP_Calendar): reading entries for a date range, creating, updating and deleting entries, managing personal feed links, and managing external feeds. Reading public entries is open to anyone; everything else needs an administrator. The same actions are offered to AI agents through the EP MCP Bridge as tools named calendar_<action>.

  • It is not a CalDAV server.
  • It does not sign in to your Google account.
  • It never writes back to Apple, Google or Outlook calendars: external feeds are read-only.
  • Changing one date of a repeat turns it into a separate entry; there is no “this and all following” choice yet.
  • A few rare repeat rules in external feeds (by week number or by day of the year, or repeating more than once a day) show their first date only.
  • PageMotor 0.11 or later
  • EP Suite base class (bundled)
  • PHP cURL, for external feeds
  • EP Cron (optional): refreshes external feeds every 15 minutes; without it they refresh when the calendar is opened
  • EP Events and EP Booking (optional): their events and appointments appear when they are active
  1. ep-calendar.zip comes with an EP Suite licence, supplied directly by ElmsPark (see EP Suite plugins); after install it updates through your site’s Updates screen.
  2. Upload via Plugins → Manage Plugins. Activate.
  3. Open Plugin Settings → EP Calendar, set your time zone under Calendar basics, and press Create calendar page.
  4. Optionally add your other calendars under External feeds, and make a personal feed link for each phone under Personal feed.
  • Monthly and yearly repeats. An entry can now repeat monthly, either on the same day of the month (“day 14 of the month”) or on the same weekday of the month (“the second Tuesday”, “the last Friday”), and yearly on the same date. The editor works out the choices from the date you pick. Every so many months or years works too, and so does an end date.
  • Real-life dates are handled properly. A monthly repeat on the 31st skips the months that have no 31st, and a yearly repeat on 29 February appears in leap years only. Nothing is ever moved to a different day. A repeat at 9 o’clock stays at 9 o’clock when the clocks change in March and October.
  • Change or delete just one date. Edit or Delete on a repeating entry now asks “This one” or “All of them”. Deleting this one skips that date and leaves every other repeat in place. Editing this one turns that date into a separate entry with your changes; the series simply skips it.
  • External feeds show every monthly and yearly event. A monthly meeting or a birthday in your Google, Apple or Outlook calendar used to appear on its first date only. It now shows on every date it falls on, including “last weekday of the month” rules from Outlook and any dates the source has removed.
  • Feeds out carry the new repeats. The site feed and personal feed links now publish monthly and yearly repeats and the dates you skipped, so Apple Calendar, Google Calendar and Outlook show exactly the dates your calendar shows.
  • Booking slots follow suit. With EP Booking, a monthly or yearly entry blocks the staff member’s slot on every date it repeats, and a skipped date no longer blocks.
  • API and MCP. create-entry and update-entry accept monthly and yearly repeats, a monthly choice, or a repeat rule in the iCalendar format (checked strictly, with a clear reason when something cannot be used). update-entry can change a single date, and the new skip-occurrence action deletes one. The MCP tools follow automatically.
  • Your calendar can block your booking page. With EP Booking 2.5.0 or later, each EP Booking staff member can be linked to a site user (under EP Booking, Staff, “Block with EP Calendar entries of”). Every entry that user makes in this calendar then blocks that staff member’s booking slots straight away, private entries included, and a repeating entry blocks every repeat. Cancelled entries never block, and all-day entries block only when EP Booking’s All-day calendar events setting is on. EP Booking only ever learns when someone is busy: no title, place or note leaves the calendar.
  • External feeds can count as busy. Each external feed now has “Blocks booking slots for”. Choose a person and that feed’s events (your Google or Apple calendar, say) block the booking slots of every staff member linked to that person, exactly like that person’s own entries. Nobody is the default, so your existing feeds change nothing until you choose. You can change it in the feed’s row at any time.
  • Booking links on the Status card. A new line shows which EP Booking staff members are blocked by whose calendar, and how many external feeds block booking slots.
  • API and MCP. feed-create and feed-update take the new busy_user_id, and every feed listing shows it.
  • Appointments from EP Booking are never counted as busy here, because EP Booking already blocks its own bookings.
  • Time zone nudge. When neither Calendar basics nor your site’s Site Settings sets a time zone, the calendar has been quietly showing every time in UTC. The Status card in the settings now says so, with a link to Site Settings, and the Time zone figure at the top turns amber. Once a zone is set (even if you choose UTC on purpose) the warning goes away, and the card says where the zone comes from.
  • Overlap note for editors. Signed-in administrators and producers now see a small “Overlaps with …” note on any timed item that overlaps another, across every source: your own entries, events, appointments and external feeds. It names the item it overlaps. All-day items and cancelled items never count as overlaps. Visitors never see the note, because it could give away that a private item exists.
  • Search engine markup for your public entries. The calendar page now tells search engines about your own public entries as events (name, start and end, place and link where you have given them). Only public entries in the agenda’s date range are included, up to 50. Private entries are never included, and EP Events items are left out because EP Events already marks its own.
  • Tidier public data. The calendar’s public data no longer carries the editing details a visitor has no use for. Nothing changes on screen, and signed-in editors edit exactly as before.

First release: your own calendar entries (public or private, daily or weekly repeats), EP Events events and EP Booking appointments in one calendar, Agenda, Week and Month views built for a phone, editing from the calendar page, a public feed and personal feed links for Apple Calendar, Google Calendar and Outlook, external iCal feeds mirrored in read-only, the calendar as a home-screen app that opens offline, and API and MCP actions. Requires PageMotor 0.11 or later.