| Metric | Verdict | | :--- | :--- | | Installation | Instant. Click "Activate" in the Admin UI. No server restarts. | | Speed impact | Negligible (~50ms extra load on the ticket view). | | Upgrade safety | Survived three Zammad minor version upgrades (v6.0 -> v6.2) with zero breakage. | | API access | All add-on features are exposed via the REST API. We automated ticket merging via a webhook. |
A typical Zammad addon requires a specific definition file to appear in the UI and be registered in the system.
Create a file inside your engine structure, typically at:
app/assets/javascripts/app/lib/app_post/_my_new_feature.coffee (or JS)
Or define it within the Zammad core hooks. The critical part is the App.Controller definition.
Example basic structure for a Zammad UI Addon: zammad addons new
// In app/assets/javascripts/apps/my_new_feature/my_new_feature.jsimport App from 'zammad/app';
var MyNewFeature = App.Controller.extend( init: function() // Your code here console.log("My New Feature Addon Loaded!"); );
export default MyNewFeature;
What it is: An addon designed for IT and software support teams. Core functionality: Links Zammad tickets to Jira issues or GitHub PRs. New Capabilities in 2025:
Based on community chatter and GitHub activity, watch for:
For Zammad to recognize the addon, it must be registered in app/models/setting.rb or via an initializer if it's a backend feature.
If you are creating a backend addon (e.g., a new channel or scheduler), you would add an initializer in your engine: | Metric | Verdict | | :--- |
lib/my_new_feature/engine.rb
module MyNewFeature class Engine < ::Rails::Engine isolate_namespace MyNewFeature# Register the addon with Zammad initializer "my_new_feature.register_addon" do |app| # Zammad specific registration logic usually goes here # For example, adding a new channel or ticket hook end
end end