WebCalendar

On WordPress? WebCalendar is also available as a WordPress plugin — a scalable, RFC 5545-compliant calendar you can drop into any WordPress site.

About WebCalendar

WebCalendar is a PHP-based calendar application that can be configured as a single-user calendar, a multi-user calendar for groups of users, or as an event calendar viewable by visitors. MySQL/MariaDB, SQLite3, PostgreSQL, Oracle, DB2, Interbase, MS SQL Server, or ODBC is required. The version 1.9.X releases are still a little rough around the edges since these include an overhaul of the UI to use Bootstrap and jQuery and a complete rewrite of the web-based installer.

WebCalendar can be setup in a variety of ways, such as…

  • A schedule management system for a single person
  • A schedule management system for a group of people, allowing one or more assistants to manage the calendar of another user
  • An events schedule that anyone can view, allowing visitors to submit new events
  • A calendar server that can be viewed with iCalendar-compliant calendar applications like Mozilla Sunbird, Apple iCal or GNOME Evolution or RSS-enabled applications like Firefox, Thunderbird, RSSOwl, FeedDemon, or BlogExpress.

Overview of Features

  • Multi-user support
  • 30 supported languages: Basque, Bulgarian, Chinese-Big5, Chinese-GB2312, Czech, Danish, Dutch, English-US, Estonian, Finnish, French, Galician, German, Greek, Holo-Big5, Hungarian, Icelandic, Italian, Japanese, Korean, Norwegian, Polish, Portuguese_BR, Portuguese, Romanian, Russian, Spanish, Swedish, Turkish, Welsh (see current list of translations here)
  • Web-based installer
  • Auto-detect user’s language preference from browser settings
  • View calendars by day, week, month or year
  • View another user’s calendar
  • View one or more users’ calendar via layers on top of your own calendar
  • Add/Edit/Delete users
  • Add/Edit/Delete events
  • Repeating events including support for overriding or deleting (exceptions)
  • Configurable custom event fields
  • User-configurable preferences for colors, 12/24 time format, Sun/Mon week start
  • Checks for scheduling conflicts
  • Email reminders for upcoming events
  • Email notifications for new/updated/deleted events
  • Export events to iCalendar
  • Import from iCalendar/ics format
  • Optional general access (no login required) to allow calendar to be viewed by people without a login (useful for event calendars)
  • Users can make their calendar available publicly to anyone with an iCalendar-compliant calendar program (such as Apple’s iCal, Mozilla Calendar or Sunbird)
  • Publishing of free/busy schedules (part of the iCalendar standard)
  • RSS support that puts a user’s calendar into RSS
  • Subscribe to “remote” calendars (hosted elsewhere on the net) in either iCalendar or hCalendar formats (WebCalendar 1.1+)
  • User authentication: Web-based, HTTP, LDAP or NIS

System Requirements

  • PHP 8 or later
  • PHP support and access to one of the following databases:
    • SQLite
    • MySQL/MariaDB
    • Oracle
    • Postgres
    • IBM DB2
  • Access to cron for Linux/Unix systems (to send out reminders)

Development Cost

The following metrics from Ohloh show how much it would have cost to commercially develop WebCalendar.

  • Codebase Size: 138,588 lines
  • Estimated Effort: 34 person-years
  • Estimated Cost: $1,884,469
  • (As of 11 August 2024)

Donations

If you’d like to help support the costs of developing, maintaining and supporting WebCalendar, please consider donating.

Developer Resources

License

WebCalendar is available under the GNU General Public License, version 2.

For more information on this license:

Documentation

Most Recent Changes

Below are the most recent source code commits to github on the master branch.

  • updated Dutch.txt (#674)
    by wurtel2 on July 17, 2026 at 6:43 pm

    updated Dutch.txt (#674) Ran update_translation.pl and added missing translations

  • fix(mcp): exclude deleted/rejected events from read tools (#671)
    by craigk5n on July 15, 2026 at 6:59 pm

    fix(mcp): exclude deleted/rejected events from read tools (#671) list_events, search_events, get_availability, and check_conflicts joined webcal_entry_user but never filtered cal_status, so events soft-deleted through the web UI (cal_status=’D’, rows left in place) still appeared in MCP results. Add ‘AND eu.cal_status IN (”A”,”W”)’ to all four read queries, matching the core UI’s event queries (includes/functions.php). Add an integration test that soft-deletes an event the way the UI does and asserts every read tool then excludes it.

  • feat(mcp): add optional time to add_event (#670)
    by craigk5n on July 15, 2026 at 4:32 pm

    feat(mcp): add optional time to add_event (#670) add_event stored cal_time=-1 (untimed) unconditionally, so one-off timed events created via MCP lost their time. Add an optional `time` parameter (HHMMSS in the GMT frame, or -1 for untimed), mirroring add_recurring_event; renamed the local mod-time variable to avoid the clash. Schema + dispatch updated. – test_add_event_schema_has_optional_time – integration: add_event with a time stores cal_time; without it stays -1 Backward compatible (time defaults to -1).

  • fix(mcp): make CLI/STDIO transport work via shared dispatcher (#669)
    by craigk5n on July 15, 2026 at 3:27 pm

    fix(mcp): make CLI/STDIO transport work via shared dispatcher (#669) The CLI STDIO path called Server::builder()->addToolInstance(), a method that exists in no version of mcp/sdk (0.3.0-0.6.0), so `php mcp.php` fataled with “Call to undefined method” on every invocation — the documented STDIO entrypoint (Claude Desktop) never worked. It was also divergent: it tried to build tool metadata from #[McpTool] attributes, which would not match the curated definitions in mcp_list_tools(). Replace the broken SDK Builder block with a small newline-delimited JSON-RPC loop (mcp_run_stdio_loop) that dispatches through the same mcp_dispatch_request()/mcp_list_tools() path the HTTP transport uses, so STDIO and HTTP advertise and route tools identically from a single source of truth. Notifications (no id) receive no response; malformed input yields a JSON-RPC parse error. Remove the now-unused Server and StdioTransport imports. Also remove a trailing tool-call artifact (“</content>…”) accidentally committed after the closing ?> in mcp.php (introduced in d0abe343). It was latent because both transport branches exit() before EOF. Add McpStdioLoopTest: covers framing, notification suppression, parse errors, blank-line skipping, and tools/call routing via in-memory streams.

  • chore(deps): bump mcp/sdk from 0.3.0 to 0.6.0 (#659)
    by dependabot on July 15, 2026 at 2:53 pm

    chore(deps): bump mcp/sdk from 0.3.0 to 0.6.0 (#659) * chore(deps): bump mcp/sdk from 0.3.0 to 0.6.0 Bumps [mcp/sdk](https://github.com/modelcontextprotocol/php-sdk) from 0.3.0 to 0.6.0. – [Release notes](https://github.com/modelcontextprotocol/php-sdk/releases) – [Changelog](https://github.com/modelcontextprotocol/php-sdk/blob/main/CHANGELOG.md) – [Commits](https://github.com/modelcontextprotocol/php-sdk/compare/v0.3.0…v0.6.0) — updated-dependencies: – dependency-name: mcp/sdk dependency-version: 0.6.0 dependency-type: direct:production update-type: version-update:semver-minor … Signed-off-by: dependabot[bot] <support@github.com> * fix(deps): pin composer platform to PHP 8.2 so mcp/sdk 0.6.0 lock installs Dependabot resolved symfony/uid to v8.1.0 (requires PHP >=8.4.1), so the lock could not be installed on the PHP 8.2/8.3 CI matrix. Add config.platform.php=8.2.0 and require php ^8.2 (matching the floor the lock already required via symfony/uid v7.4.4 and symfony/console v7.4.6), then regenerate the lock. Only symfony/uid changes: v8.1.0 -> v7.4.9. mcp/sdk stays at 0.6.0. ——— Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Craig Knudsen <craig@k5n.us>

Download Metrics

  • Downloads via Github: 20478
  • Downloads via SourceForge: 1417198

Related Links

  • Standards
    • RFC 2445: Internet Calendaring and Scheduling Core Object Specification (iCalendar)
    • CalDAV: Calendaring and Scheduling Extensions to WebDAV (DRAFT) 
      [Note: WebCalendar does not yet support CalDAV.)
  • Calendar client applications – You can use the applications to view events stored in WebCalendar if you enable its publishing settings.
  • iCalendar/ics download sites – These sites contain calendars for holidays, sports teams schedules, music converts, etc. You can import these files into WebCalendar.