---
id: customize
title: Customize
sidebar_label: 💅🏼 Customize
---

import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem"

The standard initialization sets Oh My Posh' default theme. This configuration is embedded
and thus kept up-to-date with Oh My Posh.

To set a new config/theme you need to change the `--config` option of the `oh-my-posh init <shell>`
line in your `profile` or `.<shell>rc` script (see [prompt][prompt]) and point it to the location of a
predefined [theme][themes] or custom configuration.

There are two possible values the `--config` flag can handle:

- a path to a local configuration file

```powershell
oh-my-posh init pwsh --config 'C:/Users/Posh/jandedobbeleer.omp.json' | Invoke-Expression
```

- a URL pointing to a remote config

```powershell
oh-my-posh init pwsh --config 'https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/jandedobbeleer.omp.json' | Invoke-Expression
```

### Get inspiration

The Windows and homebrew installers also bundle the **predefined configurations** ([themes][themes]). You can use the
following way to reference them directly. This will keep them up-to-date and compatible with future updates.

<Tabs
  defaultValue="windows"
  groupId="shell"
  values={[
    { label: 'windows', value: 'windows', },
    { label: 'homebrew', value: 'homebrew', },
  ]
}>
<TabItem value="windows">

For example, to use the [jandedobbeleer][jandedobbeleer] theme, alter the init line like this (`powershell`):

```powershell
oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/jandedobbeleer.omp.json" | Invoke-Expression
```

</TabItem>
<TabItem value="homebrew">

When using homebrew, all themes are installed alongside Oh My Posh in `$(brew --prefix oh-my-posh)/themes`.
To use any of the themes, use the following syntax (`zsh`):

```bash
eval "$(oh-my-posh init zsh --config $(brew --prefix oh-my-posh)/themes/jandedobbeleer.omp.json)"
```

</TabItem>
</Tabs>

### Config syntax

The examples below use a local path to the [jandedobbeleer][jandedobbeleer] theme, adjust the `--config` value
to reflect your use-case.

<Tabs
  defaultValue="powershell"
  groupId="shell"
  values={[
    { label: 'bash', value: 'bash', },
    { label: 'cmd', value: 'cmd', },
    { label: 'elvish', value: 'elvish', },
    { label: 'fish', value: 'fish', },
    { label: 'nu', value: 'nu', },
    { label: 'powershell', value: 'powershell', },
    { label: 'tcsh', value: 'tcsh', },
    { label: 'xonsh', value: 'xonsh', },
    { label: 'zsh', value: 'zsh', },
  ]
}>
<TabItem value="bash">

:::caution Git bash
Use the full path to the config file, not the relative path or `~` as a shorthand for `$HOME`.
:::

Adjust the Oh My Posh init line in `~/.bashrc` (could be `~/.profile` or `~/.bash_profile` depending
on your environment) by adding the `--config` flag with the location of your configuration.

```bash
eval "$(oh-my-posh init bash --config ~/jandedobbeleer.omp.json)"
```

Once altered, reload your profile for the changes to take effect.

```bash
exec bash
```

</TabItem>
<TabItem value="cmd">

Adjust the Oh My Posh init line in `oh-my-posh.lua` by adding the `--config` flag with the location
of your configuration.

```lua title="oh-my-posh.lua"
load(io.popen('oh-my-posh init cmd --config C:/Users/Posh/jandedobbeleer.omp.json'):read("*a"))()
```

:::caution
Use the full path to the config file, not the relative path. You can make use of **forward slashes** to
avoid having to use double backslashes.
:::

Once altered, restart cmd for the changes to take effect.

</TabItem>
<TabItem value="elvish">

Adjust the Oh My Posh init line in `~/.elvish/rc.elv` by adding the `--config` flag with the location
of your configuration.

```bash
eval (oh-my-posh init elvish --config ~/jandedobbeleer.omp.json)
```

Once added, reload your profile for the changes to take effect.

```bash
exec elvish
```

</TabItem>
<TabItem value="fish">

:::caution
Oh My Posh requires fish v3.4.0 or higher.
:::

Adjust the Oh My Posh init line in `~/.config/fish/config.fish` by adding the `--config` flag with
the location of your configuration.

```bash
oh-my-posh init fish --config ~/jandedobbeleer.omp.json | source
```

Once altered, reload your config for the changes to take effect.

```bash
. ~/.config/fish/config.fish
```

</TabItem>
<TabItem value="nu">

:::caution
Oh My Posh requires Nushell v0.84.0 or higher.
:::

Adjust the Oh My Posh init line in the Nushell env file (`$nu.env-path`) by adding the `--config` flag
with the location of your configuration.

```bash
oh-my-posh init nu --config ~/jandedobbeleer.omp.json
```

This saves the initialization script to `~/.oh-my-posh.nu`.
Now, edit the Nushell config file (`$nu.config-path`) and add the following line at the bottom:

```bash
source ~/.oh-my-posh.nu
```

If you want to save the initialization script elsewhere, you can change the first line to something like this:

```bash
oh-my-posh init nu --config ~/jandedobbeleer.omp.json --print | save /mylocation/myscript.nu --force
```

And change the `source` line to:

```bash
source /mylocation/myscript.nu
```

Once altered, restart Nushell for the changes to take effect.

</TabItem>
<TabItem value="powershell">

Adjust the Oh My Posh init line in your `$PROFILE` by adding the `--config` flag with the location
of your configuration.

```powershell
oh-my-posh init pwsh --config ~/jandedobbeleer.omp.json | Invoke-Expression
```

Once altered, reload your profile for the changes to take effect.

```powershell
. $PROFILE
```

:::info
When the above command gives an error, make sure to create the profile first and add the `oh-my-posh init` above.

```powershell
New-Item -Path $PROFILE -Type File -Force
```

In this scenario, it can also be that PowerShell blocks running local scripts. To solve that, set PowerShell
to only require remote scripts to be signed using `Set-ExecutionPolicy RemoteSigned`, or [sign the profile][sign].
:::

</TabItem>
<TabItem value="tcsh">

Adjust the Oh My Posh init line in `~/.tcshrc` by adding the `--config` flag with the location of your configuration.

```bash
eval `oh-my-posh init tcsh --config ~/jandedobbeleer.omp.json`
```

Once added, reload your profile for the changes to take effect.

```bash
exec tcsh
```

</TabItem>
<TabItem value="xonsh">

Adjust the Oh My Posh init line in `~/.xonshrc` by adding the `--config` flag with the location of your configuration.

```bash
execx($(oh-my-posh init xonsh --config ~/jandedobbeleer.omp.json))
```

Once added, reload your profile for the changes to take effect.

```bash
exec xonsh
```

</TabItem>
<TabItem value="zsh">

Adjust the Oh My Posh init line in `~/.zshrc` by adding the `--config` flag with the location of your configuration.

```bash
eval "$(oh-my-posh init zsh --config ~/jandedobbeleer.omp.json)"
```

Once altered, reload your profile for the changes to take effect.

```bash
exec zsh
```

</TabItem>
</Tabs>

:::tip wsl
When using oh-my-posh in Windows and the WSL, know that you can **share your theme with the WSL** by pointing to a theme in your
Windows user's home folder.

Inside the WSL, you can find your Windows user's home folder here: `/mnt/c/Users/<WINDOWSUSERNAME>`.
:::

### Adjust a theme

Maybe there's a theme you like, but you don't fancy the colors. Or, maybe there's a segment you
want to tweak/add, or replace some of the icons with a different one. Whatever the case, **read through
available options first**, by starting with the [configuration guide][configuration].

You can export the current theme (default, or set via `--config`) to the format you like (`json`, `yaml`, or `toml`)
which can be used to tweak and store as your own custom theme.


```bash
oh-my-posh config export --output ~/.mytheme.omp.json
```

:::caution
Be careful not to adjust the theme files in their original location as they're updated together with Oh My Posh
which will remove your customizations. Always copy, or export them and save the new configuration outside of the
Oh My Posh internal themes folder.
:::

### Read the docs

To fully understand how to customize a theme, read through the documentation in the configuration and segments sections.
The [configuration][configuration] section covers the basic building blocks and concepts of Oh My Posh themes, while the
segments section covers how to configure each available segment.

[themes]: themes.md
[configuration]: configuration/overview.mdx
[prompt]: prompt.mdx
[jandedobbeleer]: /docs/themes#jandedobbeleer
[json-schema]: https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/schema.json
[homebrew-problem]: https://github.com/JanDeDobbeleer/oh-my-posh/discussions/2644
[sign]: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_signing?view=powershell-7.3#methods-of-signing-scripts
