<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>kvx</title><link>https://oakwood-commons.github.io/kvx/</link><description>Recent content on kvx</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://oakwood-commons.github.io/kvx/index.xml" rel="self" type="application/rss+xml"/><item><title>Getting Started</title><link>https://oakwood-commons.github.io/kvx/docs/tutorials/getting-started/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://oakwood-commons.github.io/kvx/docs/tutorials/getting-started/</guid><description>&lt;h1 id="getting-started-with-kvx"&gt;Getting Started with kvx&lt;a class="anchor" href="#getting-started-with-kvx"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This tutorial walks you through installing kvx, loading your first data file, and exploring the output formats.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;a class="anchor" href="#installation"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="homebrew-macos--linux"&gt;Homebrew (macOS / Linux)&lt;a class="anchor" href="#homebrew-macos--linux"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;brew install oakwood-commons/tap/kvx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="windows-winget"&gt;Windows (winget)&lt;a class="anchor" href="#windows-winget"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;winget install OakwoodCommons.kvx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="from-source"&gt;From Source&lt;a class="anchor" href="#from-source"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go install github.com/oakwood-commons/kvx@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="from-release-binaries"&gt;From Release Binaries&lt;a class="anchor" href="#from-release-binaries"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Download the latest binary for your platform from &lt;a href="https://github.com/oakwood-commons/kvx/releases"&gt;GitHub Releases&lt;/a&gt;, extract it, and add it to your &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;macOS note:&lt;/strong&gt; You may need to remove the quarantine attribute:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xattr -dr &lt;span style="color:#a5d6ff"&gt;&amp;#39;com.apple.quarantine&amp;#39;&lt;/span&gt; /usr/local/bin/kvx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="first-run"&gt;First Run&lt;a class="anchor" href="#first-run"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Create a sample file &lt;code&gt;data.yaml&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Interactive Mode</title><link>https://oakwood-commons.github.io/kvx/docs/tutorials/interactive-mode/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://oakwood-commons.github.io/kvx/docs/tutorials/interactive-mode/</guid><description>&lt;h1 id="interactive-mode"&gt;Interactive Mode&lt;a class="anchor" href="#interactive-mode"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The interactive TUI lets you navigate, search, filter, and evaluate expressions against your data in a full-screen terminal interface.&lt;/p&gt;
&lt;h2 id="launching-the-tui"&gt;Launching the TUI&lt;a class="anchor" href="#launching-the-tui"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kvx data.yaml -i&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Override terminal size detection:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kvx data.yaml -i --width &lt;span style="color:#a5d6ff"&gt;120&lt;/span&gt; --height &lt;span style="color:#a5d6ff"&gt;40&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="panels"&gt;Panels&lt;a class="anchor" href="#panels"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The TUI is organized into panels:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data panel&lt;/strong&gt; — Main table view. The bottom border shows the current CEL path (tail is kept when the path is long). The lower-right corner shows &lt;code&gt;n/x&lt;/code&gt; for selection/visible rows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Input panel&lt;/strong&gt; — Single-line bordered input. Title reflects the current mode (Expression or Search). Hidden until activated.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Info panel&lt;/strong&gt; — One row, borderless. Right-justified when input is hidden. Left-justified and recolored when input is shown.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Footer&lt;/strong&gt; — Always visible. Left shows &lt;code&gt;? - Help&lt;/code&gt;, right shows rows/cols.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Help popup&lt;/strong&gt; — Hidden by default. Press &lt;code&gt;?&lt;/code&gt; to toggle help content.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="navigation"&gt;Navigation&lt;a class="anchor" href="#navigation"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;kvx defaults to &lt;strong&gt;vim&lt;/strong&gt; keybindings:&lt;/p&gt;</description></item><item><title>CEL Expressions</title><link>https://oakwood-commons.github.io/kvx/docs/tutorials/expressions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://oakwood-commons.github.io/kvx/docs/tutorials/expressions/</guid><description>&lt;h1 id="cel-expressions"&gt;CEL Expressions&lt;a class="anchor" href="#cel-expressions"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;kvx uses the &lt;a href="https://cel.dev/"&gt;Common Expression Language (CEL)&lt;/a&gt; for dynamic querying, filtering, and transformation. This tutorial covers the expression syntax and common patterns.&lt;/p&gt;
&lt;h2 id="basics"&gt;Basics&lt;a class="anchor" href="#basics"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The root variable is always &lt;code&gt;_&lt;/code&gt;. Use &lt;code&gt;-e&lt;/code&gt; on the CLI or &lt;code&gt;:&lt;/code&gt; in the TUI to evaluate expressions.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# Access a field&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kvx data.yaml -e &lt;span style="color:#a5d6ff"&gt;&amp;#39;_.metadata.name&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# Array index&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kvx data.yaml -e &lt;span style="color:#a5d6ff"&gt;&amp;#39;_.items[0]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# Nested field access&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kvx data.yaml -e &lt;span style="color:#a5d6ff"&gt;&amp;#39;_.items[0].name&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="path-syntax"&gt;Path Syntax&lt;a class="anchor" href="#path-syntax"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;kvx supports two path styles:&lt;/p&gt;</description></item><item><title>Configuration &amp; Themes</title><link>https://oakwood-commons.github.io/kvx/docs/tutorials/configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://oakwood-commons.github.io/kvx/docs/tutorials/configuration/</guid><description>&lt;h1 id="configuration--themes"&gt;Configuration &amp;amp; Themes&lt;a class="anchor" href="#configuration--themes"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This tutorial covers configuring kvx, selecting themes, using schema-driven column hints, and setting up shell completion.&lt;/p&gt;
&lt;h2 id="config-file"&gt;Config File&lt;a class="anchor" href="#config-file"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;kvx merges built-in defaults with your config file at &lt;code&gt;~/.config/kvx/config.yaml&lt;/code&gt; (or &lt;code&gt;$XDG_CONFIG_HOME/kvx/config.yaml&lt;/code&gt;). Override the config path with &lt;code&gt;--config-file&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="viewing-configuration"&gt;Viewing Configuration&lt;a class="anchor" href="#viewing-configuration"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# Show merged config (defaults + your overrides)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kvx config get
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# Output as JSON, YAML, or table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kvx config get -o json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kvx config get -o yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kvx config get -o table
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# Interactive TUI view&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kvx config get -i
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;# Print merged config without reading input&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kvx --config&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="using-a-specific-config-file"&gt;Using a Specific Config File&lt;a class="anchor" href="#using-a-specific-config-file"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kvx config get --config-file ~/.config/kvx/config.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kvx data.yaml --config-file /path/to/custom-config.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="themes"&gt;Themes&lt;a class="anchor" href="#themes"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Themes control the colors, borders, and styling of both TUI and CLI output.&lt;/p&gt;</description></item><item><title>TUI Quick Guide</title><link>https://oakwood-commons.github.io/kvx/docs/tui/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://oakwood-commons.github.io/kvx/docs/tui/</guid><description>&lt;h1 id="tui-quick-guide"&gt;TUI quick guide&lt;a class="anchor" href="#tui-quick-guide"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="launch--sizing"&gt;Launch &amp;amp; sizing&lt;a class="anchor" href="#launch--sizing"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Interactive: &lt;code&gt;kvx &amp;lt;file&amp;gt; -i&lt;/code&gt;; one-shot renders use &lt;code&gt;--snapshot&lt;/code&gt; (no &lt;code&gt;-x&lt;/code&gt; alias). Add &lt;code&gt;--press&lt;/code&gt; to script startup keys.&lt;/li&gt;
&lt;li&gt;Size: &lt;code&gt;--width/--height&lt;/code&gt; override terminal size; otherwise we detect and react to resizes.&lt;/li&gt;
&lt;li&gt;No blank rows below the footer; panels scale proportionally when resizing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="panels"&gt;Panels&lt;a class="anchor" href="#panels"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Footer: always visible; left shows &lt;code&gt;? - Help&lt;/code&gt;, right shows rows/cols.&lt;/li&gt;
&lt;li&gt;Data panel: fills remaining space; bottom border shows current CEL path (tail is kept when long); lower-right of the data panel shows &lt;code&gt;n/x&lt;/code&gt; for selection/visible rows (footer still shows rows/cols).&lt;/li&gt;
&lt;li&gt;Input panel: one-line bordered; title reflects mode (Expression/Search); hidden by default.&lt;/li&gt;
&lt;li&gt;Info panel: one row, borderless; right-justified when input is hidden, left-justified and recolored when input is shown.&lt;/li&gt;
&lt;li&gt;Popup: hidden by default; &lt;code&gt;?&lt;/code&gt; toggles help content.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="navigation-basics"&gt;Navigation basics&lt;a class="anchor" href="#navigation-basics"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;kvx defaults to &lt;strong&gt;vim&lt;/strong&gt; keybinding mode:&lt;/p&gt;</description></item><item><title>Library Usage</title><link>https://oakwood-commons.github.io/kvx/docs/library-usage/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://oakwood-commons.github.io/kvx/docs/library-usage/</guid><description>&lt;h1 id="using-kvx-as-a-library"&gt;Using kvx as a Library&lt;a class="anchor" href="#using-kvx-as-a-library"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This guide covers everything you need to embed kvx in your own Go application — from a five-line quickstart to advanced customization.&lt;/p&gt;
&lt;h2 id="install"&gt;Install&lt;a class="anchor" href="#install"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go get github.com/oakwood-commons/kvx@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="quickstart"&gt;Quickstart&lt;a class="anchor" href="#quickstart"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There are two public packages. Pick the one that fits your use case:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Package&lt;/th&gt;
 &lt;th&gt;Import&lt;/th&gt;
 &lt;th&gt;Use when you want…&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;pkg/core&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;github.com/oakwood-commons/kvx/pkg/core&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Load data, evaluate expressions, render plain text tables — &lt;strong&gt;no terminal UI&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;pkg/tui&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;github.com/oakwood-commons/kvx/pkg/tui&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Launch the full interactive TUI or render bordered tables&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="minimal-example--render-a-table-no-tui"&gt;Minimal example — render a table (no TUI)&lt;a class="anchor" href="#minimal-example--render-a-table-no-tui"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72"&gt;package&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;main&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72"&gt;import&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;(&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;github.com/oakwood-commons/kvx/pkg/core&amp;#34;&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;github.com/oakwood-commons/kvx/pkg/tui&amp;#34;&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72"&gt;func&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#d2a8ff;font-weight:bold"&gt;main&lt;/span&gt;()&lt;span style="color:#6e7681"&gt; &lt;/span&gt;{&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;data&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;:=&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72"&gt;map&lt;/span&gt;[&lt;span style="color:#ff7b72"&gt;string&lt;/span&gt;]&lt;span style="color:#ff7b72"&gt;any&lt;/span&gt;{&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;my-service&amp;#34;&lt;/span&gt;,&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;2.1.0&amp;#34;&lt;/span&gt;,&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;healthy&amp;#34;&lt;/span&gt;:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#79c0ff"&gt;true&lt;/span&gt;,&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;}&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;root,&lt;span style="color:#6e7681"&gt; &lt;/span&gt;_&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;:=&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;core.&lt;span style="color:#d2a8ff;font-weight:bold"&gt;LoadObject&lt;/span&gt;(data)&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;// Bordered table, just like the kvx CLI&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;fmt.&lt;span style="color:#d2a8ff;font-weight:bold"&gt;Print&lt;/span&gt;(tui.&lt;span style="color:#d2a8ff;font-weight:bold"&gt;RenderTable&lt;/span&gt;(root,&lt;span style="color:#6e7681"&gt; &lt;/span&gt;tui.TableOptions{&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;AppName:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;my-app&amp;#34;&lt;/span&gt;,&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;Path:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;_&amp;#34;&lt;/span&gt;,&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;Bordered:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#79c0ff"&gt;true&lt;/span&gt;,&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;}))&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="minimal-example--launch-the-interactive-tui"&gt;Minimal example — launch the interactive TUI&lt;a class="anchor" href="#minimal-example--launch-the-interactive-tui"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root,&lt;span style="color:#6e7681"&gt; &lt;/span&gt;_&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;:=&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;core.&lt;span style="color:#d2a8ff;font-weight:bold"&gt;LoadFile&lt;/span&gt;(&lt;span style="color:#a5d6ff"&gt;&amp;#34;data.yaml&amp;#34;&lt;/span&gt;)&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cfg&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;:=&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;tui.&lt;span style="color:#d2a8ff;font-weight:bold"&gt;DefaultConfig&lt;/span&gt;()&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cfg.AppName&lt;span style="color:#6e7681"&gt; &lt;/span&gt;=&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;my-app&amp;#34;&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72"&gt;if&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;err&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;:=&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;tui.&lt;span style="color:#d2a8ff;font-weight:bold"&gt;Run&lt;/span&gt;(root,&lt;span style="color:#6e7681"&gt; &lt;/span&gt;cfg);&lt;span style="color:#6e7681"&gt; &lt;/span&gt;err&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;!=&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#79c0ff"&gt;nil&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;{&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;log.&lt;span style="color:#d2a8ff;font-weight:bold"&gt;Fatal&lt;/span&gt;(err)&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it. Everything else below is optional.&lt;/p&gt;</description></item><item><title>Embedding the TUI</title><link>https://oakwood-commons.github.io/kvx/docs/embedding/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://oakwood-commons.github.io/kvx/docs/embedding/</guid><description>&lt;h1 id="embedding-kvx-in-another-app"&gt;Embedding kvx in another app&lt;a class="anchor" href="#embedding-kvx-in-another-app"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Use the public &lt;code&gt;tui&lt;/code&gt; and &lt;code&gt;core&lt;/code&gt; packages to run kvx inside your Go program. This guide covers data loading, configuration, and common extension points.&lt;/p&gt;
&lt;h2 id="data-loading-options"&gt;Data loading options&lt;a class="anchor" href="#data-loading-options"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pick the loader that matches your source:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;core.LoadFile(path)&lt;/code&gt; — read JSON/YAML/NDJSON from disk.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;core.LoadRoot(input)&lt;/code&gt; / &lt;code&gt;core.LoadRootBytes(data)&lt;/code&gt; — parse strings/bytes with format auto-detection.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;core.LoadObject(value)&lt;/code&gt; — pass an already parsed Go value (map, slice, struct, etc.). Strings and byte slices are parsed through the same detection logic; nil inputs return an error.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="minimal-embed"&gt;Minimal embed&lt;a class="anchor" href="#minimal-embed"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72"&gt;package&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;main&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72"&gt;import&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;(&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;log&amp;#34;&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;github.com/oakwood-commons/kvx/pkg/core&amp;#34;&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;github.com/oakwood-commons/kvx/pkg/tui&amp;#34;&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72"&gt;func&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#d2a8ff;font-weight:bold"&gt;main&lt;/span&gt;()&lt;span style="color:#6e7681"&gt; &lt;/span&gt;{&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#8b949e;font-style:italic"&gt;// Use an existing Go value (no re-serialization needed)&lt;/span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;data&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;:=&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72"&gt;map&lt;/span&gt;[&lt;span style="color:#ff7b72"&gt;string&lt;/span&gt;]&lt;span style="color:#ff7b72"&gt;any&lt;/span&gt;{&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;service&amp;#34;&lt;/span&gt;:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;kvx&amp;#34;&lt;/span&gt;,&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;owners&amp;#34;&lt;/span&gt;:&lt;span style="color:#6e7681"&gt; &lt;/span&gt;[]&lt;span style="color:#ff7b72"&gt;any&lt;/span&gt;{&lt;span style="color:#a5d6ff"&gt;&amp;#34;dev@acme.com&amp;#34;&lt;/span&gt;,&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;ops@acme.com&amp;#34;&lt;/span&gt;},&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;}&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;root,&lt;span style="color:#6e7681"&gt; &lt;/span&gt;err&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;:=&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;core.&lt;span style="color:#d2a8ff;font-weight:bold"&gt;LoadObject&lt;/span&gt;(data)&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72"&gt;if&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;err&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;!=&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#79c0ff"&gt;nil&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;{&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;log.&lt;span style="color:#d2a8ff;font-weight:bold"&gt;Fatalf&lt;/span&gt;(&lt;span style="color:#a5d6ff"&gt;&amp;#34;load data: %v&amp;#34;&lt;/span&gt;,&lt;span style="color:#6e7681"&gt; &lt;/span&gt;err)&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;}&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;cfg&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;:=&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;tui.&lt;span style="color:#d2a8ff;font-weight:bold"&gt;DefaultConfig&lt;/span&gt;()&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72"&gt;if&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;err&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;:=&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;tui.&lt;span style="color:#d2a8ff;font-weight:bold"&gt;Run&lt;/span&gt;(root,&lt;span style="color:#6e7681"&gt; &lt;/span&gt;cfg);&lt;span style="color:#6e7681"&gt; &lt;/span&gt;err&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;!=&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;&lt;span style="color:#79c0ff"&gt;nil&lt;/span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;{&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;log.&lt;span style="color:#d2a8ff;font-weight:bold"&gt;Fatalf&lt;/span&gt;(&lt;span style="color:#a5d6ff"&gt;&amp;#34;tui error: %v&amp;#34;&lt;/span&gt;,&lt;span style="color:#6e7681"&gt; &lt;/span&gt;err)&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e7681"&gt; &lt;/span&gt;}&lt;span style="color:#6e7681"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Swap &lt;code&gt;core.LoadObject&lt;/code&gt; with &lt;code&gt;core.LoadFile&lt;/code&gt; when you want to load from disk. For scripted renders (no interactive loop), use CLI-style flags with &lt;code&gt;--snapshot&lt;/code&gt; via your own &lt;code&gt;os.Args&lt;/code&gt; handling; the &lt;code&gt;tui&lt;/code&gt; package itself always runs interactively.&lt;/p&gt;</description></item><item><title>Development</title><link>https://oakwood-commons.github.io/kvx/docs/development/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://oakwood-commons.github.io/kvx/docs/development/</guid><description>&lt;h1 id="development"&gt;Development&lt;a class="anchor" href="#development"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;a class="anchor" href="#prerequisites"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Go 1.20+&lt;/li&gt;
&lt;li&gt;&lt;a href="https://taskfile.dev/"&gt;task&lt;/a&gt; (optional but recommended)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="building"&gt;Building&lt;a class="anchor" href="#building"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;task build &lt;span style="color:#8b949e;font-style:italic"&gt;# recommended (builds to dist/kvx)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go build -o dist/kvx . &lt;span style="color:#8b949e;font-style:italic"&gt;# alternative (always use -o dist/kvx)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The binary is built to &lt;code&gt;dist/kvx&lt;/code&gt;, not the root directory. Always use &lt;code&gt;-o dist/kvx&lt;/code&gt; when building manually.&lt;/p&gt;
&lt;h2 id="task-commands"&gt;Task Commands&lt;a class="anchor" href="#task-commands"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;task build &lt;span style="color:#8b949e;font-style:italic"&gt;# Build binary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;task run &lt;span style="color:#8b949e;font-style:italic"&gt;# Run with sample data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;task run-interactive &lt;span style="color:#8b949e;font-style:italic"&gt;# Run TUI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;task test &lt;span style="color:#8b949e;font-style:italic"&gt;# Run tests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go test ./... &lt;span style="color:#8b949e;font-style:italic"&gt;# Direct test execution&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="testing"&gt;Testing&lt;a class="anchor" href="#testing"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tests use fixture-based approach with deterministic Bubble Tea &lt;code&gt;Update()&lt;/code&gt; calls:&lt;/p&gt;</description></item></channel></rss>