Extending bulletinbored with plugins
Learn how the bulletinbored plugin system works: hooks, plugin folders, and a practical example you can drop into your forum today.
One of the promises of bulletinbored is that you can extend it without learning a framework. The plugin system is deliberately small: a folder, a PHP file, and hooks.
How plugins are structured
Each plugin lives in its own directory under plugins/:
plugins/
└── hello/
└── plugin.php
That’s the whole contract. bulletinbored discovers the folder and runs the file.
Hooks in practice
Hooks let you attach your code to events in the forum’s lifecycle. The core fires a hook at key points — rendering a post, saving a thread, building navigation — and your plugin decides what to do.
<?php
// plugins/hello/plugin.php
function hello_post_render(string $html): string
{
return $html . '<p>Hello from the hello plugin!</p>';
}
register_hook('post.render', 'hello_post_render');
Save the file. Reload the page. Your content appears. No autoloader, no cache, no rebuild.
Guidelines that keep things portable
- Namespace your functions. Prefix everything with your plugin name to avoid collisions with other plugins.
- Fail softly. Never let a plugin take the whole forum down; guard your logic.
- Ship a
style.cssif you need styles. Themes load it automatically. - Keep it self-contained. Only the folder matters — deleting it removes the plugin completely.
Themes work the same way
Themes are plugins for the look, not the logic: create a folder with a style.css
and switch to it in the admin panel. The same principles apply.
Where to go next
- Plugin development docs
- Theme development docs
- Plugin catalog — browse and share plugins
Build something useful and share it on the forum.