Plugin System
Overview
All plugins follow the same pattern: definition → versioned releases → project instances → portal bindings. A team creates a plugin, publishes versions, and projects install instances pinned to specific versions.
PluginPage (template, owned by team)
└── PluginPageVersion (versioned releases: code, deps, settings)
└── ProjectPage (instance per project, with resolved config)
└── ProjectPortalPage (bound to portal with URL + token)
This pattern repeats across all four plugin types.
The Four Plugin Types
Plugin Pages (Apps)
The core building block. Plugin pages are self-contained applications with HTML, CSS, and JavaScript that render as portal pages. Each version contains:
body_template- HTML/Vue template codestyle- CSS stylesheetjavascript- JavaScript code or compiled bundledependencies- data and permission declarations (the security model)settings- configurable options exposed to project admins
Examples: Registration forms, social feeds, agendas, leaderboards, speaker directories, live polling, drawing walls, photo booths.
Plugin pages are Vue 3 applications compiled through Vite. The final build excludes Vue itself (it's provided by the platform), keeping bundles compact.
Plugin Widgets
Global components injected into every portal page. Widgets don't have their own URL - they're embedded in the portal layout.
- Head scripts - injected into
<head>(analytics, tag managers) - Global Vue components - floating overlays, persistent UI elements
Examples: Google Analytics trackers, chat widgets (Intercom, Drift), cookie consent banners, notification bells, help buttons.
Each widget gets its own Sanctum token and can declare its own dependencies, independent of any page.
Plugin Themes
Portal layout and styling packages. A theme provides the visual shell that wraps all portal content.
- Public template - layout for unauthenticated pages
- Private template - layout for authenticated pages
- System template - layout for system pages (errors, access codes)
- CSS and JS libraries - global styles and scripts
Themes control branding, colors, fonts, and the overall look and feel of the attendee experience.
Plugin Tiles
Dashboard analytics displays for project administrators. Tiles render custom data visualizations on the admin dashboard.
Examples: Attendance counters, registration charts, revenue breakdowns, real-time check-in maps.
Tiles follow the same versioning model but are admin-facing rather than attendee-facing.
Comparison
| Aspect | Pages | Widgets | Themes | Tiles |
|---|---|---|---|---|
| Audience | Attendees | Attendees | Attendees | Admins |
| Has URL | Yes (/schedule) | No (embedded) | No (layout) | No (dashboard) |
| Scope | Full page content | Small UI element | Portal-wide layout | Dashboard panel |
| Own API token | Yes | Yes | No | Yes |
| Dependencies | Full declarations | Full declarations | N/A | Full declarations |
Versioning
Plugins use independent version management:
- Publishing creates a new version snapshot. The published version becomes immutable.
- Projects pin to a specific version via
plugin_page_version_id(or equivalent). - Upgrading is explicit - changing the pinned version on each project instance.
- Deprecation marks a version as outdated, but it continues working for projects that haven't upgraded.
Version Lifecycle
Draft (v3) ← active development
Published (v2) ← installed by projects, immutable
Published (v1) ← older version, still in use
Deprecated (v0) ← marked outdated, still functional
When a version is published:
- The current draft is marked as published
- A new draft version is created with an incremented version number
- All assets are copied to the new draft
- The plugin's
current_version_idupdates
Version Pinning
Different projects can run different versions of the same plugin. This means:
- Updating a plugin template doesn't automatically affect existing installations
- A deprecated version keeps working for projects that haven't upgraded
- Security scope is locked to the pinned version's dependencies
Dependencies and Security Model
The dependency system is the core of plugin security. Each plugin version declares what data and permissions it needs. At runtime, the platform enforces these declarations.