packages/docs/docs/experimental/custom-themes.md
:::warning
This is an experimental feature. That means we're still working on finishing it. There may be bugs, missing functionality or incomplete documentation, and we may decide to remove the feature in a future release. If you have any feedback, please post a comment on GitHub or post a message in the Discord.
:::
:::warning
All functionality described here may not be available in the latest stable release. See Experimental Features for instructions to enable experimental features. Use the edge images for the latest implementation.
:::
Custom themes allow you to personalize the appearance of Actual by installing custom color schemes. You can choose from a catalog of community-created themes or create your own by defining CSS variables that override the default theme colors.
Before you can use custom themes, you need to enable the experimental feature:
The easiest way to install a custom theme is to choose one from the catalog:
Themes in the catalog are hosted on GitHub and are automatically fetched when you select them. Each theme shows a color palette preview (6 colors in a 3x2 grid) and includes a link to its source repository.
You can also install a custom theme by pasting CSS directly:
The CSS will be validated before installation. If there are any errors, they will be displayed below the text area.
If you want to create your own custom theme and publish it for the community to use, you'll need to understand how Actual's theming system works.
Custom themes must be written as CSS using the :root selector with CSS custom properties (variables). The format is:
:root {
--color-pageBackground: #1a1a1a;
--color-pageText: #ffffff;
--color-buttonPrimaryBackground: #007bff;
/* ... more variables ... */
}
Important requirements:
:root { ... } and nothing else-- are allowed; Actual uses --color-* variables for themingvar(--custom-property-name) to reference other variables (e.g. to reuse existing theme variables). Only this form is allowed; fallbacks like var(--name, value) are not supported.Example using variables:
:root {
--color-pageBackground: #1a1a1a;
--color-pageText: #ffffff;
/* Reuse another variable */
--color-buttonPrimaryBackground: var(--color-pageTextLink);
}
Custom themes can override any of the CSS variables defined in Actual's base themes. These variables correspond to the theme color keys found in the theme files:
packages/desktop-client/src/style/themes/light.tspackages/desktop-client/src/style/themes/dark.tspackages/desktop-client/src/style/themes/midnight.tsCommon variables include:
Page Colors:
--color-pageBackground - Main page background--color-pageText - Primary text color--color-pageTextSubdued - Secondary/subdued text--color-pageTextPositive - Positive/action text color--color-pageTextLink - Link text colorTable Colors:
--color-tableBackground - Table background--color-tableText - Table text--color-tableBorder - Table borders--color-tableRowBackgroundHover - Row hover backgroundButton Colors:
--color-buttonPrimaryBackground - Primary button background--color-buttonPrimaryText - Primary button text--color-buttonNormalBackground - Normal button background--color-buttonNormalText - Normal button textSidebar Colors:
--color-sidebarBackground - Sidebar background--color-sidebarItemText - Sidebar item text--color-sidebarItemTextSelected - Selected sidebar item textGraph Colors:
These color palette impact custom report series colors in all variations - bar, line, donut, etc...
--color-chartQual1--color-chartQual2--color-chartQual3--color-chartQual4--color-chartQual5--color-chartQual6--color-chartQual7--color-chartQual8--color-chartQual9And many more! To see all available variables, check the theme files in the source code or look at an existing theme.
When you paste CSS or install from a catalog, the theme is validated to ensure it meets the requirements:
:root { ... }-- are allowed; Actual uses --color-* variables for themingvar(--name) references (no fallbacks):root blockIf validation fails, you'll see an error message explaining what's wrong.
To share your theme with others or add it to the catalog, you can host it on GitHub:
actual.css in the root directory (on the main branch)Example repository structure:
your-theme-repo/
└── actual.css # Your theme CSS
Example actual.css:
:root {
--color-pageBackground: #0d1117;
--color-pageText: #c9d1d9;
--color-pageTextSubdued: #8b949e;
--color-buttonPrimaryBackground: #238636;
--color-buttonPrimaryText: #ffffff;
/* Add all other variables you want to customize */
}
The theme can then be referenced in the catalog using the format owner/repo (e.g., actualbudget/demo-theme).
When your theme is added to the catalog, it will display a color palette preview. The palette is defined in the catalog JSON file and should include 6 representative colors from your theme (typically background colors, accent colors, and text colors).
For a complete example of a custom theme, check out the demo theme repository. This repository contains multiple theme variations and demonstrates the proper structure and format.
The demo theme includes examples of:
You can use this as a template for creating your own themes.
--color- followed by the theme key nameTo have your theme added to the official catalog, you'll need to:
owner/repo formatThe catalog is maintained in packages/desktop-client/src/data/customThemeCatalog.json. Each theme entry includes:
name: The theme namerepo: The GitHub repository in owner/repo formatcolors: An array of 6 hex color values for the palette preview (e.g., ["#1a1a2e", "#16213e", "#0f3460", "#e94560", "#533483", "#f1f1f1"])