Built-in Themes
Zipline includes 12 built-in themes:Neutral Themes
- Dark Gray - Default dark theme
- Light Gray - Default light theme
- Black Dark - Pure black dark theme
Blue Themes
- Light Blue - Light blue color scheme
- Dark Blue - Dark blue color scheme
Catppuccin Themes
- Catppuccin Frappé - Warm, pastel dark theme
- Catppuccin Latte - Light, warm theme
- Catppuccin Macchiato - Dark, rich theme
- Catppuccin Mocha - Deep, cozy dark theme
Midnight Themes
- Midnight Orange - Dark theme with orange accents
- Midnight Blue - Dark theme with blue accents
- Midnight Purple - Dark theme with purple accents
Theme Configuration
Configure which themes are available in your database:- websiteThemeDefault: Default theme selection (“system”, “dark”, or “light”)
- websiteThemeDark: Which theme to use in dark mode
- websiteThemeLight: Which theme to use in light mode
Creating Custom Themes
Custom themes are JSON files placed in thethemes/ directory at the root of your Zipline installation.
Theme File Structure
Theme JSON Structure
Theme Properties
Display name shown in the theme selector
Either
"dark" or "light" - determines the base color schemeThe primary color key from the colors object (e.g., “blue”, “red”)
The main background color for the application shell. Can be:
- Hex color:
"#1a1a1a" - CSS color-mix:
"color-mix(in srgb, var(--mantine-color-gray-9), black 45%)"
Color palette with 10 shades for each color (0 = lightest, 9 = darkest)
Optional custom CSS to inject into the theme
OAuth Provider Colors
Themes automatically include OAuth provider colors:Theme Loading
The theme loading process is handled insrc/lib/theme/file.ts:27:
Theme Components
The theming system integrates with Mantine UI components:Example: Creating a Custom Theme
Here’s a complete example of a custom “Sunset” theme:themes/sunset.theme.json and restart Zipline.
Color Palette Guidelines
When creating custom themes, follow these guidelines:
- 10 shades: Each color must have exactly 10 shades (index 0-9)
- Lightest to darkest: Index 0 is lightest, index 9 is darkest
- Consistent steps: Try to maintain consistent brightness steps between shades
- Accessibility: Ensure sufficient contrast for text readability
- Testing: Test your theme in both light and dark system modes
Advanced Customization
Using CSS Variables
You can use Mantine CSS variables in your theme:Custom CSS Injection
Use theextraCss field to add custom styles:
Troubleshooting
Theme Not Appearing
- Check the file is in the
themes/directory - Ensure the filename ends with
.theme.json - Verify the JSON is valid (use a JSON validator)
- Restart the Zipline server
- Check server logs for theme loading errors
Theme Looks Broken
- Verify
mainBackgroundColoris set - Ensure all color arrays have exactly 10 values
- Check that
colorSchemeis either “dark” or “light” - Validate that
primaryColormatches a key incolors
Colors Not Showing Correctly
- Use hex color format:
#rrggbb - Ensure color values are strings, not numbers
- Check that shades are ordered from light to dark
- Test contrast ratios for accessibility
Custom CSS Not Working
- Ensure CSS is valid
- Use
!importantif needed to override default styles - Check browser console for CSS errors
- Verify selectors match actual DOM elements