WebCalendar

Running WordPress? There’s now a WordPress-native version — WebCalendar for WordPress — that installs as a plugin instead of a separate PHP application, with full recurring-event support, iCal import/export, and a built-in holiday library. It’s free on WordPress.org, and there’s an overview here on k5n.us. The standalone PHP application on this page is still maintained and is not going away.

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.

  • Merge pull request #732 from craigk5n/fix/wizard-password-typing-race…
    by craigk5n on September 7, 2026 at 7:18 am

    Merge pull request #732 from craigk5n/fix/wizard-password-typing-race-728 test: verify admin form input actually landed (#728)

  • test: verify admin form input actually landed (#728)
    by craigk5n on September 7, 2026 at 7:12 am

    test: verify admin form input actually landed (#728) The diagnostic added in #731 caught the flake on its first run and named the cause: FAILED on page: http://web/wizard/index.php?step=adminuser stepTitle: ‘Admin User’ .invalid-feedback: ‘Passwords do not match’ The wizard was behaving correctly. It refused to advance because the two password fields did not match, even though the test types the same string into both: driver.find_element(By.ID, “admin_password”).send_keys(“admin123”) driver.find_element(By.ID, “admin_password2”).send_keys(“admin123”) send_keys can drop characters while the page is still settling, so the fields ended up holding different text. Every previous symptom followed from that: the wizard stayed on Admin User, and the later wait for the Finish step timed out 45 seconds afterwards with a message that pointed at the wrong place entirely. Adds type_value(), which clears the field, types, reads the value back, and retries up to three times before failing with a message naming the field and what it actually contains. Applied to every admin field in all three variants. This keeps the test exercising real typing rather than setting values through execute_script, which would remove the race but stop covering the input path. Distribution fits: MySQL is the slowest backend in CI and failed 8 times in 40 runs, against 1 for PostgreSQL and 0 for SQLite. Supersedes the theory behind #729, which adjusted the Summary step timing — the wrong stage. That change is left in place as it is still an improvement over a fixed iteration count. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015vqscQtk31Kkt8FWmpcvbx

  • Merge pull request #731 from craigk5n/test/wizard-dump-page-source-728
    by craigk5n on September 7, 2026 at 7:02 am

    Merge pull request #731 from craigk5n/test/wizard-dump-page-source-728 test: dump browser state when a wizard Selenium test fails (#728)

  • test: dump browser state when a wizard Selenium test fails (#728)
    by craigk5n on September 7, 2026 at 4:01 am

    test: dump browser state when a wizard Selenium test fails (#728) The wizard Selenium jobs fail intermittently — measured over the last 40 runs: MySQL 32/40, PostgreSQL 39/40, SQLite 40/40 — and the failures have so far only been reproducible in CI. The container access log is not enough to explain them, and because the workflow dumps container logs only on failure there is no passing run to diff against. The handlers already printed the failing URL, and one of the three per file also printed the page and step titles. This replaces all nine with a shared dump_failure_context() that additionally reports: – any visible error text (#errorMessage, .alert, .invalid-feedback, .text-danger), which is the most likely place a rejected admin-user submission would surface – browser console messages, where available – the first 4000 characters of page_source Output is bounded so a failure stays readable in the Actions log, and the existing “FAILED on page:” line is kept verbatim so anything grepping for it still works. This does not fix the flake. It makes the next CI failure explain itself, which at the current rate should happen within a day of normal PR traffic — cheaper than reproducing a 20% race locally. Applied to all three variants: PostgreSQL fails too, and SQLite would benefit equally if it ever starts. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015vqscQtk31Kkt8FWmpcvbx

  • Merge pull request #730 from craigk5n/style/view-entry-indentation
    by craigk5n on September 7, 2026 at 3:03 am

    Merge pull request #730 from craigk5n/style/view-entry-indentation style: restore indentation in view_entry.php

Download Metrics

  • Downloads via Github: 21016
  • Downloads via SourceForge: 1417491

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.