Add-ons & plugins

WordPress's plugin economy is a big part of its moat — and the part a migrated site loses. Volt's answer is a third-party add-on model: equivalent functionality (forms, commerce, search, SEO…) shipped as small npm packages you install and own, instead of a plugin sprawl you configure in a dashboard.

Use one (in your app)

npx create-volt add forms

That installs volt-addon-forms and adds forms to VOLT_ADDONS in .env. Restart and it's wired.

Build one

npx create-volt create-addon forms

This scaffolds a publishable volt-addon-forms/ package. The whole contract is one function:

// index.js
export function register({ app, express, io, store, mailer, env, log }) {
  app.post("/api/forms/submit", express.json(), async (req, res) => {
    await store.collection("submissions").put(crypto.randomUUID(), req.body);
    res.json({ ok: true });
  });
  log("ready");
}

register(ctx) runs once at startup and receives:

ctx what it is
app the Express app — add routes
express the host's Express — express.static / express.Router with no dependency of your own
io Socket.io server (if the realtime add-on is on)
store the database — collection(name).{put,get,all,find,delete} (if db is on)
mailer send mail (if the mailer add-on is on)
env, log environment + a namespaced logger

Serve your own frontend assets from public/, add any routes/sockets you need, and use the host's database — no separate setup.

Publish + distribute

npm publish        # publishes volt-addon-forms

Anyone then runs npx create-volt add forms. Discovery is by convention: VOLT_ADDONS entries that aren't built-ins are loaded from volt-addon-<name> (or a local .volt/addons/<name>/index.js).

Why this beats the plugin model

Add-ons are code you install and read, not opaque dashboard configuration. No standing admin to attack, no plugin-update treadmill, and the same security posture as the rest of your app. You bring over the functionality you need — not 50 plugins' worth of surface area.