<redmine_root>/themes/ that contains at minimum a stylesheets/application.css file. Redmine loads this stylesheet instead of the default one when the theme is selected.
Minimum required structure
The directory name becomes the theme’s
id. Redmine derives the display name by calling .humanize on it, so my_theme becomes My theme.Step-by-step: create a theme
Create application.css
The simplest approach is to import the default Redmine stylesheet and then add your overrides on top. Because Redmine uses Propshaft (not Sprockets), you cannot use Sprockets-style
//= require directives. Write plain CSS instead.Restart Redmine (production) or rescan (development)
In production:In development, you can rescan from the Rails console:
Overriding specific styles
Use your browser’s developer tools to inspect element classes and IDs. The most commonly overridden selectors are:| Selector | What it controls |
|---|---|
#header | Top navigation bar |
#main-menu ul | Primary navigation links |
#sidebar | Right or left sidebar |
#content | Main content area |
#footer | Page footer |
.issue.status-* | Issue status badges |
.priority-* | Issue priority indicators |
table.list | Data tables |
.flash.notice, .flash.error | Flash notification banners |
Adding a custom JavaScript file
If your theme needs JavaScript (for example, to add a dark-mode toggle), createjavascripts/theme.js inside your theme directory. Redmine detects the file and includes it automatically on every page:
Replacing images
Place image files inthemes/my_theme/images/. To reference them in your CSS:
Custom favicon
Place a favicon file inthemes/my_theme/favicon/. Redmine picks up the first file found in that directory:
themes/my_theme/favicon/favicon.png.
Theme identification
Redmine uses the directory name as the theme’s unique identifier. TheTheme class provides:
Troubleshooting
My theme does not appear in the dropdown
My theme does not appear in the dropdown
Verify that
themes/my_theme/stylesheets/application.css exists. Redmine silently ignores directories that do not contain this file. If you added the theme while Redmine was running in production, restart the server.Styles are applied but images are broken
Styles are applied but images are broken
Theme images are served from
themes/<dir>/images/. Check that your CSS url() paths are relative to the stylesheet file, or use the absolute path /themes/my_theme/images/<filename>.Changes to application.css are not reflected
Changes to application.css are not reflected
In production mode, assets may be cached. Run
bundle exec rake assets:precompile or perform a hard refresh in the browser. In development mode, the asset pipeline serves files directly so changes should appear immediately.The favicon is not updating
The favicon is not updating
Browsers cache favicons aggressively. After updating the file, open a new browser tab or clear the browser cache.
