Table of Contents
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
- Github page for WebCalendar:
- Issues
- Pull requests
- Wiki
- Download the development code as a zip file
License
WebCalendar is available under the GNU General Public License, version 2.
For more information on this license:
Documentation
- System Administrator’s Guide
Introduction, installation instructions and FAQ - UPGRADING (WebCalendar 1.3.0)
Provides instruction on upgrading to version 1.3.7 from an older version - Database Design (WebCalendar 1.3.0)
Version 1.2.7 database schema
Most Recent Changes
Below are the most recent source code commits to github on the master branch.
- fix(tools): handle mixed latin1/UTF-8 data in charset converterby craigk5n on June 16, 2026 at 2:43 am
fix(tools): handle mixed latin1/UTF-8 data in charset converter The latin1->utf8 converter (issue #626) assumed all non-ASCII bytes were UTF-8 wrongly stored in a latin1 column, and used a column-wide binary->utf8mb4 reinterpret. Databases upgraded over many years often hold a MIX: genuine latin1 bytes (e.g. “a-umlaut”=0xE4, “sharp-s”=0xDF) alongside double-encoded UTF-8 (0xC3A4) in the same column. Genuine latin1 bytes are not valid UTF-8, so the reinterpret step threw “Incorrect string value: \xE4…” and aborted (issue #649). Decide per value instead of per column (“fix-then-reinterpret”): 1. MODIFY column to a binary type (lossless) 2. per distinct value: keep if already valid UTF-8, else transcode latin1->UTF-8 3. MODIFY to utf8mb4 (all bytes now valid, never errors) 4. set table default charset Also: – mysqli_report(OFF) + per-column error handling so one bad column no longer aborts the run; failed columns keep raw bytes and are re-runnable – optional WEBCALENDAR_DB_* env overrides for container/test use – detection summary now counts ASCII / valid-UTF-8 / genuine-latin1 Add tests/test-latin1-conversion.sh: seeds MariaDB 10.5 with the exact failing values from #649 (plus double-encoded, ASCII, and a TEXT column), runs dry-run then conversion, and asserts the resulting bytes and charset.
- docs: remove dead references to deleted HTML docsby craigk5n on June 16, 2026 at 2:25 am
docs: remove dead references to deleted HTML docs The v2.0 doc modernization (cc0d41cf) deleted WebCalendar-SysAdmin.html and UPGRADING.html in favor of Markdown guides, but several stale references remained (surfaced by issue #648). – config.php: update die_miserable_death docblock to reference docs/troubleshooting.md and the #anchor behavior – settings.php.orig: point http-auth FAQ comment at docs/admin-guide.md – bump_version.sh: drop update_upgrading_html() and its call; the function targeted a deleted file and emitted a warning on every bump – release SKILL.md: remove UPGRADING.html from the touched-files notes
- fix(mcp): return event times in user’s local timezoneby craigk5n on June 9, 2026 at 10:02 pm
fix(mcp): return event times in user’s local timezone list_events and search_events returned the raw GMT cal_time straight from the database, so timed events came back shifted by the user’s UTC offset (an 8 AM EDT appointment was reported as noon). WebCalendar stores cal_time as a GMT clock time and the web UI always converts it to the user’s TIMEZONE on display (view_entry.php: display_time(…, 2)), independent of GENERAL_USE_GMT; the MCP tools now do the same. – Add mcp_gmt_to_local() and mcp_shift_date() pure helpers in functions.php (unit-testable, no globals/env mutation). – list_events: convert each event to the user’s timezone, widen the GMT date-range query by +/-1 day and re-filter by local date so events that cross a day boundary during the shift aren’t dropped, then re-sort by local date/time. – search_events: convert results to local time and re-sort newest-first. – Untimed/all-day events (cal_time = -1) are left unchanged. – Add 12 tests covering EDT/EST offsets, midnight date rollback, untimed passthrough, unpadded-time normalization, UTC identity, invalid-tz fail-safe, and date-shift month/year/leap-day boundaries.
- fix(mcp): repair add_event & rate limiting, isolate the test suiteby craigk5n on June 9, 2026 at 8:42 pm
fix(mcp): repair add_event & rate limiting, isolate the test suite mcp.php: – Fix add_event() id generation: remove the double INSERT and the RETURNING / LOCK TABLES branches that failed against the production schema (cal_id INT NOT NULL, no auto-increment). Generate ids with a portable MAX(cal_id)+1 retry-on-collision loop. – Delegate JSON-RPC handling to mcp_dispatch_request(); the inline switch, tool definitions, and initialize payload now live in functions.php. includes/functions.php: – validate_mcp_token(): strip a “Bearer ” prefix defensively. – check_mcp_rate_limit(): count MCP actions in SQL with a correct, GMT-based one-hour window (previously compared YYYYMMDD to a Unix timestamp, so rate limiting never triggered) and drop dead code. – Add mcp_initialize_result(), mcp_list_tools(), get_mcp_tool_schema(), and mcp_dispatch_request(); load_settings() gains $force_reload. tests: – Add/repair the MCP unit + integration suite and a shared schema fixture at tests/fixtures/test_schema.sql. – Run the installer and php -S server in WEBCALENDAR_USE_ENV mode and put test SQLite DBs in the system temp dir, so the live includes/settings.php and the repo are never read or written by tests. – Harden server teardown against a missing pcntl extension. Full PHPUnit suite (456 tests) and the shell integration harness pass.
- Merge pull request #638 from craigk5n/dependabot/github_actions/actio…by craigk5n on June 1, 2026 at 4:07 pm
Merge pull request #638 from craigk5n/dependabot/github_actions/actions/setup-python-6 chore(deps): bump actions/setup-python from 5 to 6
Download Metrics
- Downloads via Github: 20305
- Downloads via SourceForge:
Related Links
- Standards
- 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.
- iCalShare
- Apple iCal Library
- DateDex
- Project24: holiday and weather calendars