Modules and Extending FluentBoards
FluentBoards CoreFluentBoards organizes work as boards that contain stages (columns), which contain tasks. The pages in this section are task-oriented guides for each of these objects. They show how to work with them from your own plugin through the PHP API, and where to hook in.
| Page | What it covers |
|---|---|
| Boards | Listing boards, creating a board (with default stages and labels), reading stages and labels, creating labels |
| Stages | Listing and reading stages, adding a stage, renaming or recoloring it, setting its default task status, archiving and restoring |
| Tasks | Creating tasks, assigning users and labels, moving tasks between stages, updating fields, subtasks and attachments (Pro) |
| Navigation | Adding items to the top navigation and to the board menu, and customizing the app URL, logo and icon |
For the full method signatures and return values, see the API reference pages: Boards API, Stages API and Tasks API.
Building an add-on
Keep your code in its own plugin so FluentBoards updates never overwrite it. A typical add-on:
- Waits for FluentBoards to load. FluentBoards fires
fluent_boards_loaded(with the application instance) onplugins_loaded. Register that listener when your plugin file loads, not inside anotherplugins_loadedcallback that runs later. - Uses the PHP API for writes.
FluentBoardsApi('boards' | 'stages' | 'tasks')checks the current user's permissions and runs the same services as the app, so positions, activities and hooks stay consistent. - Uses the models for reads the API does not cover. The models are in
FluentBoards\App\Models(Board,Stage,Task,Label,Comment, …). See Models. - Reacts to events with hooks. See Action hooks (for example
fluent_boards/task_created,fluent_boards/board_created,fluent_boards/task_stage_updated) and Filter hooks (for examplefluent_boards/before_task_create,fluent_boards/task_priorities). - Exposes data remotely through the REST API under
/wp-json/fluent-boards/v2/. See REST API.
<?php
/**
* Plugin Name: My Boards Add-on
*/
defined('ABSPATH') || exit;
add_action('fluent_boards_loaded', function ($app) {
// Label every new task that comes from a specific source
add_action('fluent_boards/task_created', function ($task) {
if ($task->source !== 'my-addon') {
return;
}
$labels = FluentBoardsApi('boards')->getLabels($task->board_id);
$label = $labels ? $labels->firstWhere('title', 'Imported') : null;
if ($label) {
FluentBoardsApi('tasks')->attachLabels($task->id, [$label->id]);
}
});
// Rename the "Urgent" priority (keys stay the same, only labels change)
add_filter('fluent_boards/task_priorities', function ($priorities) {
$priorities['urgent'] = __('Fire!', 'my-addon');
return $priorities;
});
});Permissions in background jobs
The PHP API checks the current WordPress user. In cron jobs, Action Scheduler callbacks, webhooks or WP-CLI there is often no user, so calls return false. Switch to a user who has access with wp_set_current_user($userId) before you call the API.
Modules in the code base
"Module" also refers to optional feature modules that can be switched on in Settings → Modules. Their state is stored in the WordPress option fluent_boards_modules and read with fluent_boards_get_pref_settings().
| Module | Where | Notes |
|---|---|---|
| Time tracking | Pro: app/Modules/TimeTracking | Adds the fbs_time_tracks table and timer endpoints. Pref key timeTracking. |
| Frontend portal | Pro | Serves the app on a front-end page or slug. Pref key frontend. |
| Recurring tasks | Pro | Pref key recurring_task |
| Cloud storage | Pro: app/Modules/CloudStorage | S3, Cloudflare R2, DigitalOcean Spaces and Backblaze drivers. Flag cloud_storage in fluent_boards_get_features_config(). |
| MCP / AI abilities | Core and Pro: app/Modules/MCP | Registers board, stage, task and comment abilities through the WordPress Abilities API, exposed on a FluentBoards MCP server when the WP MCP Adapter is installed. Extend it on fluent_boards/mcp_loaded. |
| Menu placement | Core | Show FluentBoards inside the FluentCRM menu. Pref key menu_settings. |