Title: WebCalendar
Author: agenticdaisy
Published: <strong>May 12, 2026</strong>
Last modified: October 1, 2026

---

Search plugins

![](https://ps.w.org/agenticdaisy-calendar/assets/banner-772x250.png?rev=3530190)

![](https://ps.w.org/agenticdaisy-calendar/assets/icon-256x256.png?rev=3530190)

# WebCalendar

 By [agenticdaisy](https://profiles.wordpress.org/agenticdaisy/)

[Download](https://downloads.wordpress.org/plugin/agenticdaisy-calendar.1.4.1.zip)

 * [Details](https://mfe.wordpress.org/plugins/agenticdaisy-calendar/#description)
 * [Reviews](https://mfe.wordpress.org/plugins/agenticdaisy-calendar/#reviews)
 *  [Installation](https://mfe.wordpress.org/plugins/agenticdaisy-calendar/#installation)
 * [Development](https://mfe.wordpress.org/plugins/agenticdaisy-calendar/#developers)

 [Support](https://wordpress.org/support/plugin/agenticdaisy-calendar/)

## Description

WebCalendar gives your WordPress site a clean, responsive calendar with the features
you actually need — recurring events, iCal import, holiday imports, email reminders,
and fine-grained permissions — without the complexity.

**Calendar Views & Display**

 * Month, week, and day views with smooth AJAX navigation — no page reloads
 * Responsive design that adapts to any theme and screen size
 * Color-coded categories for visual organization
 * Gutenberg blocks (Calendar + Upcoming Events) and `[webcalendar]` shortcode

**Event Management**

 * Recurring events — daily, weekly, monthly, and yearly patterns with RRULE support
 * Edit a single instance or the entire series
 * File attachments via the WordPress Media Library
 * Public, Private, and Confidential visibility levels
 * Filter the calendar by tag, and jump straight to what visitors are looking for
 * Venues and organizers — reusable places and contacts, managed in one screen, 
   shown on every event page
 * Custom event fields — text, dates, drop-downs and more, defined once and filled
   in on every event
 * Online and hybrid events with a “Join online” link, separate from the physical
   location
 * Conflict detection warns you about overlapping events _(Starter+)_
 * Filter the calendar by venue and organizer _(Starter+)_

**Import, Export & Sync**

 * Import `.ics` files from Google Calendar, Outlook, Apple Calendar, or any iCal
   source
 * One-click migration from The Events Calendar — venues, organizers, categories,
   images and recurring events, with undo
 * Side-by-side trial: run WebCalendar next to The Events Calendar with scheduled
   one-way sync, then switch — or remove everything in one click
 * Export your calendar in iCalendar format
 * Import public holidays for any country
 * Subscribe to remote iCal feeds with automatic hourly sync _(Starter+)_

**Collaboration & Permissions**

 * Invite WordPress users to events with email notifications
 * Event reminders via WP-Cron
 * 36 granular capabilities mapped to WordPress roles — control who can view, create,
   edit, and manage events
 * Multi-user calendar filtering and shared calendar views
 * Frontend event submissions with admin approval queue _(Starter+)_
 * Let visitors RSVP to events, with capacity limits and attendee check-in _(Starter
   +)_
 * Category merging for cleaning up duplicate categories _(Business+)_

**SEO & Sharing**

 * Single event pages with SEO-friendly permalinks
 * Schema.org Event JSON-LD, Open Graph, and Twitter Card meta tags
 * Social share buttons and “Add to Google/Outlook/Yahoo” one-click buttons

**AI Integration**

 * Built-in MCP server lets AI assistants (Claude, ChatGPT, etc.) manage your calendar—
   free on every edition
 * AI admin page with connection wizard, tools reference, and one-click testing
 * WordPress Abilities API integration for WP 6.9+

**For Developers**

 * Full REST API for events, categories, holidays, layers, and shared calendars
 * Built on Clean Architecture with `webcalendar-core` business logic library
 * PSR-4 autoloading, PHPStan Level 9, 2000+ automated tests
 * All calendar data in dedicated `webcal_*` tables — no Custom Post Types

**Technical Note: Database Architecture**

This plugin integrates `webcalendar-core`, a framework-agnostic Composer library
that provides all calendar business logic (events, recurrence, iCal, permissions)
through 17 repository classes. These repositories require PDO and use exclusively
parameterized prepared statements — no raw SQL concatenation. WordPress-specific
data (users, options, capabilities) is accessed via `$wpdb` through the plugin’s
Bridge layer (`WpUserRepository`, `WpConfigRepository`, etc.). See `src/Bridge/PdoFactory.
php` for the connection factory.

### External Services

This plugin connects to the following third-party services:

#### Nager.Date API

Used for importing public holidays via WebCalendar > Holidays.
 * Endpoint: https://
date.nager.at/api/v3/ * [Privacy Policy](https://date.nager.at/Privacy)

#### Google Calendar Public Feeds

Alternative holiday source. Fetches public .ics files from Google.
 * Endpoint: 
https://calendar.google.com/calendar/ical/ * [Google Privacy Policy](https://policies.google.com/privacy)*
[Google Terms of Service](https://policies.google.com/terms)

#### Thunderbird Holiday Calendars

Alternative holiday source via community-maintained .ics files.
 * Endpoint: https://
www.thunderbird.net/media/caldata/ * [Mozilla Privacy Policy](https://www.mozilla.org/privacy/)

#### Freemius License Server

Used for license validation, automatic updates, and optional usage analytics.
 *
Endpoint: https://api.freemius.com/ * [Privacy Policy](https://freemius.com/privacy/)*
[Terms of Service](https://freemius.com/terms/) * Data transmitted: license key,
site URL, plugin version, WordPress version

#### OpenStreetMap / Nominatim

When a single event page has a location and the map provider is set to OpenStreetMap
(
the default), the plugin geocodes the address via the Nominatim API and displays
a map using OpenStreetMap tile servers. The event location string is sent as a search
query. No user personal data is transmitted. * Geocoding endpoint: https://nominatim.
openstreetmap.org/search * Tile server: https://tile.openstreetmap.org/ * [OpenStreetMap Terms of Use](https://wiki.osmfoundation.org/wiki/Terms_of_Use)*
[Nominatim Usage Policy](https://operations.osmfoundation.org/policies/nominatim/)*
[OpenStreetMap Privacy Policy](https://wiki.osmfoundation.org/wiki/Privacy_Policy)

#### Google Maps Embed API

When the map provider is set to Google Maps in settings, single event pages display

an embedded Google Map for the event location. The event location string and your
Google Maps API key are sent to Google. No other user data is transmitted. * Endpoint:
https://www.google.com/maps/embed/v1/place * [Google Maps Platform Terms of Service](https://cloud.google.com/maps-platform/terms)*
[Google Privacy Policy](https://policies.google.com/privacy)

#### Add to Calendar Links

Single event pages include “Add to Calendar” buttons that generate links to Google

Calendar, Outlook.com, and Yahoo Calendar. When a visitor clicks a button, the event
title, date, time, location, and description are passed as URL parameters to the
chosen service. No data is sent until the visitor clicks. * Google Calendar: https://
www.google.com/calendar/render * Outlook.com: https://outlook.live.com/calendar/
0/action/compose * Yahoo Calendar: https://calendar.yahoo.com/

#### Social Sharing Links

Single event pages include social sharing buttons for Facebook, X (Twitter), and

LinkedIn. When a visitor clicks a button, the event page URL and title are passed
as URL parameters to the chosen service. No data is sent until the visitor clicks.*
Facebook: https://www.facebook.com/sharer/sharer.php * X (Twitter): https://x.com/
intent/tweet * LinkedIn: https://www.linkedin.com/sharing/share-offsite/

### Development & Source Code

Full unminified source for this plugin is included in this distribution under GPL-
2.0-or-later — you do not need to download anything external to rebuild the compiled
assets.

**What ships in this zip:**

 * `src/` — unminified React/JSX source for all admin components, frontend calendar,
   and the mini-calendar widget
 * `build/` — the pre-compiled minified bundles (what the plugin actually loads 
   at runtime)
 * `package.json` + `package-lock.json` — Node build manifest and lockfile for reproducible`
   npm install`
 * `composer.json` — PHP dependency manifest

**Rebuilding the compiled assets from source:**

Prerequisites: PHP 8.1 or higher with Composer 2, Node.js 20 or higher with npm 
10.

 1. `composer install` — install PHP dependencies
 2. `npm install` — install JavaScript build dependencies (@wordpress/scripts, React,
    Toast UI Calendar, Leaflet, Tiptap)
 3. `npm run build` — compile `src/index.js` and `src/frontend.js` into the minified
    bundles under `build/`

The compiled output in `build/` is byte-reproducible from the matching `src/` at
the same version using this toolchain.

## Screenshots

[⌊Frontend month view — responsive calendar embedded on any page with color-coded
events⌉⌊Frontend month view — responsive calendar embedded on any page with color-
coded events⌉[

Frontend month view — responsive calendar embedded on any page with color-coded 
events

[⌊Frontend week view — detailed weekly schedule with timed events and all-day items⌉⌊
Frontend week view — detailed weekly schedule with timed events and all-day items⌉[

Frontend week view — detailed weekly schedule with timed events and all-day items

[⌊Single event page — SEO-friendly permalink with map, social sharing, and add-to-
calendar buttons⌉⌊Single event page — SEO-friendly permalink with map, social sharing,
and add-to-calendar buttons⌉[

Single event page — SEO-friendly permalink with map, social sharing, and add-to-
calendar buttons

[⌊Mobile responsive — calendar adapts to any screen size with touch-friendly navigation⌉⌊
Mobile responsive — calendar adapts to any screen size with touch-friendly navigation⌉[

Mobile responsive — calendar adapts to any screen size with touch-friendly navigation

[⌊Admin calendar — full month view with color-coded categories and quick event management⌉⌊
Admin calendar — full month view with color-coded categories and quick event management⌉[

Admin calendar — full month view with color-coded categories and quick event management

[⌊Event editor — recurring events, categories, visibility, participants, and file
attachments⌉⌊Event editor — recurring events, categories, visibility, participants,
and file attachments⌉[

Event editor — recurring events, categories, visibility, participants, and file 
attachments

[⌊Category management — create color-coded categories with event counts and per-
category filtering⌉⌊Category management — create color-coded categories with event
counts and per-category filtering⌉[

Category management — create color-coded categories with event counts and per-category
filtering

[⌊Import events — from Google Calendar, Outlook, or any iCal / CSV file⌉⌊Import 
events — from Google Calendar, Outlook, or any iCal / CSV file⌉[

Import events — from Google Calendar, Outlook, or any iCal / CSV file

[⌊AI integration — built-in MCP server lets AI assistants like Claude manage your
calendar (free on every edition)⌉⌊AI integration — built-in MCP server lets AI assistants
like Claude manage your calendar (free on every edition)⌉[

AI integration — built-in MCP server lets AI assistants like Claude manage your 
calendar (free on every edition)

[⌊Settings page — status dashboard with event counts, sync status, and configuration
options⌉⌊Settings page — status dashboard with event counts, sync status, and configuration
options⌉[

Settings page — status dashboard with event counts, sync status, and configuration
options

## Blocks

This plugin provides 2 blocks.

 *   WebCalendar Interactive calendar view for WebCalendar events.
 *   Upcoming Events Display a list of upcoming events from WebCalendar.

## Installation

 1. Upload the `agenticdaisy-calendar` folder to `/wp-content/plugins/`
 2. Activate the plugin through the “Plugins” menu in WordPress
 3. Navigate to **WebCalendar** in the admin sidebar to view the calendar
 4. Go to **WebCalendar > Settings** to configure time format, date format, and other
    options
 5. Use the `[webcalendar]` shortcode or the **WebCalendar** Gutenberg block to display
    the calendar on any page

**Requirements:**

 * PHP 8.1 or higher
 * WordPress 6.6 or higher
 * MySQL 5.7+ or MariaDB 10.3+

## FAQ

### How do I display the calendar on a page?

Use the `[webcalendar]` shortcode or add the **WebCalendar Calendar** block in the
block editor. Both support AJAX navigation between months without page reloads.

### Can I import events from Google Calendar?

Yes. Export your Google Calendar as an `.ics` file and use **WebCalendar > Import**
to import it. Upgrade to a Starter license or higher to use **WebCalendar > Remote
Calendars** for automatic recurring sync of a public Google Calendar iCal URL.

### How do I migrate from another calendar plugin?

Coming from **The Events Calendar**? Use **WebCalendar > Import > The Events Calendar**—
the tab appears automatically when TEC data is found (even if the plugin is already
deactivated). It imports published events with their venues, organizers, categories,
featured images and recurring rules, never modifies The Events Calendar’s own data,
skips duplicates on re-runs, and can be undone afterwards.

### Can I try WebCalendar next to The Events Calendar before switching?

Yes — that’s the recommended way. Import your events, then turn on **Keep in sync
with The Events Calendar** on the same Import tab. WebCalendar mirrors The Events
Calendar on a schedule (edits copy over, new events appear, deleted events disappear)
while you keep managing events in The Events Calendar as usual. The sync is strictly
one-way and The Events Calendar’s data is never touched. Decided? Turn off sync 
and deactivate The Events Calendar — or click **Remove all TEC events** to erase
the trial completely.

For any other plugin or service, export your existing calendar as an `.ics` file(
most support this), then import it via **WebCalendar > Import**. This works with
anything that exports standard iCalendar files.

### Does the plugin support recurring events?

Yes. When creating or editing an event, use the recurrence builder to set daily,
weekly, monthly, or yearly patterns. You can edit individual instances or the entire
series.

### What happens to my data if I uninstall the plugin?

By default, all calendar data is preserved when you uninstall. To delete all data
on uninstall, enable the “Delete Data on Uninstall” option in **WebCalendar > Settings**.

### Can different users have different permissions?

Yes. The plugin registers 36 capabilities mapped to WordPress roles. Administrators
can manage all settings and events, Editors can manage events and categories, and
Authors can create and manage their own events.

### Does it work with page builders like Elementor or Divi?

Yes. Use the `[webcalendar]` shortcode inside any page builder. The calendar renders
responsively inside any container.

### Does the calendar work with my theme?

The calendar uses standard WordPress styles and adapts to your theme’s container
width. It is designed to be responsive and works on desktop, tablet, and mobile.

### Is my Google Maps API key safe to use?

The key appears in your site’s public HTML — that is how the Google Maps Embed API
works, and Google designs these keys to be publicly visible. What protects it is
restrictions, not secrecy: in the [Google Cloud Console](https://console.cloud.google.com/apis/credentials),
add a **website restriction** (HTTP referrers) so the key only works on your domain,
and an **API restriction** limiting it to the Maps Embed API. With both set, the
key is useless to anyone who copies it. Without them, other sites can use your key
and their traffic bills against your Google account. The default OpenStreetMap provider
needs no key at all.

### Do the AI features need a specific WordPress version?

The built-in MCP server works on every WordPress version this plugin supports (6.6
and newer). Connect your assistant from the AI admin page and all eleven calendar
tools are available — events, categories, users, venues, organizers, site info and
a schema call that tells an assistant this site’s timezone and conventions. Two 
more, for reading an event’s registration numbers and its attendee list, appear 
on the Starter plan and up.

One optional extra requires WordPress 6.9 or newer: the WordPress Abilities API 
integration. On 6.9+ the same tools are additionally registered as core “abilities”,
which makes them discoverable through WordPress’s own `wp-abilities/v1` REST endpoints,
available to WordPress 7.0’s built-in AI client, and usable by the MCP Adapter plugin
without any configuration. On 6.6 through 6.8 that registration is skipped automatically—
nothing errors, and the plugin’s own MCP endpoint is unaffected.

### What is your versioning and compatibility policy?

WebCalendar follows [Semantic Versioning](https://semver.org/). Patch releases (
1.0.x) contain bug fixes only. Minor releases (1.x.0) add features without breaking
existing functionality. Major releases may include breaking changes and will be 
documented in the changelog. The REST API is versioned (`/v1/`) and will not introduce
breaking changes within a major version. Security vulnerabilities should be reported
to security@agenticdaisy.com — see [Security Policy](https://agenticdaisy.com/security/)
for our disclosure policy.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“WebCalendar” is open source software. The following people have contributed to 
this plugin.

Contributors

 *   [ agenticdaisy ](https://profiles.wordpress.org/agenticdaisy/)

[Translate “WebCalendar” into your language.](https://translate.wordpress.org/projects/wp-plugins/agenticdaisy-calendar)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/agenticdaisy-calendar/),
check out the [SVN repository](https://plugins.svn.wordpress.org/agenticdaisy-calendar/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/agenticdaisy-calendar/)
by [RSS](https://plugins.trac.wordpress.org/log/agenticdaisy-calendar/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.4.1

 * Fix: **Category colours were missing from the admin calendar, and the Quick View
   popup said “Default” for every event.** An event assigned to a category showed
   in the default blue rather than its category’s colour, and clicking it named 
   the category “Default”. The admin calendar had stopped loading your category 
   list — a call dropped in a February 2026 change — so nothing could match an event
   to its category. The Edit Event screen fetches categories separately and was 
   always correct, which is why the problem looked confined to the popup. Both are
   fixed: events show their category colour again, and Quick View names the right
   category. Thanks to @hanswilli for the report and for narrowing it down so precisely.
 * Fix: **The Quick View popup and the event page ignored your Date Format and Time
   Format settings.** The popup always showed dates like “2026.09.26 03:00 pm”, 
   and the event page always used English 12-hour times, whatever you had chosen.
   Both now follow your settings, in the public and admin calendars, and month names
   follow your site language. Leaving Date Format blank now uses your WordPress 
   date format (Settings  General). Thanks to @hanswilli.
 * Fix: **“+ Add Event” on the public calendar now opens the event form straight
   away.** It used to drop you on the admin calendar, where you had to press “+ 
   Add Event” again and then find your way back. The form now opens on the day you
   were looking at, and saving or cancelling returns you to the calendar page you
   started from. Thanks to @hanswilli.
 * Fix: **The free edition no longer writes “Failed to open stream” warnings to 
   your error log on every page load.** It was looking for paid-only files that 
   are not part of the wordpress.org download. Nothing was broken and visitors never
   saw it. Thanks to @hanswilli.

#### 1.4.0

 * New: **Manage your calendar from the command line.** `wp webcal event list|get
   |create|update|delete` works on one event at a time, alongside the bulk import
   and export commands that were already there. Useful for scripts, scheduled jobs
   and anything automating a site.
 * New: **`wp webcal doctor` checks an installation and tells you what is wrong 
   with it** — missing database tables, scheduled jobs that are not running, whether
   the site can still reach WordPress.org for updates, mail sitting unsent, and 
   settings that contradict each other. Each line says what it found rather than
   just pass or fail.
 * New: **AI assistants can now work with venues, organizers and event registration.**
   Previously they could only see events, categories and users. An assistant can
   now list your venues and organizers, attach one to an event, and — on the Starter
   plan and up — check how full an event is and who has registered.
 * New: **AI assistants can ask the site how it is set up** before creating anything:
   your timezone, which fields an event has, and what the settings mean. Less guessing,
   fewer wrong answers.
 * New: **Creating an event can now be made safe to retry.** If an assistant or 
   script loses its connection and tries again, it no longer leaves a duplicate 
   behind.
 * Security: **The AI “calendar info” tool revealed how many private events other
   people had.** It reported a count of every event on the site, so anyone who could
   view the calendar — which includes Subscribers — could learn how many Private
   and Confidential events other people were keeping. Only the number was exposed,
   never any event’s contents. The count now follows the same rules as everything
   else: your own events, plus other people’s only where you are allowed to see 
   them.
 * Fix: Shared and remote calendars chosen as participants were silently dropped
   when an event was saved. They are now kept.
 * Fix: `wp help webcal <command>` showed nothing for any command. All of them now
   document themselves.
 * Fix: AI tool descriptions now say what the tools actually do — most importantly
   that deleting or updating a repeating event affects the whole series, not one
   occurrence.

#### 1.3.0

 * New: **Let visitors register for your events.** Turn on Registration for any 
   event, set how many places there are and when sign-ups close, and add the form
   to a page with [webcalendar-rsvp event=”123″]. People enter a name and email,
   confirm from a link we email them, and get a link of their own to release their
   place if they cannot come. You see who is coming, export the list as a spreadsheet,
   and tick people off on arrival from a phone. Starter plan and up.
 * A place is only held once someone confirms from their email. Until then the event
   is not counted as any fuller, which is what stops an automated script filling
   every seat on a public form. It also means a busy event can fill up between someone
   signing up and confirming — they are told so plainly.
 * Registering an address that is already on the list tells that address, not whoever
   typed it in. Nobody can use the form to find out whether a particular person 
   is attending.
 * Tick people off as they arrive straight from the attendee list, as well as from
   the check-in page on your phone.
 * Fix: **On WordPress 6.6 the event editor was partly unusable.** The pop-up for
   adding or editing an event opened underneath the admin menu, so the left edge
   of it could not be clicked. WordPress ships the stylesheet for its own interface
   controls, and newer versions load it automatically — 6.6 does not, and the plugin
   was relying on that. It now asks for the stylesheet itself. Only affects sites
   on WordPress 6.6.
 * Bumped craigk5n/webcalendar-core to ^4.16.0. Required, not optional — it carries
   two fixes registration cannot work without.

#### 1.2.1

 * **Security: A calendar subscription link belonging to a deleted WordPress user
   returned everyone’s private events.** Subscription links carry a personal token
   instead of a login, because calendar apps cannot sign in. If the WordPress account
   behind a link had since been deleted, the feed stopped limiting itself to public
   events and served every user’s Private and Confidential events — full titles,
   descriptions and locations — to anyone holding that address. Fixed: a link whose
   account no longer exists now returns public events only. Present in 1.1.x and
   1.2.0. If you have ever deleted a WordPress user who had generated a calendar
   subscription link, update — and revoke the subscription links of people who have
   left, since updating does not invalidate a link already saved in someone’s calendar
   app.
 * **Security: A scheduling conflict no longer reveals what the other person’s appointment
   is.** Saving an event that clashed with someone else’s returned that event in
   full — title, description, location — whatever its privacy setting, so trying
   to book a colleague’s time disclosed the contents of their private appointments.
   The clash is still reported, with the same times, but an appointment you have
   no permission to see now shows only as “Busy”. Public events, your own, shared
   calendars you subscribe to, and administrators with full visibility are unchanged.
 * Fix: An event cancelled in The Events Calendar no longer stays on the mirrored
   calendar as though it were going ahead. Cancelling in The Events Calendar keeps
   the event published, so the sync had nothing to react to; it now carries the 
   cancelled status across.
 * Bumped craigk5n/webcalendar-core to ^4.15.0. Required, not optional — the plugin
   will not run on older versions. Nothing about what your calendar displays changes.

#### 1.2.0

 * **Security: Private and Confidential events could be read by people who should
   not see them.** Anyone visiting a public calendar page could download every private
   event — titles, descriptions and locations — through the iCal export link, and
   any Subscriber-level account could export the whole calendar as a spreadsheet.
   The AI assistant’s “get event” tool returned any event by number with no permission
   check, and WordPress site search listed private event titles and description 
   excerpts to logged-in visitors when single event pages were set to “all”. All
   are fixed, and the permission check now runs in one shared place that every path
   returning events goes through. Update if your calendar holds private events and
   is publicly visible or allows registration.
 * **Security: Event attachments are now validated before being saved.** An attachment
   could previously carry a hand-crafted web address that was stored as-is and turned
   into a link on the public event page, which allowed a “javascript:” address from
   anyone able to edit an event. Addresses are now restricted to ordinary http/https
   links and anything unrecognised is discarded.
 * New: Move your calendar over from **The Events Calendar** in one confirmed step—
   events, venues, organizers, categories, tags, featured images and recurring rules.
   The Events Calendar’s own data is never modified, re-runs never duplicate, and
   every import can be undone. WP-CLI: “wp webcal migrate tec”.
 * New: Not ready to switch? Run WebCalendar **side by side** with The Events Calendar
   on a schedule and compare with live data. Strictly one-way; end the trial by 
   switching over, or remove everything in one click. WP-CLI: “wp webcal sync tec”.
 * New: **Filter Bar** on the calendar — visitors can narrow events by tag, and 
   by venue or organizer (Starter+). Each control only appears when your site has
   something to pick. Hide it with [webcalendar show_filters=”false”].
 * New: **Tags on events** — any number of free-text, site-wide labels alongside
   the single colour-coded category. Suggestions as you type, and matching ignores
   case so “Outdoors” and “outdoors” stay one tag.
 * New: **Online and hybrid events** — add a meeting URL and platform name (“Zoom”,“
   Google Meet”). Separate from Location, so an event can be in person, online, 
   or both, and its page shows a “Join online” link.
 * Improved: **Duplicate** now copies the whole event immediately — repeat pattern,
   participants and their responses, category, reminder, location, venue, organizer,
   attachments, featured image and custom field values. Previously it only pre-filled
   the form and quietly lost everything not shown on screen.
 * New: **Custom event fields** — define your own fields under Calendar  Custom 
   Fields and fill them in on every event. Text, long text, link, email, number,
   date, yes/no, or a drop-down of your own choices. Two fields whose labels boil
   down to the same stored name are kept apart automatically. Migrated from WebCalendar
   1.9? “Find fields in existing data” reads your old field definitions back out
   of the data that came across.
 * New: **Venues and organizers** you can actually use — pick one on any event (
   or add one without leaving the form), and the event page shows the venue and 
   the organizer’s phone, email and website. Events imported from The Events Calendar
   have carried this information all along; now it is visible and editable.
 * New: The Events Calendar import now brings **Additional Fields** across. Each
   one becomes a custom field on your calendar, with the values attached to their
   events.
 * Fix: Choosing to delete all plugin data when uninstalling now removes every table
   the plugin created. Six were being left behind.
 * New: A **Venues & Organizers** screen under the Calendar menu — add, rename and
   edit them in one place, see how many events each one holds, and when you remove
   one, choose where its events should go.
 * Improved: Event pages describe their venue to search engines, including its address
   and map coordinates, and credit the event’s real organizer.
 * Fix: Choosing a filter while the calendar was still loading could leave the old
   list of events on screen, as though the filter had matched everything.
 * Fix: The map on the event page renders again — the script that drew it was never
   loaded. It also pins the venue’s exact coordinates instead of looking up the 
   location text.
 * Fix: The category legend on the calendar no longer breaks for visitors who are
   not logged in — the request that loads it was failing outright for them.
 * Fix: Deactivating the plugin now stops its scheduled background jobs (reminders,
   email queue, calendar sync). They previously kept running on a schedule after
   deactivation with nothing listening for them.
 * Fix: The calendar interface can now actually be translated. Every string in the
   admin screens, the frontend calendar and the block controls was listed in the
   translation catalogue but could never load in the browser, so translations had
   no effect and nothing reported a problem.
 * Fix: Editing an event no longer erases its venue, organizer, online meeting link
   or featured image. Renaming an event imported from The Events Calendar used to
   drop the venue it came with, and editing one occurrence of an all-day repeating
   event turned the whole series into a timed one.
 * Fix: Editing an event that was awaiting approval no longer publishes it. The “
   awaiting approval” flag was cleared by any edit, putting submissions on the public
   calendar with nobody approving them.
 * Fix: The month view’s day-of-week headings no longer misalign on sites whose 
   week starts on a day other than Sunday — the dates were always correct, but the
   labels above them were shifted. The admin calendar now follows your “Week Starts
   On” setting too.
 * Fix: Duplicating an online event keeps its meeting link.
 * Fix: Exporting and re-importing a calendar between WebCalendar sites keeps tags
   as tags instead of turning them into categories.
 * Fix: Importing an iCalendar file that introduces two new categories now creates
   both; the second used to overwrite the first.
 * Fix: The events REST API no longer omits recurring occurrences later in the day
   on the last requested date.
 * Bumped craigk5n/webcalendar-core to ^4.10.0.

#### 1.1.6

 * Security: AI/MCP tool calls now run through the WordPress Abilities API, so security
   and agent-governance plugins can see, audit, and block them. Previously such 
   plugins saw only an opaque API request and could not enforce policies like “deny
   deletes”. Tool calls also gain the ability’s own input and output validation.(
   WordPress 6.9+ — older versions keep the previous behavior.)
 * New: “wp webcal import –update-existing” — re-importing an iCal file from the
   command line can now update events that already exist (matched by UID) instead
   of skipping them, matching what the admin Import screen and remote calendar sync
   already do. Off by default; the summary reports imported, updated, and skipped
   counts separately.
 * Fix: “wp webcal import” now actually imports CSV files. It previously parsed 
   every file as iCal, so a CSV reported “Imported 0 events” without importing anything.
   CSV files from Google Calendar and Outlook are detected automatically; other 
   layouts can supply a column map. The admin Import screen was never affected.
 * Fix: “wp webcal export” no longer fails on calendars with roughly 65,000 or more
   events (“Prepared statement contains too many placeholders”).
 * Fix: Event titles and descriptions containing emoji could fail to save with an“
   Incorrect string value” database error on sites whose wp-config.php sets DB_CHARSET
   to utf8 (the WordPress sample-config default). The plugin’s database connection
   now upgrades to utf8mb4 exactly as WordPress core does.
 * Improved: A new FAQ explains how to restrict your Google Maps API key in Google
   Cloud Console so a copied key cannot bill against your account.
 * Bumped craigk5n/webcalendar-core to ^4.3.10 (large-export fix and duplicate-id
   hardening for the batch loaders).

#### 1.1.5

 * New: Import a large WebCalendar 1.9 export without changing PHP limits — place
   the .sql file in wp-content/uploads and use the new “Import a file already on
   the server” option on the migration screen. A “wp webcal migrate <file.sql>” 
   WP-CLI command does the same from the command line.
 * Improved: When a file is too large to upload, the import pages now show the current
   size limits and how to raise them (or how to work around them), instead of a 
   bare server error.
 * Fix: Migrating a WebCalendar 1.9 database no longer fails with a fatal error 
   on event reminders. A failed migration now shows a clear message, imports nothing,
   and removes any WordPress accounts it created for the run — instead of an error
   page with orphaned data.
 * Fix: The AI page’s “Try It” test showed 7 tools instead of 8. The count is now
   read from the actual tool list. Only the admin test panel was affected.

#### 1.1.4

 * New: AI/MCP integration is now **free for everyone**, including this edition —
   you can connect an AI assistant to your calendar out of the box.
 * New: AI assistants can list calendar users and shared/remote calendars (the webcalendar_list_users
   tool), so they can look up the logins used to filter events by user or add participants.
 * Changed: AI access is now limited to administrators by default. A new “AI Access”
   setting lets you open it up to all calendar users, who each connect an assistant
   scoped to their own permissions.
 * New: AI read-only mode. Turn it on under Settings  AI Read-Only Mode to let assistants
   view your calendar without creating, editing, or deleting events. Off by default.
 * New: The MCP endpoint now accepts an Application Password as a Bearer token (
   as well as Basic auth), so more AI clients can connect.
 * Changed: MCP tool names are now snake_case (e.g. webcalendar_list_events) so 
   they work with AI clients that reject the “/” character. The old names still 
   work when calling a tool, so existing connections keep working.
 * Changed: Some features that were available during the plugin’s initial launch
   period — conflict detection, external calendar subscriptions, multi-user views,
   front-end event submission, and category merge — have moved to the paid editions.
   Thanks to everyone who tried them out early!
 * Feat: Migrate from a standalone WebCalendar 1.9 installation. Upload an export(
   or database dump) under Import  WebCalendar 1.9, map legacy users to WordPress
   accounts (or create new ones), choose what to bring over, and import. Times are
   converted to your site time zone, re-importing is safe, and every migration can
   be undone.
 * Fix: Settings no longer shows features your plan does not include as switched
   on.
 * Fix: No longer triggers a fatal error every hour when the remote-calendar sync
   task runs.

#### 1.1.3

 * Feat: Remote calendar sync now updates events that changed on the remote calendar.
   Previously a subscription only added new events and removed deleted ones — if
   an event was edited upstream (moved to a different time, renamed), your copy 
   kept the old details indefinitely.
 * Feat: Importing an iCal file can now update events you have already imported.
   Tick “Update events that have already been imported” on the Import page to overwrite
   matched events with the contents of the file — useful when re-importing a corrected
   export. It is off by default, so importing the same file twice still safely changes
   nothing. The import summary now reports how many events were updated, and explains
   how to overwrite them when events are skipped.
 * Feat: WebCalendar now warns when your site time zone is set to a fixed UTC offset(
   for example “UTC-5”) instead of a city. A fixed offset cannot follow daylight
   saving time, so imported events land an hour off for part of the year. The warning
   appears on the Import, Remote Calendars and Settings pages, and as a Site Health
   check. Site Health  Info also reports the time zone your event times are interpreted
   in.
 * Fix: Activating the free edition no longer fails with a fatal “class not found”
   error. Features that ship only with the paid edition were being loaded unconditionally,
   even when their files were not present.
 * Fix: Week view now shows events that fall on the last day of the week for visitors
   in time zones ahead of UTC. The calendar was requesting an event range that ended
   a day early after converting the visible week to UTC, so the final day’s events
   could be omitted — most visible when a whole week appeared empty because its 
   only events were on that day.
 * Bumped craigk5n/webcalendar-core to ^4.3.7. Fixes category assignment during 
   import: category changes now sync on update, all of an event’s categories are
   kept (previously only the last survived), and a name containing an escaped comma
   is no longer split in two.
 * Updated the bundled iCalendar library (craigk5n/php-icalendar-core) to 1.2.0.
   Imports no longer silently substitute the current time for event dates the file
   provides in an unreadable format — such events are now reported and skipped instead.
 * Compatibility: tested up to WordPress 7.0.

#### 1.1.2

 * Feat: Import page now shows collapsible “Supported fields” reference tables for
   both iCal and CSV tabs, so users can see which properties are recognised without
   leaving the page.
 * Fix: Global holiday import (Nager.Date) now imports the current year plus the
   next two years in a single operation, instead of only importing the current year.
 * Fix: Thunderbird holiday provider URLs corrected — files are now fetched from
   the correct GitHub location with the correct filename prefixes.
 * Fix: Calendar now respects the WordPress “Week Starts On” setting (Settings  
   General) for month and week views.
 * Fix: Shortcodes in event descriptions are now expanded when displaying events
   on single-event pages and in the REST API response.

#### 1.1.1

 * Fix: PdoFactory now parses DB_HOST the same way wpdb does, so bare `localhost`
   resolves to a Unix socket DSN instead of a TCP connect attempt (fixes PDOException
   SQLSTATE[HY000] [2002] on socket-only MySQL hosts; resolves WordPress.org plugin
   reviewer report)
 * Fix: activation no longer fatal-aborts on transient PDO failures; data seeding
   wraps in try/catch and queues a `webcal_pending_seed` transient so seeding retries
   on the next admin request once the database is reachable
 * Fix: REST validator now accepts absent-equivalent values (null/0/’0’/”) for optional
   positive integers (e.g. category_id when no category is chosen) and the empty-
   string “global owner” sentinel for non-user-scoped categories
 * Build: `webcalendar-core` dependency pinned to `^4.3.2` (was floating `dev-main`);`
   minimum-stability: dev` + `prefer-stable: true` keep the local Composer path 
   repo resolving
 * CI: static-analysis lane fully green — Psalm 0 errors (was 30), PHPStan 0, PHPCS
   0; loads `src/functions.php` as a Psalm bootstrap so global helpers are visible
 * 1,272 automated tests (+9 new regression guards for the socket/soft-fail/REST-
   validator paths)

#### 1.1.0

 * Security: remote-calendar sync and webhook delivery now use wp_safe_remote_* 
   to block private-IP / cloud-metadata destinations (SSRF hardening)
 * Security: admin file uploads (CSV and iCal import) now route through wp_handle_upload()
   with an explicit MIME allowlist; temp uploads are cleaned up via wp_delete_file()
 * Security: added direct-file-access guards (defined(‘ABSPATH’) || exit) to all
   directory index stubs (100% coverage of src/**/*.php)
 * Security: REST export-route _wpnonce inputs are sanitized via sanitize_text_field(
   wp_unslash()) before wp_verify_nonce()
 * Security: REST write routes now declare explicit args schemas with per-field 
   sanitize_callback and validate_callback on all 23 POST/PUT/DELETE endpoints across
   8 controllers (EventsController, CategoriesController, HolidaysController, SubmissionsController,
   LayersController, SharedCalendarsController, RemoteCalendarsController, UsersController)
 * Security: CSV bulk-export REST route now requires authentication + webcal_can_view
   capability at the permission_callback (was anonymous with handler-body nonce 
   check)
 * Security: shortcode return values wrapped in wp_kses() with explicit tag allowlists
   as a defensive boundary
 * Security: SubmitEventShortcode login prompt — HTML anchor moved out of the translatable
   string so translators work with pure text
 * WP-CLI import/export commands now use WP_Filesystem instead of raw file I/O
 * Added “Development & Source Code” readme section with build instructions for 
   plugin reviewers
 * Unminified source now ships inside the distribution zip (rebuildable locally 
   via `composer install && npm install && npm run build`)
 * Removed dead `UpgradeNotice.js` component (zero imports; previously referenced
   an unused /pricing URL)
 * MiniCalendarWidget: expanded phpcs:ignore justifications on the four canonical
   register_sidebar() echo sites; new method docblock links to the Widgets API handbook
 * FeedController + McpEndpoint: substantive docblocks explain the intentional `
   permission_callback => '__return_true'` (iCal subscribers and AI agents cannot
   send WP nonces; access control lives in the handlers)
 * 1,247 automated tests (+113 new regression guards), PHPStan Level 9, 0 PHPCS 
   errors on changed code

#### 1.0.1

 * Built-in MCP server for AI assistant integration (Claude, etc.) — now Starter
   + only
 * AI admin page with configuration, tools reference, and connection testing — now
   Starter+ only
 * Single event pages now display participant list
 * Calendar frontend fetches all pages of events (fixes missing events on busy days)
 * Recurring event detail pages show correct occurrence date
 * Bundled Leaflet locally instead of loading from CDN
 * Hardened freemium gating: pro features (remote calendars, frontend submissions,
   conflict detection, category merge) are now physically stripped from the auto-
   generated free build
 * Email notifications and reminders moved to free tier
 * WordPress Plugin Check: 0 errors (all resolved)
 * WordPress coding standards compliance fixes
 * Added PDO usage documentation for plugin reviewers
 * 1,134 automated tests, PHPStan Level 9, 86%+ coverage

#### 1.0.0

 * Initial release
 * Full calendar admin UI with month/week/day views (Toast UI Calendar)
 * Event CRUD via REST API with recurring events (RRULE support)
 * Categories with color coding and layer-based calendar filtering
 * iCal import/export and remote calendar subscription with automatic sync
 * `[webcalendar]` shortcode and Gutenberg blocks (Calendar, Upcoming Events)
 * Single event pages with SEO-friendly permalinks and Schema.org JSON-LD
 * Open Graph and Twitter Card meta tags for social sharing
 * Social share buttons and “Add to Google/Outlook/Yahoo” one-click buttons
 * Global holiday management with standard US holiday import
 * Conflict detection with “Save Anyway” option for overlapping events
 * Email notification system with invitation templates and reminders
 * Role-based access control (36 capabilities)
 * Freemius SDK integration for freemium license gating
 * REST API rate limiting and event pagination with safety caps
 * 1,126 automated tests, PHPStan Level 9

## Meta

 *  Version **1.4.1**
 *  Last updated **1 week ago**
 *  Active installations **10+**
 *  WordPress version ** 6.6 or higher **
 *  Tested up to **7.1.3**
 *  PHP version ** 8.1 or higher **
 *  Language
 * [English (US)](https://wordpress.org/plugins/agenticdaisy-calendar/)
 * Tags
 * [calendar](https://mfe.wordpress.org/plugins/tags/calendar/)[event calendar](https://mfe.wordpress.org/plugins/tags/event-calendar/)
   [events](https://mfe.wordpress.org/plugins/tags/events/)[ical](https://mfe.wordpress.org/plugins/tags/ical/)
   [scheduling](https://mfe.wordpress.org/plugins/tags/scheduling/)
 *  [Advanced View](https://mfe.wordpress.org/plugins/agenticdaisy-calendar/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/agenticdaisy-calendar/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/agenticdaisy-calendar/reviews/)

## Contributors

 *   [ agenticdaisy ](https://profiles.wordpress.org/agenticdaisy/)

## Support

Issues resolved in last two months:

     5 out of 5

 [View support forum](https://wordpress.org/support/plugin/agenticdaisy-calendar/)