=== HappenBoard ===
Contributors: rainbowgeek
Tags: events, calendar, booking, appointments, rsvp
Requires at least: 6.9
Tested up to: 7.0
Requires PHP: 8.2
Stable tag: 0.1.0
License: GPLv3 or later
License URI: https://www.gnu.org/licenses/gpl-3.0.html

Block-native events calendar and appointment booking for WordPress. Built for the Site Editor. Recurring events, RSVPs, iCal feeds, Event Schema.

== Description ==

**HappenBoard** is a modern, lightweight events calendar **and appointment-booking plugin**, built from the ground up for the WordPress block editor and the Site Editor. It uses only core WordPress components, server-rendered blocks, and clean PSR-4 PHP 8.2 code.

It is built by the team behind [SEOPress](https://www.seopress.org/) and [MailerPress](https://www.mailerpress.com/), with the same focus on speed, native integration, and a generous free tier.

= Why HappenBoard =

* **Fast and SEO-friendly out of the box.** Server-rendered blocks load instantly and are indexed by Google — no JavaScript-only pages that hurt your rankings.
* **Works with your theme.** Native blocks adapt to your design without custom CSS, and Site Editor templates let you redesign every event page visually.
* **Stop losing attendees.** Free RSVPs with capacity limits, email confirmations, automatic reminders, and a one-click cancellation link, everything your visitors need to actually show up.
* **Real recurring events.** Weekly classes, monthly meetups, yearly conferences — set it once and HappenBoard handles every occurrence.
* **Take appointments too.** A full booking flow in the free plugin: booking types, per-host weekly availability with buffers and notice windows, days off, round-robin assignment across unlimited hosts, group bookings, a standards-compliant `.ics` invite attached to every confirmation, and a token link so visitors cancel or reschedule themselves.
* **Get found on Google.** Event Schema (JSON-LD) is added automatically so your events appear in Google's rich event results.
* **Move in without retyping anything.** One-click importers for The Events Calendar, Events Manager, Sugar Calendar, EventKoi, Amelia, and any `.ics` file — they even work when the old plugin is already deactivated.
* **No lock-in, no clutter.** Standard custom post types, REST API, and iCal feeds — your data stays yours and works with any tool.
* **Familiar admin.** The same look and feel as WordPress core, so your team doesn't need to learn a new interface.

= Also in the free plugin =

* **21 blocks**, 11 patterns, and Site Editor templates for single events, the events archive, category archives, single booking types, and the per-event “All dates” page
* **Weather forecast** on event pages, for outdoor events (optional, powered by Open-Meteo)
* **Favourites and a personal “My schedule”** so visitors can save the events they care about
* **Multilingual** — WPML and Polylang, through the bundled `wpml-config.xml`
* **GDPR-native** — real WordPress personal-data exporter and eraser, not just a settings page
* **Spam protection** — honeypot and signed timestamps by default, optional Cloudflare Turnstile and Akismet
* **Site Health checks** that tell you when a cron failure is about to stop your reminders
* **REST API** for every entity, **WP-CLI** commands for event creation and migrations, plus an Elementor widget for classic-builder sites

= Built the WordPress way =

* PHP 8.2+ with strict types and PSR-4 autoloading
* Vendor libraries (sabre/vobject) prefixed with Strauss — no conflict with any other plugin shipping the same dependency
* PHPCS (WordPress Coding Standards), PHPStan level 5, PHPUnit test suite
* Translation-ready (text domain `happenboard`)
* Accessibility-aware front-end components

= From the team =

HappenBoard is built by the same team behind [SEOPress](https://www.seopress.org/) — trusted by 300,000+ WordPress sites. Same engineering bar, same support commitments, same long-term maintenance.

== Installation ==

= From WordPress.org =

1. Search **HappenBoard** under **Plugins → Add New** in your WordPress admin.
2. Click **Install Now**, then **Activate**.
3. Run the onboarding wizard that appears (general settings → email).
4. Go to **Events → Add New** to create your first event.
5. Insert the **Calendar** or **Upcoming Events** block into any page or template.

= Manual upload =

1. Download the .zip from WordPress.org.
2. Go to **Plugins → Add New → Upload Plugin**, choose the .zip, click **Install Now**.
3. Activate and follow the onboarding wizard.

= Requirements =

* WordPress 6.9 or newer
* PHP 8.2 or newer
* MySQL 5.7+ / MariaDB 10.3+ (uses standard `dbDelta`)

== Frequently Asked Questions ==

= Does this work with classic themes? =

Yes. All blocks can be inserted in any post, page, or widget area. If your theme supports the Site Editor (FSE), HappenBoard also ships matching block templates for single events and the event archive.

= Will this conflict with other event plugins? =

No. HappenBoard uses its own post type (`hboard_event`), prefixed meta keys (`_happenboard_*`), prefixed database tables (`happenboard_occurrences`, `happenboard_attendees`, `happenboard_bookings`, `happenboard_availability_rules`, `happenboard_agent_log`), and prefixed third-party libraries (`HappenBoard\Vendor\…`). You can run it alongside any other event plugin without conflict.

= Does HappenBoard add Event schema (JSON-LD) for SEO? =

Yes — automatically, on every single-event page, conforming to the [Google rich-result spec](https://developers.google.com/search/docs/appearance/structured-data/event). If [SEOPress](https://www.seopress.org/) is active and an Event schema has been manually configured for the same post through SEOPress's custom-schema feature, HappenBoard defers to SEOPress to avoid double emission.

= Does it support recurring events? =

Yes. Recurrence is stored as a standard RFC 5545 RRULE and expanded into a persisted occurrences table using the same library (`sabre/vobject`) that powers most calendar servers.

= Where are attendees managed? =

Under **HappenBoard → Attendees** in the admin. The screen is built on `@wordpress/dataviews`, the same component library the Site Editor and the Posts screen use. HappenBoard bundles its own copy, because WordPress does not register `wp-dataviews` as a public script handle.

= Can I export translations? =

Yes. The text domain is `happenboard` and the plugin is ready for translation on translate.wordpress.org. To generate a fresh `.pot` locally, run `npm run makepot`.

= How do I completely uninstall HappenBoard and erase all its data? =

By default, deleting the plugin from **Plugins → Installed Plugins → Delete** preserves all of your data — events, attendees, occurrences, settings, taxonomy terms, and custom capabilities all stay in the database. This is intentional, so re-installing later restores everything as it was.

To opt in to a full wipe, add the following constant to your `wp-config.php` *before* clicking **Delete**:

`define( 'HAPPENBOARD_UNINSTALL', true );`

When that constant is set, deleting the plugin will:

* Remove every event, venue, organizer, and booking-type post (and their post meta)
* Remove every event category and event tag
* Drop the custom tables `wp_happenboard_occurrences`, `wp_happenboard_attendees`, `wp_happenboard_bookings`, `wp_happenboard_availability_rules` and `wp_happenboard_agent_log`
* Delete every option starting with `happenboard_` (general settings, onboarding flag, DB versions, etc.)
* Delete every plugin transient
* Clear the plugin's scheduled WP-Cron events
* Remove every HappenBoard custom capability from every role

The wipe is multisite-aware — on a network install it runs once per blog. After the uninstall completes you can remove the constant from `wp-config.php`.

== Source code and build ==

HappenBoard is fully GPL and ships its complete, human-readable source inside the plugin — nothing is obfuscated.

* **PHP** — uncompiled PSR-4 source in `src/`. Third-party libraries are prefixed with [Strauss](https://github.com/BrianHenryIE/strauss) and ship readable in `vendor-prefixed/` (notably `sabre/vobject` for RRULE parsing).
* **JavaScript / CSS** — the editor and admin code in `build/` is compiled with [`@wordpress/scripts`](https://www.npmjs.com/package/@wordpress/scripts) (webpack). The matching uncompiled source ships alongside it: block source in `src/blocks/`, the admin SPA in `assets/js/admin/`, and the post-editor scripts in `assets/js/post-editor/`. The build configuration (`package.json` and `webpack.config.js`) is included too.

To regenerate every compiled asset from source:

`npm install`
`npm run build`

Requires Node 20+. `npm run start` runs the same build in watch mode. PHP dependencies, if you rebuild the prefixed tree, are managed with `composer install`.

All declarations follow WordPress prefixing rules: PHP is namespaced under `HappenBoard\`, options/transients use the `happenboard_` prefix, post meta uses `_happenboard_`, and taxonomies use `happenboard_` (`happenboard_category`, `happenboard_tag`). Post types use the shorter `hboard_` prefix (`hboard_event`, `hboard_venue`, `hboard_organizer`, `hboard_booking_type`) because WordPress caps post type names at 20 characters.

== Changelog ==

= 0.1.0 =
First public release.

== Privacy ==

HappenBoard stores attendee and booking data (name, email, RSVP or appointment status) in your own WordPress database. It collects no telemetry, requires no account, and sends nothing anywhere by default.

Four optional features do contact a third party, and only once you turn them on:

* **Event weather** — the event's coordinates and date are sent to [Open-Meteo](https://open-meteo.com/) to fetch a forecast. No visitor or attendee data is included.
* **Venue maps** — an embedded map loads from OpenStreetMap (default), Google Maps, or a custom tile provider you configure. Your visitor's browser contacts that provider directly, as with any embedded map.
* **Cloudflare Turnstile** — when enabled for the RSVP or booking forms, the submitting visitor's IP address and challenge token are sent to [Cloudflare](https://www.cloudflare.com/privacypolicy/) for verification.
* **Akismet** — when enabled, the submission's name, email, IP address and user agent are sent to [Akismet](https://akismet.com/privacy/) for spam scoring.

All four are off unless you enable them. HappenBoard also registers with WordPress's own privacy tools, so a personal-data export or erasure request made through **Tools → Export/Erase Personal Data** covers the visitor's RSVPs and tickets.
