<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>tenrok.nl</title><description>A minimal personal blog.</description><link>https://blog.tenrok.nl/</link><item><title>Mastering Bash History and Expansion</title><link>https://blog.tenrok.nl/blog/how-to-use-the-bash-history-command/</link><guid isPermaLink="true">https://blog.tenrok.nl/blog/how-to-use-the-bash-history-command/</guid><description>How Bash&apos;s history builtin actually works — syncing sessions, .bashrc tuning, and expansion shortcuts like !! and !$.</description><pubDate>Wed, 09 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;History is a Bash builtin command that allows you to view, modify, and delete bash commands that have been run on the system.&lt;/p&gt;
&lt;h2 id=&quot;problem-it-solves&quot;&gt;Problem it solves&lt;/h2&gt;
&lt;p&gt;When you work a lot from the command shell, you probably make a lot of typos or need to re-run commands repeatedly. Bash history gives the possibility to view, modify, and delete previously used commands.&lt;/p&gt;
&lt;h2 id=&quot;how-it-works&quot;&gt;How it works&lt;/h2&gt;
&lt;p&gt;You can check this by running the following command:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# running &apos;which history&apos; for me doesn&apos;t show any output (It can different output on other systems)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;which&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; history&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# when typing `type history` it will tell you that the command is a shell builtin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; history&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; history is a shell builtin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When a new session starts, the history file is loaded and new lines are stored in the current session’s memory. When the session is closed the list is written to disk. By default Bash uses the file &lt;code&gt;~/.bash_history&lt;/code&gt; to save the history to disk. The file will be overwritten by default. To append new lines you have to add the follow line to your &lt;code&gt;.bashrc&lt;/code&gt; file &lt;code&gt;shopt -s histappend&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can configure a custom file by adding &lt;code&gt;HISTFILE&lt;/code&gt; variable in &lt;code&gt;.bashrc&lt;/code&gt; using the &lt;code&gt;HISTFILE&lt;/code&gt; setting.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you work a lot in different sessions, for example when you use &lt;code&gt;tmux&lt;/code&gt;, the history is not synchronized, because the history lives in memory of the session. You can use the special variable &lt;code&gt;PROMPT_COMMAND&lt;/code&gt; to append and load history lines from the history file after each command. To write lines directly to file you can add the following line to your &lt;code&gt;.bashrc&lt;/code&gt; &lt;code&gt;PROMPT_COMMAND=&quot;history -a; $PROMPT_COMMAND&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why adding the $PROMPT_COMMAND at the end of the command?&lt;/strong&gt;
This is to preserve everything already in the $PROMPT_COMMAND variable. If you don’t add this to the command, everything already in $PROMPT_COMMAND will be replaced by &lt;code&gt;history -a;&lt;/code&gt; and this can break other stuff.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;PROMPT_COMMAND&lt;/code&gt; is a special variable that runs every time before bash prints your prompt. So by starting bash or after running a command bash creates a new prompt. All the content within the variable will be run.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Extend the prompt command with &lt;code&gt;history -n;&lt;/code&gt; so new commands added from another session are automatically added to your current session’s history.&lt;/p&gt;
&lt;p&gt;Below is an example of &lt;code&gt;.bashrc&lt;/code&gt; with custom history settings:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# don&apos;t put duplicate lines or lines starting with space in the history.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;HISTCONTROL&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;ignoreboth&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# append to the history file, don&apos;t overwrite it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;shopt&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; histappend&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# setting history length&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;HISTSIZE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;1000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;HISTFILESIZE&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;2000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;shopt&lt;/code&gt; is another bash builtin used to enable and disable bash specific extensions. There are a few extensions available for the history. for example you can enable &lt;code&gt;histverify&lt;/code&gt; to let you review the command before running.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The follow shortcuts work with the history directly from the prompt:&lt;/p&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Bash history shortcuts&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;arrow up&lt;/td&gt;&lt;td&gt;go up through your sessions history&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;arrow down&lt;/td&gt;&lt;td&gt;go down through the sessions history&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ctrl+R&lt;/td&gt;&lt;td&gt;search through the sessions history&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Frequently used &lt;code&gt;history&lt;/code&gt; commands are:&lt;/p&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Bash history command&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;history -a&lt;/td&gt;&lt;td&gt;Append the session history to the history file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;history -w&lt;/td&gt;&lt;td&gt;Overwrite the current session history to the history file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;history -r&lt;/td&gt;&lt;td&gt;Read the history file into the current session’s memory&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;history -n&lt;/td&gt;&lt;td&gt;Read only new lines and add them to the session’s memory&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;history -c&lt;/td&gt;&lt;td&gt;Clears the session memory list (not the file)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;history -cw&lt;/td&gt;&lt;td&gt;Clears the session memory and write to file (clears the file also)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;history [n]&lt;/td&gt;&lt;td&gt;Shows the last [n] commands&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;history -d offset&lt;/td&gt;&lt;td&gt;Removes lines [offset] from the list&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;history-expansion&quot;&gt;History expansion&lt;/h2&gt;
&lt;p&gt;With &lt;code&gt;history expansion&lt;/code&gt; you can reference and reuse previous commands using the &lt;code&gt;!&lt;/code&gt; expanding the command before it is executed.&lt;/p&gt;
&lt;p&gt;A few examples are:&lt;/p&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Bash history expansion command&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;!!&lt;/code&gt;&lt;/td&gt;&lt;td&gt;the previous command in history&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;!N&lt;/code&gt;&lt;/td&gt;&lt;td&gt;number N in history&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;!-N&lt;/code&gt;&lt;/td&gt;&lt;td&gt;the N-th command back from now&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;!ping&lt;/code&gt;&lt;/td&gt;&lt;td&gt;the most recent command starting with “ping”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;!$&lt;/code&gt;&lt;/td&gt;&lt;td&gt;the last &lt;strong&gt;argument&lt;/strong&gt; of the previous command&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;!^&lt;/code&gt;&lt;/td&gt;&lt;td&gt;the first argument of the previous command&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;!*&lt;/code&gt;&lt;/td&gt;&lt;td&gt;all arguments of the previous command&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; history&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Output&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  clear&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  echo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Hello World!&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    3&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  echo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Hello to the World!&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    4&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  echo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Hello to the World!&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; world.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    5&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  history&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Hello World!&quot;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt; # expands to: echo &quot;Hello World!&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# output&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Hello&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; World!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;when-id-reach-for-it&quot;&gt;When I’d reach for it&lt;/h2&gt;
&lt;p&gt;Because I work a lot in the shell I constantly fall back to my history.&lt;/p&gt;
&lt;h2 id=&quot;gotchas&quot;&gt;Gotchas&lt;/h2&gt;
&lt;p&gt;When requesting the man page for &lt;code&gt;history&lt;/code&gt; I was a bit thrown off at first because it returned a detailed man page. This is actually the &lt;code&gt;library functions&lt;/code&gt; used by programmers. For example Bash is using this library for there &lt;code&gt;history&lt;/code&gt; implementation.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# when typing `type history` it will tell you that the command is a shell builtin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; history&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; history is a shell builtin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To find the history documentation for bash you have to search through the man pages of bash itself.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# open the man pages for bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;man&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# use / to search for patterns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;/HISTORY&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# use n to continue to the next&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;key-takeaway&quot;&gt;Key takeaway&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;history&lt;/code&gt; and &lt;code&gt;history expansion&lt;/code&gt; commands are tools that if you master the basics, it helps to be more productive and work faster on the shell. It is a quick way to reuse, and even manipulate previous commands to your benefits.&lt;/p&gt;</content:encoded></item><item><title>Dev Container fundamentals</title><link>https://blog.tenrok.nl/blog/dev-container-fundamentals/</link><guid isPermaLink="true">https://blog.tenrok.nl/blog/dev-container-fundamentals/</guid><description>My journey learning Dev containers</description><pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A Dev container gives you the possibility to run a container as a fully functional development environment, with all the features it needs. You can use a Dev container to run an application, different tools, libraries or runtimes you need for running a codebase.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;library&lt;/code&gt; is code that is already written by somebody, and contains functions. From your code you call the functions from the library.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Runtime&lt;/code&gt;provides the environment the program needs to execute.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;codebase&lt;/code&gt; is the project containing all the code, configuration files and related assets.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Dev container specification is built to provide rules of how to set up the Dev container, and extends with configuration files like the Dockerfile.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Specification&lt;/code&gt; is the rules. It describes what something should be or do.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;problem-it-solves&quot;&gt;Problem it solves&lt;/h2&gt;
&lt;p&gt;Before containers were used, developers worked directly on their local machine when developing code. At a certain time each developer’s machine is different, has different tools installed, uses different versions and has different settings.&lt;/p&gt;
&lt;p&gt;When another developer needs to check the code, or needs to work on the same codebase this can be a pain in the ass to set the environment up on their local machine, installing all the tools necessary, and fixing any compatibility errors due to multiple overlapping versions of libraries and runtimes or even a different OS.&lt;/p&gt;
&lt;p&gt;With Dev Containers you can specify a container environment with all the necessary tools, libraries and runtime to run, and work on the codebase and provide an instruction to start up the dev container.&lt;/p&gt;
&lt;p&gt;Because devcontainer.json can be used by the devcontainer CLI in CI pipelines, you can run the exact same environment for automatic tests, for example with GitHub Actions. This tight integration between local dev and CI makes it easy to ship small changes multiple times a day, instead of working alone for weeks and pushing one large commit that causes conflicts and bugs.&lt;/p&gt;
&lt;h2 id=&quot;how-it-works&quot;&gt;How it works&lt;/h2&gt;
&lt;p&gt;To run a container you need a container runtime, like Docker, and a Dev container runtime like VSCode or DevPod.&lt;/p&gt;
&lt;p&gt;To set up a &lt;code&gt;devcontainer.json&lt;/code&gt; you can do this for example through VSCode.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install VSCode&lt;/li&gt;
&lt;li&gt;Install the VSCode extension &lt;code&gt;Dev Containers&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To create a Dev container:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Type in the search bar &lt;code&gt;&gt; Dev Container: New Dev Container&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Select a container image from the list, for example &lt;code&gt;python 3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;Create Dev Container python&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;VSCode will now start to create the Dev container for you. When the Dev container is created it will automatically connect to it. You are now working directly in the container.&lt;/p&gt;
&lt;p&gt;In the background the extension creates a devcontainer.json file in the .devcontainer folder inside the project folder.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// For format details, see https://aka.ms/devcontainer.json. For config options, see the&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// README at: https://github.com/devcontainers/templates/tree/main/src/python&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Python 3&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;image&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;mcr.microsoft.com/devcontainers/python:3-3.14-trixie&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // Features to add to the dev container. More info: https://containers.dev/features.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // &quot;features&quot;: {},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // Use &apos;forwardPorts&apos; to make a list of ports inside the container available locally.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // &quot;forwardPorts&quot;: [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // Use &apos;postCreateCommand&apos; to run commands after the container is created.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // &quot;postCreateCommand&quot;: &quot;pip3 install --user -r requirements.txt&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // Configure tool-specific properties.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // &quot;customizations&quot;: {},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // &quot;remoteUser&quot;: &quot;root&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the above example the image will be built based on the &lt;code&gt;image&lt;/code&gt; specified. In this case &lt;code&gt;mcr.microsoft.com/devcontainers/python:3-3.14-trixie&lt;/code&gt;. After the image is built the container will be created and the provided settings will be applied to the container.&lt;/p&gt;
&lt;p&gt;For example you can add tools you want to install into the Dev container by adding them to the features section.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some containers already have features installed in the images. You can see the images and specifications on &lt;a href=&quot;https://github.com/devcontainers/images/tree/main/src/&quot;&gt;https://github.com/devcontainers/images/tree/main/src/&lt;/a&gt;. &lt;code&gt;python:3-3.14-trixie &lt;/code&gt;for example already includes node, git and zsh.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Because you run the Dev container with VSCode, it will install a version of &lt;code&gt;Visual Studio Code Server&lt;/code&gt; into the remote container so you can connect your local VSCode to the Dev container to work on code.&lt;/p&gt;
&lt;p&gt;You can also create the necessary files yourself. When VSCode detects them in your project folder it will ask to build or start the Dev container.&lt;/p&gt;
&lt;h3 id=&quot;creating-the-devcontainerjson-only&quot;&gt;Creating the devcontainer.json only&lt;/h3&gt;
&lt;p&gt;With VSCode you also can create the necessary devcontainer.json file only.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&gt; Dev Container: Add Container Configuration Files..&lt;/code&gt; to only create the devcontainer.json&lt;/li&gt;
&lt;li&gt;Choose to add the configuration to the workspace&lt;/li&gt;
&lt;li&gt;Select the image you like to use (I used PowerShell for this example)&lt;/li&gt;
&lt;li&gt;Add some features if you like, for example the &lt;code&gt;Azure CLI&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;VSCode will create the configuration file&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// For format details, see https://aka.ms/devcontainer.json. For config options, see the&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// README at: https://github.com/devcontainers/templates/tree/main/src/powershell&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;PowerShell&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;image&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;mcr.microsoft.com/powershell:lts-debian-11&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;features&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;ghcr.io/devcontainers/features/common-utils:2&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;installZsh&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;username&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;vscode&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;upgradePackages&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;nonFreePackages&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;ghcr.io/devcontainers/features/azure-cli:1&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;installBicep&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;version&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;latest&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;bicepVersion&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;latest&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;postCreateCommand&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;sudo chsh vscode -s &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;$(which pwsh)&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // Configure tool-specific properties.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;customizations&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // Configure properties specific to VS Code.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;vscode&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;      // Set *default* container specific settings.json values on container create.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;settings&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;terminal.integrated.defaultProfile.linux&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;pwsh&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;      // Add the IDs of extensions you want installed when the container is created.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;      &quot;extensions&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;ms-vscode.powershell&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // Use &apos;forwardPorts&apos; to make a list of ports inside the container available locally.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // &quot;forwardPorts&quot;: [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // &quot;remoteUser&quot;: &quot;root&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;After creating the configuration VSCode will detect the configuration file and ask to reopen in a Dev container.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When the container is created the following will happen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The image will be built from &lt;code&gt;mcr.microsoft.com/powershell:lts-debian-11&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The configuration specifies &lt;code&gt;common-utils&lt;/code&gt; to install zsh, set up a non-root user.&lt;/li&gt;
&lt;li&gt;The following features will be installed:
&lt;ul&gt;
&lt;li&gt;Zsh&lt;/li&gt;
&lt;li&gt;azure-cli, with Bicep&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;After the container is built the &lt;code&gt;postCreateCommand&lt;/code&gt; will run. In this case it will run the command &lt;code&gt;sudo chsh vscode -s \&quot;$(which pwsh)\&quot;&lt;/code&gt;. This command will change the shell for the user VSCode to whatever returns from the command &lt;code&gt;which pwsh&lt;/code&gt;, which in our case will be the location of the PowerShell shell.&lt;/li&gt;
&lt;li&gt;In the customizations property some VSCode PowerShell settings will be applied, like installing the PowerShell extension.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;More info about common-utils can be found on &lt;a href=&quot;https://github.com/devcontainers/features/tree/main/src/common-utils&quot;&gt;https://github.com/devcontainers/features/tree/main/src/common-utils&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;when-id-reach-for-it&quot;&gt;When I’d reach for it&lt;/h2&gt;
&lt;p&gt;I will reach for Dev Containers anytime I’m in need of a clean or pre-configured development environment, when I try out some new features or want to develop some PowerShell scripts.
Dev containers make it also possible to work on my project regardless of the machines I’m using.&lt;/p&gt;
&lt;h2 id=&quot;how-it-compares-to-nixos&quot;&gt;How it compares to NixOS&lt;/h2&gt;
&lt;p&gt;NixOS provides a &lt;code&gt;Nix&lt;/code&gt; package manager that installs each package on a separate, hash-addressed path and uses that to build an environment with symlinks and references to the exact versions you declare. It runs on your own system.&lt;/p&gt;
&lt;p&gt;There is also a NixOS distribution you can run your machine on. This will give you the possibility to make your whole machine reproducible.&lt;/p&gt;
&lt;p&gt;So where Nix provides you with a development environment by changing your shell and environment variables, Dev Containers provide you with a whole isolated dev environment running in a container and different Linux versions, therefore Dev Containers will give you some more overhead due to image sizes.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Dev Container website &lt;a href=&quot;https://containers.dev/&quot;&gt;https://containers.dev/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Image location managed by Microsoft &lt;a href=&quot;https://github.com/devcontainers/images&quot;&gt;https://github.com/devcontainers/images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Details of the common-utils &lt;a href=&quot;https://github.com/devcontainers/features/tree/main/src/common-utils&quot;&gt;https://github.com/devcontainers/features/tree/main/src/common-utils&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>How to setup my DevContainers using DevPod - Chezmoi and Mise</title><link>https://blog.tenrok.nl/blog/how-to-setup-my-devcontainers-using-devpod---chezmoi-and-mise/</link><guid isPermaLink="true">https://blog.tenrok.nl/blog/how-to-setup-my-devcontainers-using-devpod---chezmoi-and-mise/</guid><description>My journey learning DevPod, Chezmoi and Mise by setting up my dotfiles and tools for my DevPods.</description><pubDate>Fri, 21 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Prerequisites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Container runtime (like docker)&lt;/li&gt;
&lt;li&gt;IDE (vscode, vim, etc.)&lt;/li&gt;
&lt;li&gt;Project folder with your Devcontainer project files&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;install-devpod&quot;&gt;Install DevPod&lt;/h2&gt;
&lt;p&gt;First install &lt;code&gt;devpod&lt;/code&gt; on your machine.&lt;/p&gt;
&lt;p class=&quot;code-title&quot;&gt;Install DevPod&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -L&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; devpod&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;https://github.com/loft-sh/devpod/releases/latest/download/devpod-linux-amd64&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;#x26;&amp;#x26; &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -c&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0755&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; devpod&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /usr/local/bin&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;#x26;&amp;#x26; &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;rm&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -f&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; devpod&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This command:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Downloads the latest devpod binary to a file named &lt;code&gt;devpod&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;#x26;&amp;#x26; sudo install&lt;/code&gt; extends the curl command with &lt;code&gt;install&lt;/code&gt; to install the downloaded binary&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-c&lt;/code&gt; is ignored (not sure why it is in here)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-m&lt;/code&gt; accepts permissions mode as chmod&lt;/li&gt;
&lt;li&gt;&lt;code&gt;devpod&lt;/code&gt; the source binary to install&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usr/local/bin&lt;/code&gt; the install location&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;#x26;&amp;#x26; rm&lt;/code&gt; extends the install command wit &lt;code&gt;rm&lt;/code&gt; to remove the downloaded binary&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-f devpod&lt;/code&gt; removes the &lt;code&gt;file&lt;/code&gt; named &lt;code&gt;devpod&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check the installation:&lt;/p&gt;
&lt;p class=&quot;code-title&quot;&gt;Verify the installation&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# use the which command to check if the installation is successful&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;which&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; devpod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# outputs the location of the binary&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;/usr/local/bin/devpod&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;DevPod works with providers. A provider is the runtime where you want to run your pods. This provider is personal to you, and DevPod provides the ability to use the devcontainers on different environments.&lt;/p&gt;
&lt;h2 id=&quot;setup-devpod&quot;&gt;Setup DevPod&lt;/h2&gt;
&lt;p&gt;To setup the DevPod installation for the first time you have to set a provider.&lt;/p&gt;
&lt;p class=&quot;code-title&quot;&gt;Add and select the docker provider&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# add the docker provider&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;devpod&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; provider&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; docker&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# set the docker provider as default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;devpod&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; provider&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; use&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; docker&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Adding a provider will add a &lt;code&gt;provider.json&lt;/code&gt; file in &lt;code&gt;.devpod/contexts/defaults/providers/docker&lt;/code&gt;. A provider is a CLI program that lets DevPod communicate with the specific engine to manage the devcontainers.&lt;/p&gt;
&lt;h2 id=&quot;setup-the-devcontainer-files-to-include-mise&quot;&gt;Setup the devcontainer files to include mise&lt;/h2&gt;
&lt;p&gt;Include Mise into our devcontainer setup. This will ensure that all the tools needed for the project are installed when the container is created.&lt;/p&gt;
&lt;p&gt;These are specific settings and tools for this project. The configuration files lives within the project folder.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Chezmoi will also install Mise. The difference is that Mise installed by the devcontainer setup will install all the tools specific to this devcontainer. It looks at the &lt;code&gt;/workspace/project/mise.toml&lt;/code&gt; file, whereas Chezmoi will install the &lt;code&gt;.config/mise/config.toml&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The following files are used in this setup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;devcontainer/.devcontainer.json&lt;/li&gt;
&lt;li&gt;devcontainer/Dockerfile&lt;/li&gt;
&lt;li&gt;scripts/setup&lt;/li&gt;
&lt;li&gt;mise.toml&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;code-title&quot;&gt;.devcontainer.json&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;build&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;context&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;..&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;dockerfile&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Dockerfile&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;postCreateCommand&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;scripts/setup&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What this file does:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;build&lt;/code&gt; within the build property you tell to use a Dockerfile as content to build the container.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;context&quot;: &quot;..&quot;,&lt;/code&gt; is the relative path to the .devcontainer.json where the dockerbuild should be run from.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;dockerfile&quot;: &quot;Dockerfile&quot;&lt;/code&gt; is the location of the Dockerfile, relative to the &lt;code&gt;devcontainer.json&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;postCreateCommand&quot;&lt;/code&gt; runs once the container is created, and this will run &lt;code&gt;scripts/setup&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;It is still possible to install extensions or variables through the &lt;code&gt;.devcontainer.json&lt;/code&gt; if necessary.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p class=&quot;code-title&quot;&gt;.devcontainer/Dockerfile&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; mcr.microsoft.com/devcontainers/base:ubuntu-24.04&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; --from=jdxcode/mise /usr/local/bin/mise /usr/local/bin/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# make sure mise is activated in both zsh and bash. Might be overridden by a user&apos;s dotfiles.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; echo &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;eval &quot;$(mise activate bash)&quot;&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &gt;&gt; /home/vscode/.bashrc &amp;#x26;&amp;#x26; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    echo &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&apos;eval &quot;$(mise activate zsh)&quot;&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &gt;&gt; /home/vscode/.zshrc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What this file does:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FROM&lt;/code&gt; the image to be loaded&lt;/li&gt;
&lt;li&gt;&lt;code&gt;COPY&lt;/code&gt; copies a file, in this case from another container &lt;code&gt;--from=jdxcode/mise&lt;/code&gt; and copies the file &lt;code&gt;/usr/local/bin/mise&lt;/code&gt; from this container to &lt;code&gt;/usr/local/bin/&lt;/code&gt; into the container.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RUN echo&lt;/code&gt; to put values into the &lt;code&gt;.bashrc&lt;/code&gt; and &lt;code&gt;.zshrc&lt;/code&gt; dotfiles&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;code-title&quot;&gt;mise.toml&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tools&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;bat = &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;latest&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;kubectl = &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;latest&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;vim = &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;latest&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What this file does:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[tools]&lt;/code&gt; tells mise to install the following tools&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bat = &quot;latest&quot;&lt;/code&gt; tells mise to install bat, with the version latest&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;code-title&quot;&gt;scripts/setup&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;/usr/local/bin/mise&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; trust&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /workspaces/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$DEVPOD_WORKSPACE_ID&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/mise.toml&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;#x26;&amp;#x26; &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;/usr/local/bin/mise&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What this script does:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#!/bin/bash&lt;/code&gt; set the shell to run with&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usr/local/bin/mise trust /workspaces/$DEVPOD_WORKSPACE_ID/mise.toml&lt;/code&gt; runs mise with the trust command to trust the mise.toml file.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;#x26;&amp;#x26; /usr/local/bin/mise install&lt;/code&gt; extends the script by running mise install using the &lt;code&gt;mise.toml&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$DEVPOD_WORKSPACE_ID&lt;/code&gt; contains the name of the project/folder the DevPod up . command is started from.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;For example when you run &lt;code&gt;DevPod up . &lt;/code&gt; from a project folder named &lt;code&gt;test-code&lt;/code&gt; the Workspace will be called &lt;code&gt;test-code&lt;/code&gt; and the variable &lt;code&gt;$DEVPOD_WORKSPACE_ID&lt;/code&gt; will be set to &lt;code&gt;test-code&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;building-the-project&quot;&gt;Building the project&lt;/h2&gt;
&lt;p&gt;Run the following command in the directory of the project to start the devcontainer.&lt;/p&gt;
&lt;p class=&quot;code-title&quot;&gt;Build and start the devcontainer&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;devpod&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; up&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --ide&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; none&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --dotfiles&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://github.com/jackykornet/dotfiles.git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What this command does:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;devpod up .&lt;/code&gt; start the devpod from the current directory (should be in the project folder)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--ide none&lt;/code&gt; the ide to use. Use none for Vim.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--dotfiles https://github.com/jackykornet/dotfiles.git&lt;/code&gt; the dotfiles git repo. This repo will be pulled in to the DevContainer to use.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;When you choose another IDE, additional tools will be installed during the build.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When the DevPod starts, the dotfiles are pulled to the container into the &lt;code&gt;~/dotfiles&lt;/code&gt; directory, and it looks for a setup script to run. In my case I have a &lt;code&gt;setup&lt;/code&gt; file in the root of my repo. The build process finds this file and executes it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The setup file needs to be made executable beforehand &lt;code&gt;chmod +x setup&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In the setup file you can link dotfiles or do other stuff, like installing software. I’m going to use Chezmoi to manage the dotfile configuration. For this we have to add the following code to the setup script.&lt;/p&gt;
&lt;p class=&quot;code-title&quot;&gt;setup&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -euo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pipefail&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; command&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -v&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; chezmoi&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/dev/null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    sh&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -c&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;$(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fsLS&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get.chezmoi.io)&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; init&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --apply&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://github.com/jackykornet/dotfiles.git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;exit&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What does this command do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#!/bin/bash&lt;/code&gt; run with bash&lt;/li&gt;
&lt;li&gt;&lt;code&gt;set -euo pipefail&lt;/code&gt; The return code of any command in a pipeline that fails will be used as the return code of the whole pipeline, not just the last.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;if ! command -v chezmoi &gt;/dev/null&lt;/code&gt; checks if chezmoi is installed (echo $? will return 1 if not and the if statement fails)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sh -c &quot;$(curl -fsLS get.chezmoi.io)&quot; -- init --apply&lt;/code&gt; &lt;a href=&quot;https://github.com/jackykornet/dotfiles.git&quot;&gt;https://github.com/jackykornet/dotfiles.git&lt;/a&gt; installs chezmoi, initiates a new repo, pulls my dotfiles repo and applies the changes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exit 0&lt;/code&gt; exit 0 if no pipefail exists&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See the linked blogpost for the Chezmoi setup.&lt;/p&gt;
&lt;h2 id=&quot;the-deployment-process&quot;&gt;The deployment process&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;devpod up .&lt;/code&gt; starts up the devpod based on the &lt;code&gt;Devcontainer.json&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;After the container is created it will run the postCreateCommand
&lt;ul&gt;
&lt;li&gt;Installs mise into the workspace
&lt;ul&gt;
&lt;li&gt;Install tools in &lt;code&gt;workspace/mise.toml&lt;/code&gt; in to the workspace&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Copies dotfiles to the container&lt;/li&gt;
&lt;li&gt;Runs the &lt;code&gt;setup&lt;/code&gt; script
&lt;ul&gt;
&lt;li&gt;Installs &lt;code&gt;Chezmoi&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Downloads the dotfiles&lt;/li&gt;
&lt;li&gt;Setup dotfiles&lt;/li&gt;
&lt;li&gt;Install Mise
&lt;ul&gt;
&lt;li&gt;Install tools into the container image&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Different tool versions can be available to you based on the folder you are in.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt=&quot;The DevPod deployment process, showing devpod up starting the container, running the postCreateCommand to install Mise and tools, copying dotfiles, and running the setup script to install Chezmoi and its tools&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;535&quot; height=&quot;685&quot; src=&quot;https://blog.tenrok.nl/_astro/devpod-deployment-process.DjDAdmHN_27XMif.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;setting-defaults&quot;&gt;Setting defaults&lt;/h2&gt;
&lt;p&gt;There are some default settings you can set. This is handy when you’re using the same dotfiles directory and IDE for all your devpods on a specific machine.&lt;/p&gt;
&lt;p class=&quot;code-title&quot;&gt;Set default options&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Set default URL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;devpod&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; context&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; set-options&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; DOTFILES_URL=git@github.com:you/dotfiles.git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Set default IDE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;devpod&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ide&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; use&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; none&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;commands-used-frequently&quot;&gt;Commands used frequently&lt;/h2&gt;
&lt;p class=&quot;code-title&quot;&gt;Frequently used commands&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# List workspaces&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;devpod&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ls&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# SSH into workspace&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;devpod&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ssh&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;workspace-nam&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Delete workspace this forces fresh rebuild the next time you bring the devpod up&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;devpod&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; delete&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;workspace-nam&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Stop the workspace&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;devpod&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; stop&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;workspace-nam&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# use the --recreate parameter to recreate a devpod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;devpod&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; up&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --ide&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; none&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --dotfiles&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://github.com/jackykornet/dotfiles.git&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --recreate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;##&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;## Mise&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;##&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Install new packages with mise&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mise&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# List all installed packages&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mise&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; list&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;##&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;## Chezmoi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;##&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# commit changes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; commit&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;message&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# push to repo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; push&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;for-consideration&quot;&gt;For consideration&lt;/h2&gt;
&lt;p&gt;When installing a package with Mise you can do this with &lt;code&gt;mise install&lt;/code&gt; this will add the packages to the &lt;code&gt;mise.toml&lt;/code&gt; file automatically. When you add packages to be installed through &lt;code&gt;Chezmoi&lt;/code&gt; you have to do this in the dot_config folder of the working directory and then &lt;code&gt;commit and push&lt;/code&gt; the changes to &lt;code&gt;git&lt;/code&gt; to make the change available after a rebuild.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.chezmoi.io/reference/&quot;&gt;https://www.chezmoi.io/reference/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mise.jdx.dev/getting-started.html&quot;&gt;https://mise.jdx.dev/getting-started.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devpod.sh/&quot;&gt;https://devpod.sh/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jackykornet/dotfiles.git&quot;&gt;https://github.com/jackykornet/dotfiles.git&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>How to setup my local machine with Chezmoi and Mise</title><link>https://blog.tenrok.nl/blog/how-to-setup-my-local-machine-with-chezmoi-and-mise/</link><guid isPermaLink="true">https://blog.tenrok.nl/blog/how-to-setup-my-local-machine-with-chezmoi-and-mise/</guid><description>My journey to learn DevPod, Chezmoi and Mise by setting up my dotfiles and tools for my DevPods.</description><pubDate>Fri, 21 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;install-chezmoi-manually&quot;&gt;Install Chezmoi manually&lt;/h2&gt;
&lt;p&gt;The following command will install Chezmoi on my machine, apply my dotfiles repo to configure all my dotfiles, install Mise, and use Mise to install any tools I’d like installed by default.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# run the following command to install chezmoi and apply my dotfiles.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sh&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -c&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;$(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fsLS&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; get.chezmoi.io)&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; init&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --apply&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://github.com/jackykornet/dotfiles.git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What is happening:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sh -c &quot;$(curl -fsLS get.chezmoi.io)&quot;&lt;/code&gt; downloads the binary and installs the latest version of Chezmoi.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--&lt;/code&gt; passes parameters to the Chezmoi installation. If parameters are passed, Chezmoi starts after the installation with these parameters.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;init&lt;/code&gt; initiates a new installation&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--apply https://github.com/jackykornet/dotfiles.git&lt;/code&gt; applies an existing dotfiles repo to the home directory&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Adding &lt;code&gt;--apply&lt;/code&gt; is the same as running &lt;code&gt;Chezmoi apply&lt;/code&gt;. The following is happening (in order of application):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Checks the state of the source (this is the working directory &lt;code&gt;$HOME/.local/chezmoi&lt;/code&gt;, and the place where the git repo is pulled)&lt;/li&gt;
&lt;li&gt;Checks the state of the destination. (this is the home directory where the actual dotfiles live)&lt;/li&gt;
&lt;li&gt;Computes the target state (the difference between the source and destination).&lt;/li&gt;
&lt;li&gt;Applies updates to the target. The order of application is based on alphabetic order. Target names are considered after all attributes are stripped.
&lt;ul&gt;
&lt;li&gt;First it will run all the scripts with the before attribute &lt;code&gt;before_&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Then it will process all the other files and scripts&lt;/li&gt;
&lt;li&gt;At the end all the &lt;code&gt;after_&lt;/code&gt; scripts will run.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;When not applying the —apply parameter Chezmoi will only copy the files to the working directory, so you can check the difference between the source and destination before running &lt;code&gt;Chezmoi apply&lt;/code&gt; manually.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;script-attributes&quot;&gt;Script attributes&lt;/h3&gt;
&lt;p&gt;There are multiple script attributes available, running at different times in the process.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_before_&lt;/code&gt; — run before everything else.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run_once&lt;/code&gt; — run once if success and not changed.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run_onchange&lt;/code&gt; — run only on change. Can also be used for tracking changes of external files.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is also possible to combine attributes together.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_once_before_&lt;/code&gt; — run once before anything else&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run_onchange_after_&lt;/code&gt; — run onchange after anything else&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See &lt;a href=&quot;https://www.chezmoi.io/reference/source-state-attributes/&quot;&gt;https://www.chezmoi.io/reference/source-state-attributes/&lt;/a&gt; for all possible attributes&lt;/p&gt;
&lt;h2 id=&quot;install-mise&quot;&gt;Install Mise&lt;/h2&gt;
&lt;p&gt;With &lt;code&gt;.chezmoiexternals&lt;/code&gt; external programs can be installed. To install &lt;code&gt;Mise&lt;/code&gt; create a file in &lt;code&gt;.chezmoiexternals&lt;/code&gt; with the &lt;code&gt;.toml&lt;/code&gt; extension.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tree&lt;/code&gt; — file tree of the &lt;code&gt;.chezmoiexternals&lt;/code&gt; directory&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .chezmoiexternals&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;│  &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mise.toml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add the configuration for the installation of the &lt;code&gt;Mise&lt;/code&gt; binary.&lt;/p&gt;
&lt;p class=&quot;code-title&quot;&gt;content of the mise.toml file&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;local/bin/mise&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;type = &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;file&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;executable = &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;url = &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;https://mise.jdx.dev/mise-latest-{{.chezmoi.os}}-{{.chezmoi.arch}}&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What this file does:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[&quot;.local/bin/mise&quot;]&lt;/code&gt; installs the program to this location&lt;/li&gt;
&lt;li&gt;&lt;code&gt;type = &quot;file&quot;&lt;/code&gt; as a file&lt;/li&gt;
&lt;li&gt;&lt;code&gt;executable = true&lt;/code&gt; makes the file executable&lt;/li&gt;
&lt;li&gt;&lt;code&gt;url = &quot;https://mise.jdx.dev/mise-latest-{{.chezmoi.os}}-{{.chezmoi.arch}}&quot;&lt;/code&gt; from this URL.
&lt;ul&gt;
&lt;li&gt;Templating variables are used to get the right installation package, based on the os and architecture of the machine.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;All the possible template variables can be seen by running the command &lt;code&gt;chezmoi data&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;install-tools-with-mise&quot;&gt;Install tools with Mise&lt;/h2&gt;
&lt;p&gt;To manually install tools with Mise run the command &lt;code&gt;$HOME/.local/bin/mise install&lt;/code&gt;. This will install all tools specified in &lt;code&gt;.config/mise/config.toml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To install tools automatically using Chezmoi use a &lt;code&gt;run_onchange_after&lt;/code&gt; script. Create a file &lt;code&gt;run_onchange_after_install_packages.sh.tmp&lt;/code&gt; in &lt;code&gt;.chezmoiscripts&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .chezmoiscripts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;│  &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run_onchange_after_install_packages.sh.tmpl&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add the following content to the file&lt;/p&gt;
&lt;p class=&quot;code-title&quot;&gt;run_onchange_after_install_packages.sh.tmp&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# packages hash: {{ include &quot;dot_config/mise/config.toml&quot; | sha256sum }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$HOME/.local/bin/mise trust $HOME/.config/mise/config.toml &amp;#x26;&amp;#x26; $HOME/.local/bin/mise install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To check if a file is changed Chezmoi is creating a hash of the file content. When the hash changes, the file is changed and it will run again. It is also possible to include external files into the hash by adding the following line.&lt;/p&gt;
&lt;p&gt;What this file does:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;# packages hash: {{ include &quot;dot_config/mise/config.toml&quot; | sha256sum }}&lt;/code&gt; includes &lt;code&gt;dot_config/mise/config.toml&lt;/code&gt; in the hash calculation.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$HOME/.local/bin/mise trust $HOME/.config/mise/config.toml&lt;/code&gt; trusts the config file.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$HOME/.local/bin/mise install&lt;/code&gt; runs mise install to install the tools.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When &lt;code&gt;dot_config/mise/config.toml&lt;/code&gt; changes, the hash will change and the &lt;code&gt;run_onchange_after_install_packages.sh.tmp&lt;/code&gt; script will run again.&lt;/p&gt;
&lt;h3 id=&quot;why-the-order-of-trust-matters&quot;&gt;Why the order of trust matters&lt;/h3&gt;
&lt;p&gt;By default Mise doesn’t use any external configuration files unless instructed to do so. This is to prevent any harmful scripts from being executed from untrusted sources.
If we do not first trust the &lt;code&gt;config.toml&lt;/code&gt; file before running &lt;code&gt;install&lt;/code&gt;, Mise will not process the config.toml.&lt;/p&gt;
&lt;h2 id=&quot;files-and-folders&quot;&gt;Files and folders&lt;/h2&gt;
&lt;p&gt;This is a brief overview of the most valuable files and locations used by &lt;code&gt;Chezmoi&lt;/code&gt; and &lt;code&gt;Mise&lt;/code&gt;&lt;/p&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;What&lt;/th&gt;&lt;th&gt;Where&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Chezmoi binary (by Mise)&lt;/td&gt;&lt;td&gt;~/.local/share/mise/installs/chezmoi/latest/chezmoi&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Chezmoi binary installed by hand&lt;/td&gt;&lt;td&gt;{$PWD}\bin\chezmoi&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Chezmoi source directory&lt;/td&gt;&lt;td&gt;~/.local/share/chezmoi&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mise binary&lt;/td&gt;&lt;td&gt;~/.local/bin/mise&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mise tools binary&lt;/td&gt;&lt;td&gt;~/.local/share/mise/installs/&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mise config file&lt;/td&gt;&lt;td&gt;~/.config/mise/config.toml&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;dot_file files&lt;/td&gt;&lt;td&gt;~/.file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;dot_config folder&lt;/td&gt;&lt;td&gt;~/.config/&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;dot_config/anything&lt;/td&gt;&lt;td&gt;~/.config/anything&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;git-repo-structure&quot;&gt;Git repo structure&lt;/h2&gt;
&lt;p&gt;A brief explanation of the git repo structure and how &lt;code&gt;Chezmoi&lt;/code&gt; processes them.&lt;/p&gt;
&lt;p class=&quot;code-title&quot;&gt;dotfile repo structure&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dotfiles/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .chezmoiexternals&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;      #-- external script location&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;│  &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mise.toml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .chezmoiignore&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;         #-- files to ignore&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .chezmoiscripts&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;        #-- script to run during apply&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;│  &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; run_onchange_after_install_packages.sh.tmpl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; README.md&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dot_bashrc&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;             #-- will be copied to ~/.bashrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dot_config&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;             #-- everything inside will be copied to ~/.config. If .config doesn&apos;t exist it will be created.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;│  &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mise&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;│  &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; │  &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; config.toml&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    #-- will be copied to ~/.config/mise/config.toml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;│  &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; └──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; starship.toml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;├──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dot_vimrc&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;              #-- will be copied to ~/.vimrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;└──&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; setup&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                  #-- DevPod bootstrap (must be executable). Ignored by Chezmoi (see .chezmoiignore)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;useful-commands&quot;&gt;Useful Commands&lt;/h2&gt;
&lt;p&gt;An overview of the most useful commands you use while working with &lt;code&gt;Chezmoi&lt;/code&gt; or &lt;code&gt;Mise&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;## Chezmoi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# cd in to chezmoi source dir, same as cd ~/.local/share/chezmoi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;chezmoi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Apply dotfiles locally&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;chezmoi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apply&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Dry run with verbose logging. Does not apply anything.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;chezmoi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apply&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --dry-run&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --verbose&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Shows the difference between the working dir and home directory&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;chezmoi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; diff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Pull :latest from remote and runs apply&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;chezmoi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Add a managed file (copies the existing file to dot_bashrc)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;chezmoi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ~/.bashrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Edit a managed file&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;chezmoi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; edit&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ~/.bashrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Remove run_once states, all scripts run again after apply&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;chezmoi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; state&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; delete-bucket&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --bucket=scriptState&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;chezmoi&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; apply&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# The git commands to use after changing dotfiles.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# add to staging&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# commit changes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; commit&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;message&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# push to repo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; push&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;##&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;## Mise&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;##&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# List installed tools&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mise&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; list&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Shows trusted config files&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mise&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; trust&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Trust config file ~/.config/mise/config.toml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mise&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; trust&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ~/.config/mise/config.toml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Install tools from config.toml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mise&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Add a tool (adds it also to config.toml)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mise&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; use&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bat@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Chezmoi references: &lt;a href=&quot;https://www.chezmoi.io/reference/&quot;&gt;https://www.chezmoi.io/reference/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Chezmoi attributes: &lt;a href=&quot;https://www.chezmoi.io/reference/source-state-attributes/&quot;&gt;https://www.chezmoi.io/reference/source-state-attributes/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dotfiles directory: &lt;a href=&quot;https://github.com/jackykornet/dotfiles.git&quot;&gt;https://github.com/jackykornet/dotfiles.git&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item></channel></rss>