{"id":39745097,"url":"https://github.com/ologio/symconf","last_synced_at":"2026-01-18T11:19:35.129Z","repository":{"id":234588910,"uuid":"789197652","full_name":"ologio/symconf","owner":"ologio","description":"General-purpose local application configuration manager","archived":false,"fork":false,"pushed_at":"2025-12-20T02:16:37.000Z","size":13917,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-12-22T11:47:55.128Z","etag":null,"topics":["configuration-files","dotfiles","fzf","installer","kitty","rofi","shell","sway","template-engine","theme-switcher","waybar"],"latest_commit_sha":null,"homepage":"https://doc.olog.io/symconf","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ologio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-04-19T22:51:58.000Z","updated_at":"2025-12-20T02:16:41.000Z","dependencies_parsed_at":"2024-08-11T07:42:57.787Z","dependency_job_id":"850408d6-728a-4cbd-86aa-f8ee14b4d6a8","html_url":"https://github.com/ologio/symconf","commit_stats":null,"previous_names":["ologio/autoconf","ologio/symconf"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/ologio/symconf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ologio%2Fsymconf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ologio%2Fsymconf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ologio%2Fsymconf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ologio%2Fsymconf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ologio","download_url":"https://codeload.github.com/ologio/symconf/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ologio%2Fsymconf/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28535161,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T10:13:46.436Z","status":"ssl_error","status_checked_at":"2026-01-18T10:13:11.045Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["configuration-files","dotfiles","fzf","installer","kitty","rofi","shell","sway","template-engine","theme-switcher","waybar"],"created_at":"2026-01-18T11:19:33.777Z","updated_at":"2026-01-18T11:19:35.118Z","avatar_url":"https://github.com/ologio.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Symconf\n`symconf` is a CLI tool for managing local application configuration. It\nimplements a general model that supports dynamically switching/reloading themes\nfor any application, and provides a basic means of templatizing your config\nfiles.\n\n## Simple example\nBelow is a simple example demonstrating two system-wide theme switches:\n\n![Simple example](docs/_static/example.gif)\n\nThis GIF shows two `symconf` calls, the first of which applies a `gruvbox` dark\ntheme and the second a dark [`monobiome`][1] variant. Each call (of the form\n`symconf config -m dark -s style`) indicates a dark mode preference and a\nparticular color palette that should be used when populating config file\ntemplates. Specifically, in this example, invoking `symconf` results in the\nfollowing app-specific config updates:\n\n- **GTK**: reacts to the mode setting and sets `prefer-dark` system-wide,\n  changing general GTK-responsive applications like Nautilus and Firefox (and\n  subsequently websites that are responsive to `prefers-color-scheme`)\n- **kitty**: theme template is re-generated using the specified palette, and\n  `kitty` processes are sent a message to live-reload the new config file\n- **neovim**: a `vim` theme file (along with a statusline theme) is generated\n  from the chosen palette, and running instances of `neovim` are sent a message\n  to re-source this theme (via `nvim --remote-send`)\n- **waybar**: bar styles are updated to match the mode setting\n- **sway**: the background color and window borders are dynamically set to base\n  palette colors, and `swaymsg reload` is called\n- **fzf**: a palette-dependent theme is re-generated and re-exported\n- **rofi**: launcher text and highlight colors are set according to the mode\n  and palette, applying on next invocation\n\nThis example highlights the generality of `symconf`, and so long as an app's\nconfig can be reloaded dynamically, you can use a single `symconf` call to\napply themes for an arbitrary number of apps at once.\n\n# Behavior\n`symconf` uses a simple operational model that symlinks centralized config\nfiles to their expected locations across the system. This central config\ndirectory can then be version controlled, and app config files can be updated\nin one place.\n\nApp config files can either be concrete (fully-specified) or templates (to be\npopulated by values conditional on style, e.g., a palette). When `symconf` is\nexecuted with a particular mode preference (dark or light) and a style (any\nother indicator of thematic elements, often simply in the form of a palette\nlike `solarized` or `gruvbox`), it searches for both concrete and template\nconfig files that match and symlinks them to registered locations. When\nnecessary, `symconf` will also match and execute scripts to reload apps after\nupdating their configuration.\n\nYou can find more details on how `symconf`'s matching scheme works in\n[Matching](docs/reference/matching.md).\n\n# Configuring\nBefore using, you must first set up your config directory to house your config\nfiles and give `symconf` something to act on. See\n[Configuring](docs/reference/configuring.md) for details.\n\n# Installation\nThe recommended way to install `symconf` is via `uv`'s \"tool\" subsystem, which\nis well-suited for managing Python packages meant to be used as CLI programs.\nWith `uv` on your system, you can install with\n\n```sh\nuv tool install symconf\n```\n\nAlternatively, you can use `pipx` to similar effect:\n\n```sh\npipx install symconf\n```\n\nYou can also install via `pip`, or clone and install locally.\n\n# Usage\n- `-h --help`: print help message\n- `-c --config-dir`: set the location of the `symconf` config directory\n- `symconf config` is the subcommand used to match and set available config\n  files for registered applications\n  * `-a --apps`: comma-separate list of registered apps, or `\"*\"` (default) to\n    consider all registered apps.\n  * `-m --mode`: preferred lightness mode/scheme, either `light`, `dark`,\n    `any`, or `none`.\n  * `-s --style`: style indicator, often the name of a color palette, capturing\n    thematic details in a config file to be matched. `any` or `none` are\n    reserved keywords (see below).\n  * `-T --template-vars`: additional groups to use when populating templates,\n    in the form `\u003cgroup\u003e=\u003cvalue\u003e`, where `\u003cgroup\u003e` is a template group with a\n    folder `$CONFIG_HOME/groups/\u003cgroup\u003e/` and `\u003cvalue\u003e` should correspond to a\n    TOML file in this folder (i.e., `\u003cvalue\u003e.toml`).\n- `symconf generate` is a subcommand that can be used for batch generation of\n  config files. It accepts the same arguments as `symconf config`, but rather\n  than selecting the best match to be used for the system setting, all matching\n  templates are generated. There is one additional required argument:\n  * `-o --output-dir`: the directory under which generated config files should\n    be written. App-specific subdirectories are created to house config files\n    for each provided app.\n- `symconf install`: runs install scripts for matching apps that specify one\n  * `-a --apps`: comma-separate list of registered apps, or `\"*\"` (default) to\n    consider all registered apps.\n- `symconf update`: runs update scripts for matching apps that specify one\n  * `-a --apps`: comma-separate list of registered apps, or `\"*\"` (default) to\n    consider all registered apps.\n\nThe keywords `any` and `none` can be used when specifying `--mode`, `--style`,\nor as a value in `--template-vars` (and we refer to each of these variables as\n_factors_ that help determine a config match):\n\n- `any` will match config files with _any_ value for this factor, preferring\n  config files with a value `none`, indicating no dependence on the factor.\n  This is the default value when a factor is left unspecified.\n- `none` will match `\"none\"` directly for a given factor (so no special\n  behavior), but used to indicate that a config file is independent of the\n  factor. For instance,\n\n  ```sh\n  symconf config -m light -s none\n  ```\n\n  will match config files that capture the notion of a light mode, but do not\n  depend on or provide further thematic components such as a color palette.\n\n## Examples\n- Set a dark mode for all registered apps, matching any available style/palette\n  component:\n\n  ```sh\n  symconf config -m dark\n  ```\n- Set `solarized` theme for `kitty` and match any available mode (light or\n  dark):\n\n  ```sh\n  symconf config -s solarized -a kitty\n  ```\n- Set a dark `gruvbox` theme for multiple apps (but not all):\n\n  ```sh\n  symconf config -m dark -s gruvbox -apps=\"kitty,nvim\"\n  ```\n- Set a dark `gruvbox` theme for all apps, and attempt to match other template\n  elements:\n\n  ```sh\n  symconf config -m dark -s gruvbox -T font=mono window=sharp\n  ```\n\n  which would attempt to find and load key-value pairs in the files\n  `$CONFIG_HOME/groups/font/mono.toml` and\n  `$CONFIG_HOME/groups/window/sharp.toml` to be used as values when filling\n  templatized config files.\n\n\n[1]: https://github.com/ologio/monobiome\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fologio%2Fsymconf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fologio%2Fsymconf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fologio%2Fsymconf/lists"}