{"id":24600879,"url":"https://github.com/jwodder/dotplate","last_synced_at":"2026-05-17T02:13:19.473Z","repository":{"id":272024926,"uuid":"915304651","full_name":"jwodder/dotplate","owner":"jwodder","description":"Yet another dotfile manager/templater","archived":false,"fork":false,"pushed_at":"2025-01-31T18:30:56.000Z","size":67,"stargazers_count":0,"open_issues_count":28,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-31T19:28:10.104Z","etag":null,"topics":["dotfiles","python","work-in-progress"],"latest_commit_sha":null,"homepage":"","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/jwodder.png","metadata":{"files":{"readme":"README.rst","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}},"created_at":"2025-01-11T14:03:02.000Z","updated_at":"2025-01-31T18:30:59.000Z","dependencies_parsed_at":"2025-01-11T15:20:30.021Z","dependency_job_id":"c0160887-7ff5-4d6f-b4d3-ad584aaa7d9d","html_url":"https://github.com/jwodder/dotplate","commit_stats":null,"previous_names":["jwodder/dotplate"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jwodder%2Fdotplate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jwodder%2Fdotplate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jwodder%2Fdotplate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jwodder%2Fdotplate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jwodder","download_url":"https://codeload.github.com/jwodder/dotplate/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244181013,"owners_count":20411600,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["dotfiles","python","work-in-progress"],"created_at":"2025-01-24T14:19:17.812Z","updated_at":"2026-05-17T02:13:14.448Z","avatar_url":"https://github.com/jwodder.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"|repostatus| |ci-status| |coverage| |license|\n\n.. |repostatus| image:: https://www.repostatus.org/badges/latest/wip.svg\n    :target: https://www.repostatus.org/#wip\n    :alt: Project Status: WIP — Initial development is in progress, but there\n          has not yet been a stable, usable release suitable for the public.\n\n.. |ci-status| image:: https://github.com/jwodder/dotplate/actions/workflows/test.yml/badge.svg\n    :target: https://github.com/jwodder/dotplate/actions/workflows/test.yml\n    :alt: CI Status\n\n.. |coverage| image:: https://codecov.io/gh/jwodder/dotplate/branch/main/graph/badge.svg\n    :target: https://codecov.io/gh/jwodder/dotplate\n\n.. |license| image:: https://img.shields.io/github/license/jwodder/dotplate.svg\n    :target: https://opensource.org/licenses/MIT\n    :alt: MIT License\n\n..\n    `GitHub \u003chttps://github.com/jwodder/dotplate\u003e`_\n    | `Documentation \u003chttps://dotplate.readthedocs.io\u003e`_\n    | `Issues \u003chttps://github.com/jwodder/dotplate/issues\u003e`_\n\n``dotplate`` is yet another dotfile manager/templater program and Python\nlibrary, written because I couldn't find one that already had the exact\nfeatures I wanted.\n\nFeatures\n========\n\n- Dotfiles are defined via Jinja_ templates, which are rendered and written to\n  either your home directory or another directory of your choice.\n\n- The templates are stored in a source directory with the same layout as the\n  installed dotfiles; e.g., a template at ``.config/foo/bar.toml`` in the\n  source directory will, when everything is installed in your home, end up\n  rendered \u0026 written to ``~/.config/foo/bar.toml``.\n\n- Files in the destination directory that do not correspond to a template are\n  ignored.\n\n- Templates are automatically discovered by traversing the source directory.\n  If the directory is tracked by Git, only committed files are recognized.\n\n- If a template has the executable bit set, the installed file will have the\n  executable bit set.\n\n- Templates can belong to one or more *suites*, groups of files that can be\n  enabled \u0026 disabled together.  A template in a suite will only be installed if\n  one of its suites is enabled on the command line.\n\n- The Jinja templates have access to a ``dotplate`` context variable containing\n  information about the local host and optional user-defined values.\n\n- Host-specific configuration (including setting custom values in the\n  ``dotplate`` context variable and enabling/disabling suites) can be read from\n  a file in a location of your choice.\n\n- Python library API\n\n- Not actually limited to dotfiles; can be used to template any tree of files\n\n.. _Jinja: https://jinja.palletsprojects.com\n\n\nInstallation\n============\n``dotplate`` requires Python 3.10 or higher.  Just use `pip\n\u003chttps://pip.pypa.io\u003e`_ for Python 3 (You have pip, right?) to install it::\n\n    python3 -m pip install git+https://github.com/jwodder/dotplate\n\n..\n    python3 -m pip install dotplate\n\n\nExample\n=======\n\nSetting up ``dotplate`` begins with creating a `TOML \u003chttps://toml.io\u003e`_\nconfiguration file named ``dotplate.toml``.  Here's an example:\n\n.. code:: toml\n\n    # The [core] table contains fundamental dotplate configuration.\n    [core]\n\n    # Path to the directory of template files, relative to the directory containing\n    # `dotplate.toml`.  Defaults to the current directory if not set.\n    #\n    # It's recommended that you either set this to \".\" (the current directory, if\n    # your templates are in the same directory as the config file) or else put your\n    # templates in a directory next to the config file and set `src` to the name of\n    # that directory.\n    src = \".\"\n\n    # (Required) Path to the directory where the rendered templates will be\n    # installed.  A leading tilde (~) will be replaced with the path to your home\n    # directory.\n    #\n    # This value can be overridden by the local config file or by the `--dest`\n    # command-line option.\n    dest = \"~\"\n\n    # Path to an optional secondary configuration file containing settings specific\n    # to the host that dotplate is run on.  If not set, no local config is read.\n    local-config = \"~/.config/dotplate/local.toml\"\n\n\n    # The [jinja] table contains configuration for the Jinja environment used to\n    # render the templates.  Most `jinja2.Environment` constructor arguments are\n    # supported; see the dotplate documentation for a full list.\n    [jinja]\n\n    # Here are some Jinja settings, set to their default values.  You may want to\n    # change these settings in particular if they clash with the syntax of the\n    # files you're templating.\n    block-start-string = \"{%\"\n    block-end-string = \"%}\"\n    variable-start-string = \"{{\"\n    variable-end-string = \"}}\"\n\n\n    # Suites are defined by [suite.SUITENAME] tables, like so:\n    [suites.my-suite]\n\n    # A list of templates files (relative to the src directory) that belong to this\n    # suite.  A template may belong to zero or more suites.  If a template belongs\n    # to one or more suites, it will only be installed if one or more of those\n    # suites are enabled.\n    files = [\n        \".config/mine/mine.cfg\",\n        \"bin/do-stuff\",\n    ]\n\n    # Whether to enable the suite by default.  If not set, the suite is not\n    # enabled.\n    enabled = true\n\n\n    # The [vars] table contains custom variables to include in the `dotplate`\n    # context variable provided to templates.  The variables set here can be\n    # overwritten \u0026 augmented by the [vars] table in the host-specific local\n    # configuration file, if any.\n    [vars]\n\n    # Now you can write `{{ dotplate.vars.editor }}` in templates, and it will\n    # be replaced by the string \"vim\" — unless you've set a different value in\n    # the local config.\n    editor = \"vim\"\n\n    additional_paths = [\n        \"$HOME/local/bin\",\n        \"$HOME/.cargo/bin\",\n    ]\n\nHere's an accompanying template for a simple ``~/.profile`` file, named (oddly\nenough) ``.profile``.  The template is located in the directory specified by\nthe ``core.src`` field in the configuration file.\n\n.. code:: bash\n\n    export PATH=\"$PATH:{{ dotplate.vars.additional_paths|join(\":\") }}\"\n    export EDITOR={{ dotplate.vars.editor }}\n\nWith these files, running ``dotplate install`` in the directory where the\n``dotplate.toml`` file is located will replace the contents of your\n``~/.profile`` file with:\n\n.. code:: bash\n\n    export PATH=\"$PATH:$HOME/local/bin:$HOME/.cargo/bin\"\n    export EDITOR=vim\n\nDon't worry, the original ``~/.profile`` is backed up at\n``~/.profile.dotplate.bak``.  If you just want to test out the template by\ninstalling to a temporary directory instead, run ``dotplate --dest\npath/to/temp/dir install``.\n\n..\n    See `the dotplate documentation \u003cDocumentation_\u003e`_ for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjwodder%2Fdotplate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjwodder%2Fdotplate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjwodder%2Fdotplate/lists"}