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.css if 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

Build something useful and share it on the forum.