| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- ---
- title: Themes
- ---
- opencode supports a flexible JSON-based theme system that allows users to create and customize themes easily.
- ## Theme Loading Hierarchy
- Themes are loaded from multiple directories in the following order (later directories override earlier ones):
- 1. **Built-in themes** - Embedded in the binary
- 2. **User config directory** - `~/.config/opencode/themes/*.json` (or `$XDG_CONFIG_HOME/opencode/themes/*.json`)
- 3. **Project root directory** - `<project-root>/.opencode/themes/*.json`
- 4. **Current working directory** - `./.opencode/themes/*.json`
- If multiple directories contain a theme with the same name, the theme from the directory with higher priority will be used.
- ## Creating a Custom Theme
- To create a custom theme, create a JSON file in one of the theme directories:
- ```bash no-frame
- # For user-wide themes
- mkdir -p ~/.config/opencode/themes
- vim ~/.config/opencode/themes/my-theme.json
- # For project-specific themes
- mkdir -p .opencode/themes
- vim .opencode/themes/my-theme.json
- ```
- ## Theme JSON Format
- Themes use a flexible JSON format with support for:
- - **Hex colors**: `"#ffffff"`
- - **ANSI colors**: `3` (0-255)
- - **Color references**: `"primary"` or custom definitions
- - **Dark/light variants**: `{"dark": "#000", "light": "#fff"}`
- - **No color**: `"none"` - Uses the terminal's default color (transparent)
- ### Example Theme
- ```json no-frame
- {
- "$schema": "https://opencode.ai/theme.json",
- "defs": {
- "nord0": "#2E3440",
- "nord1": "#3B4252",
- "nord2": "#434C5E",
- "nord3": "#4C566A",
- "nord4": "#D8DEE9",
- "nord5": "#E5E9F0",
- "nord6": "#ECEFF4",
- "nord7": "#8FBCBB",
- "nord8": "#88C0D0",
- "nord9": "#81A1C1",
- "nord10": "#5E81AC",
- "nord11": "#BF616A",
- "nord12": "#D08770",
- "nord13": "#EBCB8B",
- "nord14": "#A3BE8C",
- "nord15": "#B48EAD"
- },
- "theme": {
- "primary": {
- "dark": "nord8",
- "light": "nord10"
- },
- "secondary": {
- "dark": "nord9",
- "light": "nord9"
- },
- "accent": {
- "dark": "nord7",
- "light": "nord7"
- },
- "error": {
- "dark": "nord11",
- "light": "nord11"
- },
- "warning": {
- "dark": "nord12",
- "light": "nord12"
- },
- "success": {
- "dark": "nord14",
- "light": "nord14"
- },
- "info": {
- "dark": "nord8",
- "light": "nord10"
- },
- "text": {
- "dark": "nord4",
- "light": "nord0"
- },
- "textMuted": {
- "dark": "nord3",
- "light": "nord1"
- },
- "background": {
- "dark": "nord0",
- "light": "nord6"
- },
- "backgroundPanel": {
- "dark": "nord1",
- "light": "nord5"
- },
- "backgroundElement": {
- "dark": "nord1",
- "light": "nord4"
- },
- "border": {
- "dark": "nord2",
- "light": "nord3"
- },
- "borderActive": {
- "dark": "nord3",
- "light": "nord2"
- },
- "borderSubtle": {
- "dark": "nord2",
- "light": "nord3"
- },
- "diffAdded": {
- "dark": "nord14",
- "light": "nord14"
- },
- "diffRemoved": {
- "dark": "nord11",
- "light": "nord11"
- },
- "diffContext": {
- "dark": "nord3",
- "light": "nord3"
- },
- "diffHunkHeader": {
- "dark": "nord3",
- "light": "nord3"
- },
- "diffHighlightAdded": {
- "dark": "nord14",
- "light": "nord14"
- },
- "diffHighlightRemoved": {
- "dark": "nord11",
- "light": "nord11"
- },
- "diffAddedBg": {
- "dark": "#3B4252",
- "light": "#E5E9F0"
- },
- "diffRemovedBg": {
- "dark": "#3B4252",
- "light": "#E5E9F0"
- },
- "diffContextBg": {
- "dark": "nord1",
- "light": "nord5"
- },
- "diffLineNumber": {
- "dark": "nord2",
- "light": "nord4"
- },
- "diffAddedLineNumberBg": {
- "dark": "#3B4252",
- "light": "#E5E9F0"
- },
- "diffRemovedLineNumberBg": {
- "dark": "#3B4252",
- "light": "#E5E9F0"
- },
- "markdownText": {
- "dark": "nord4",
- "light": "nord0"
- },
- "markdownHeading": {
- "dark": "nord8",
- "light": "nord10"
- },
- "markdownLink": {
- "dark": "nord9",
- "light": "nord9"
- },
- "markdownLinkText": {
- "dark": "nord7",
- "light": "nord7"
- },
- "markdownCode": {
- "dark": "nord14",
- "light": "nord14"
- },
- "markdownBlockQuote": {
- "dark": "nord3",
- "light": "nord3"
- },
- "markdownEmph": {
- "dark": "nord12",
- "light": "nord12"
- },
- "markdownStrong": {
- "dark": "nord13",
- "light": "nord13"
- },
- "markdownHorizontalRule": {
- "dark": "nord3",
- "light": "nord3"
- },
- "markdownListItem": {
- "dark": "nord8",
- "light": "nord10"
- },
- "markdownListEnumeration": {
- "dark": "nord7",
- "light": "nord7"
- },
- "markdownImage": {
- "dark": "nord9",
- "light": "nord9"
- },
- "markdownImageText": {
- "dark": "nord7",
- "light": "nord7"
- },
- "markdownCodeBlock": {
- "dark": "nord4",
- "light": "nord0"
- },
- "syntaxComment": {
- "dark": "nord3",
- "light": "nord3"
- },
- "syntaxKeyword": {
- "dark": "nord9",
- "light": "nord9"
- },
- "syntaxFunction": {
- "dark": "nord8",
- "light": "nord8"
- },
- "syntaxVariable": {
- "dark": "nord7",
- "light": "nord7"
- },
- "syntaxString": {
- "dark": "nord14",
- "light": "nord14"
- },
- "syntaxNumber": {
- "dark": "nord15",
- "light": "nord15"
- },
- "syntaxType": {
- "dark": "nord7",
- "light": "nord7"
- },
- "syntaxOperator": {
- "dark": "nord9",
- "light": "nord9"
- },
- "syntaxPunctuation": {
- "dark": "nord4",
- "light": "nord0"
- }
- }
- }
- ```
- ### Color Definitions
- The `defs` section (optional) allows you to define reusable colors that can be referenced in the theme.
- ### Using "none" for Terminal Defaults
- The special value `\"none\"` can be used for any color to inherit the terminal's default color. This is particularly useful for creating themes that blend seamlessly with your terminal's color scheme:
- - `\"text\": \"none\"` - Uses terminal's default foreground color
- - `\"background\": \"none\"` - Uses terminal's default background color
- ## The System Theme
- The `system` theme is opencode's default theme, designed to automatically adapt to your terminal's color scheme. Unlike traditional themes that use fixed colors, the system theme:
- - **Generates gray scale**: Creates a custom gray scale based on your terminal's background color, ensuring optimal contrast
- - **Uses ANSI colors**: Leverages standard ANSI colors (0-15) for syntax highlighting and UI elements, which respect your terminal's color palette
- - **Preserves terminal defaults**: Uses `none` for text and background colors to maintain your terminal's native appearance
- The system theme is ideal for users who:
- - Want opencode to match their terminal's appearance
- - Use custom terminal color schemes
- - Prefer a consistent look across all terminal applications
- ## Built-in Themes
- opencode comes with several built-in themes:
- - `system` - Default theme that dynamically adapts to your terminal's background color
- - `tokyonight` - Tokyonight theme
- - `everforest` - Everforest theme
- - `ayu` - Ayu dark theme
- - `catppuccin` - Catppuccin theme
- - `gruvbox` - Gruvbox theme
- - `kanagawa` - Kanagawa theme
- - `nord` - Nord theme
- - `matrix` - Hacker-style green on black theme
- - `one-dark` - Atom One Dark inspired theme
- ## Using a Theme
- To use a theme, set it in your opencode configuration or select it from the theme dialog in the TUI.
- ```json title="opencode.json" {3}
- {
- "$schema": "https://opencode.ai/config.json",
- "theme": "tokyonight"
- }
- ```
|