<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Configuration on nux</title><link>https://drew-daniels.github.io/nux/docs/configuration/</link><description>Recent content in Configuration on nux</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://drew-daniels.github.io/nux/docs/configuration/index.xml" rel="self" type="application/rss+xml"/><item><title>Global config</title><link>https://drew-daniels.github.io/nux/docs/configuration/global-config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://drew-daniels.github.io/nux/docs/configuration/global-config/</guid><description>&lt;p&gt;The global config file controls defaults, discovery, pickers, and session groups for all projects.&lt;/p&gt;
&lt;h2 id="location"&gt;Location&lt;a class="anchor" href="#location"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;nux follows the &lt;a href="https://specifications.freedesktop.org/basedir-spec/latest/"&gt;XDG Base Directory Specification&lt;/a&gt;. The config file is located at:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$XDG_CONFIG_HOME/nux/config.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On most systems this resolves to &lt;code&gt;~/.config/nux/config.yaml&lt;/code&gt;. If &lt;code&gt;$XDG_CONFIG_HOME&lt;/code&gt; is set to a custom path, nux uses that instead.&lt;/p&gt;
&lt;p&gt;You can override the config directory at runtime with &lt;code&gt;--config-dir &amp;lt;path&amp;gt;&lt;/code&gt;. This also changes where nux looks for project configs (&lt;code&gt;&amp;lt;path&amp;gt;/projects/&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;If the config file does not exist, nux applies built-in defaults silently (no error).&lt;/p&gt;</description></item><item><title>Project config</title><link>https://drew-daniels.github.io/nux/docs/configuration/project-config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://drew-daniels.github.io/nux/docs/configuration/project-config/</guid><description>&lt;p&gt;Each project is defined in a YAML file under the nux config directory:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$XDG_CONFIG_HOME/nux/projects/&amp;lt;name&amp;gt;.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On most systems this is &lt;code&gt;~/.config/nux/projects/&amp;lt;name&amp;gt;.yaml&lt;/code&gt;. The file name (without &lt;code&gt;.yaml&lt;/code&gt;) becomes the project name on the CLI.&lt;/p&gt;
&lt;h2 id="session-name-normalization"&gt;Session name normalization&lt;a class="anchor" href="#session-name-normalization"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The tmux session name is derived from the project name with these transformations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dots (&lt;code&gt;.&lt;/code&gt;), colons (&lt;code&gt;:&lt;/code&gt;), and spaces are replaced with underscores (&lt;code&gt;_&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Leading dashes are stripped&lt;/li&gt;
&lt;li&gt;Consecutive underscores are collapsed to one&lt;/li&gt;
&lt;li&gt;Trailing underscores are stripped&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, a file named &lt;code&gt;my.cool-project.yaml&lt;/code&gt; produces the session name &lt;code&gt;my_cool-project&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Session groups</title><link>https://drew-daniels.github.io/nux/docs/configuration/session-groups/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://drew-daniels.github.io/nux/docs/configuration/session-groups/</guid><description>&lt;p&gt;Groups are named lists of project names in &lt;a href="https://drew-daniels.github.io/nux/docs/configuration/global-config/"&gt;global config&lt;/a&gt; under the &lt;code&gt;groups&lt;/code&gt; key. They let you start or stop several projects at once without typing each name.&lt;/p&gt;
&lt;h2 id="defining-groups"&gt;Defining groups&lt;a class="anchor" href="#defining-groups"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;work&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;api&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;web&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;workers&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;personal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;blog&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;dotfiles&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Each entry is a project name - the basename of a file in &lt;code&gt;~/.config/nux/projects/&lt;/code&gt; (without &lt;code&gt;.yaml&lt;/code&gt;), or any name resolvable via &lt;code&gt;project_dirs&lt;/code&gt; or zoxide.&lt;/p&gt;
&lt;h2 id="usage"&gt;Usage&lt;a class="anchor" href="#usage"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Start every session in a group:&lt;/p&gt;</description></item><item><title>Default session</title><link>https://drew-daniels.github.io/nux/docs/configuration/default-session/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://drew-daniels.github.io/nux/docs/configuration/default-session/</guid><description>&lt;p&gt;When a project has &lt;strong&gt;no&lt;/strong&gt; config file under &lt;code&gt;~/.config/nux/projects/&lt;/code&gt;, nux builds a session from &lt;code&gt;default_session&lt;/code&gt; in &lt;a href="https://drew-daniels.github.io/nux/docs/configuration/global-config/"&gt;global config&lt;/a&gt;. This is why commands like &lt;code&gt;nux blog&lt;/code&gt; can work with zero project file - the template provides the layout.&lt;/p&gt;
&lt;h2 id="no-default_session-set"&gt;No default_session set&lt;a class="anchor" href="#no-default_session-set"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If &lt;code&gt;default_session&lt;/code&gt; is omitted from global config entirely, nux still creates a session - it just gets a single empty window with no commands. This is a bare tmux session rooted at the project directory.&lt;/p&gt;</description></item><item><title>Environment variables</title><link>https://drew-daniels.github.io/nux/docs/configuration/environment-variables/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://drew-daniels.github.io/nux/docs/configuration/environment-variables/</guid><description>&lt;p&gt;The &lt;code&gt;env&lt;/code&gt; field in a &lt;a href="https://drew-daniels.github.io/nux/docs/configuration/project-config/"&gt;project config&lt;/a&gt; sets session-scoped environment variables using &lt;code&gt;tmux set-environment&lt;/code&gt;. Every pane in that session inherits them.&lt;/p&gt;
&lt;h2 id="syntax"&gt;Syntax&lt;a class="anchor" href="#syntax"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Values are strings. You can reference existing process environment variables with &lt;code&gt;${VAR}&lt;/code&gt; and use default fallbacks with &lt;code&gt;${VAR:-default}&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;NODE_ENV&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;development&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3000&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${DATABASE_URL_DEV}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;LOG_LEVEL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${LOG_LEVEL:-info}&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="interpolation"&gt;Interpolation&lt;a class="anchor" href="#interpolation"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Environment variable values go through the same interpolation pipeline as other config fields:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Custom variables&lt;/strong&gt; - &lt;code&gt;{{var}}&lt;/code&gt; placeholders are resolved from the &lt;code&gt;vars&lt;/code&gt; block&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Environment expansion&lt;/strong&gt; - &lt;code&gt;${VAR}&lt;/code&gt; references are expanded using Go&amp;rsquo;s &lt;code&gt;os.ExpandEnv&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This means you can combine both:&lt;/p&gt;</description></item><item><title>Custom variables</title><link>https://drew-daniels.github.io/nux/docs/configuration/custom-variables/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://drew-daniels.github.io/nux/docs/configuration/custom-variables/</guid><description>&lt;p&gt;The &lt;code&gt;vars&lt;/code&gt; field in &lt;a href="https://drew-daniels.github.io/nux/docs/configuration/project-config/"&gt;project config&lt;/a&gt; defines named values you can reuse across the file.&lt;/p&gt;
&lt;h2 id="var-interpolation"&gt;&lt;code&gt;{{var}}&lt;/code&gt; interpolation&lt;a class="anchor" href="#var-interpolation"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Use double-brace names in any string field - &lt;code&gt;root&lt;/code&gt;, hooks, &lt;code&gt;env&lt;/code&gt; values, and window or pane fields (including pane &lt;code&gt;command&lt;/code&gt; when using the object pane form):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;myapp&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;deploy_env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;staging&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;~/projects/{{app_name}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;APP_NAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{app_name}}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DEPLOY_ENV&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{deploy_env}}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;windows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;api&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;panes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./bin/{{app_name}}-api&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="resolution-order"&gt;Resolution order&lt;a class="anchor" href="#resolution-order"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Interpolation happens in this order:&lt;/p&gt;</description></item><item><title>Editor IntelliSense</title><link>https://drew-daniels.github.io/nux/docs/configuration/editor-intellisense/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://drew-daniels.github.io/nux/docs/configuration/editor-intellisense/</guid><description>&lt;p&gt;JSON Schemas ship in the nux repository for both config types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;schemas/global.schema.json&lt;/code&gt; - global &lt;code&gt;config.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;schemas/project.schema.json&lt;/code&gt; - per-project YAML under &lt;code&gt;projects/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Point your YAML language server at these schemas to get completion, validation, and hover docs in your editor.&lt;/p&gt;
&lt;p&gt;The schemas include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Required panes&lt;/strong&gt; — windows without at least one pane are flagged inline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Layout validation&lt;/strong&gt; — named layouts (&lt;code&gt;tiled&lt;/code&gt;, &lt;code&gt;main-vertical&lt;/code&gt;, etc.) get autocomplete, and custom tmux layout strings are also accepted.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;String-or-object shorthands&lt;/strong&gt; — &lt;code&gt;panes: [nvim]&lt;/code&gt; is recognized as valid.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;nux config&lt;/code&gt; and &lt;code&gt;nux new&lt;/code&gt; automatically include the appropriate schema modeline in generated files. For existing configs or manual setup, use one of the methods below.&lt;/p&gt;</description></item></channel></rss>