--- title: "Configuration primer" description: "Fine tune your instance exactly the way you want." icon: "sliders" --- Gogs uses a layered configuration system. A default configuration is embedded in the binary, and you provide overrides in a custom file. Beyond `app.ini`, the `custom/` directory lets you override templates, static assets, locale files, and more. ## Two-layer configuration Gogs reads configuration from two sources, in order: 1. **Embedded defaults**: The [`conf/app.ini`](https://github.com/gogs/gogs/blob/main/conf/app.ini) file is compiled into the binary. You should never edit this file directly. 2. **Custom overrides**: Your `custom/conf/app.ini` file. Any value you set here takes precedence over the embedded default. This separation means binary users can upgrade without losing their settings, and source installers benefit from `custom/` being in `.gitignore`. The embedded [`conf/app.ini`](https://github.com/gogs/gogs/blob/main/conf/app.ini) contains every available option with detailed inline comments. Use it as your canonical reference. ### Overriding a value You only need to include the values you want to change. For example, to set a custom repository storage path and switch to production mode: ```ini RUN_MODE = prod [repository] ROOT = /home/git/gogs-repositories ``` Values support INI variable interpolation with the `%(KEY)s` syntax. The embedded defaults use this extensively, for example: ```ini EXTERNAL_URL = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/ ``` Values also support environment variable expansion, so you can reference system environment variables directly in your configuration: ```ini [database] PASSWORD = ${DATABASE_PASSWORD} ``` If a password or value contains special characters (like backticks or `#`), wrap it in backticks, e.g., PASSWORD = \`p@ss#word!\`. Gogs uses [go-ini/ini](https://ini.unknwon.io/) as the configuration library, please refer to its documentation for the full syntax specification including multi-line values, key/value separators, and section handling. ## The `custom/` directory The `custom/` directory is Gogs' extension point. It sits alongside the binary by default, and contains much more than just `app.ini`. ### Finding the path Run `gogs web --help` to see the custom directory path in the output. You can also override it: | Method | Example | |--------|---------| | Default | The `custom/` subdirectory next to the binary | | Environment variable | `GOGS_CUSTOM=/etc/gogs` | The work directory (parent of `custom/`) can also be overridden with `GOGS_WORK_DIR`. ### Specifying a custom config path Every Gogs subcommand accepts `-c, --config` to point to a configuration file at a non-default location: ```bash gogs web --config /etc/gogs/app.ini ``` ### What lives in `custom/` ``` custom/ ├── conf/ │ ├── app.ini # Your configuration overrides │ ├── auth.d/ # Authentication source files │ │ └── *.conf │ ├── gitignore/ # Custom .gitignore templates │ ├── license/ # Custom license templates │ ├── readme/ # Custom README templates │ ├── label/ # Custom issue label sets │ └── locale/ # Translation overrides │ └── locale_*.ini ├── templates/ # HTML template overrides ├── public/ # Static asset overrides (CSS, JS, images) └── robots.txt # Search engine crawling rules ``` All of these are optional. Gogs falls back to embedded defaults when a custom file does not exist. ## Repository templates Gogs ships with embedded templates used when creating new repositories: | Template type | Embedded location | |---------------|-------------------| | `.gitignore` | `conf/gitignore/` | | License | `conf/license/` | | README | `conf/readme/` | | Issue labels | `conf/label/` | You can add your own by placing files in the corresponding `custom/conf/` subdirectory. Custom files take priority over embedded ones with the same name, so you can also override built-in templates. For example, to add a custom `.gitignore` template that appears in the repository creation form: ``` custom/conf/gitignore/MyFramework ``` The `[repository] PREFERRED_LICENSES` option controls which licenses appear at the top of the selection list. The names must match filenames in `conf/license/` or `custom/conf/license/`. ## Custom templates and static assets You can override any of Gogs' HTML templates or static assets by mirroring the file structure under `custom/`. **Templates** -- Place files in `custom/templates/` matching the path of the [embedded template](https://github.com/gogs/gogs/tree/main/templates) you want to override. See [Custom templates](/advancing/custom-templates) for details. **Static assets** -- Place files in `custom/public/` to override CSS, JavaScript, or images. Custom public files are served with higher priority than embedded ones. **Locale overrides** -- Place `locale_*.ini` files in `custom/conf/locale/` to override translation strings for any supported language. ## Loading assets from disk By default, Gogs serves templates, locale files, and public assets from the binary's embedded data. If you set `LOAD_ASSETS_FROM_DISK = true` in `[server]`, Gogs will load them from the work directory instead. This is mainly useful during development.