<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>UnderControl Blog</title>
        <link>https://ud-docs.lintao-amons.workers.dev/blog</link>
        <description>UnderControl Blog</description>
        <lastBuildDate>Sun, 05 Apr 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Terminal-First Task Management with the ud CLI]]></title>
            <link>https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/cli-tool</link>
            <guid>https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/cli-tool</guid>
            <pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How UnDercontrol's kubectl-style CLI brings task management into your terminal workflow — with query syntax, TUI, and AI agent integration.]]></description>
            <content:encoded><![CDATA[<p>If you spend most of your day in a terminal, switching to a browser tab just to log a task or check what's on your plate is friction you don't need. The <code>ud</code> CLI was built to eliminate that context switch. It brings the full power of UnDercontrol — task CRUD, notes, querying, kanban boards — into your shell, and it follows a command structure you already know.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="kubectl-style-commands-because-it-works">kubectl-style Commands, Because It Works<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/cli-tool#kubectl-style-commands-because-it-works" class="hash-link" aria-label="Direct link to kubectl-style Commands, Because It Works" title="Direct link to kubectl-style Commands, Because It Works">​</a></h2>
<p>The CLI uses the same verb-resource pattern that made <code>kubectl</code> feel intuitive to so many engineers. You get, describe, apply, and delete resources. No new mental model required.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># List all tasks</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud get task</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Show full details on a task (short ID prefix supported)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud describe task 3de9f82b</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Create or update from a markdown file</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud apply -f task.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Delete a task</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud delete task abc123</span><br></span></code></pre></div></div>
<p>The <code>apply</code> command deserves a highlight. Your task is a markdown file with YAML frontmatter. If the file has an <code>id</code> field, it updates the existing task. No <code>id</code>? It creates a new one. This makes bulk updates, scripted workflows, and version-controlled task definitions straightforward.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">echo '---</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">title: Write release notes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">status: in-progress</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tags:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - release</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">deadline: 2026-04-10</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">---</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Draft the changelog and update the docs site.' | ud apply -f -</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/cli-tool/task-list.png" alt="Task list view — what the ud CLI manages from your terminal" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="query-syntax-that-actually-filters">Query Syntax That Actually Filters<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/cli-tool#query-syntax-that-actually-filters" class="hash-link" aria-label="Direct link to Query Syntax That Actually Filters" title="Direct link to Query Syntax That Actually Filters">​</a></h2>
<p><code>ud task query</code> gives you a SQL-like filter language over your tasks. It is useful when you have enough tasks that "scroll through the list" stops being a real strategy.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Tasks with a deadline this week</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task query "deadline BETWEEN 'today' AND '+7d'"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Active tasks tagged urgent</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task query "(status = 'todo' OR status = 'in-progress') AND tags = 'urgent'"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Title search</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task query "title ILIKE '%api%'"</span><br></span></code></pre></div></div>
<p>If you would rather not think about syntax at all, <code>ud task nlquery</code> accepts plain English and translates it via AI:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud task nlquery "show me overdue tasks"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task nlquery "tasks tagged with work that are not done"</span><br></span></code></pre></div></div>
<p>Both commands accept <code>--sort</code>, <code>--order</code>, and <code>--limit</code> flags for pagination and ordering, so they compose cleanly into scripts or shell aliases.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="notes-as-a-progress-log">Notes as a Progress Log<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/cli-tool#notes-as-a-progress-log" class="hash-link" aria-label="Direct link to Notes as a Progress Log" title="Direct link to Notes as a Progress Log">​</a></h2>
<p>Every task supports notes — short freeform entries that act as a running log. This is useful for tracking what you actually did, not just the end state.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud task note add 3de9f82b "Finished the backend changes, opening PR now"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task note ls 3de9f82b</span><br></span></code></pre></div></div>
<p>Notes also make the CLI a natural fit for AI agent workflows. An agent can create a task from a plan file, append progress notes at each step, and mark the task done — all without touching a browser. The human side of the team sees the full history in the UnDercontrol web UI or desktop app. It is a low-ceremony handoff that actually works in practice.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="interactive-tui-for-when-you-want-a-visual">Interactive TUI for When You Want a Visual<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/cli-tool#interactive-tui-for-when-you-want-a-visual" class="hash-link" aria-label="Direct link to Interactive TUI for When You Want a Visual" title="Direct link to Interactive TUI for When You Want a Visual">​</a></h2>
<p>Running <code>ud</code> with no arguments opens the terminal UI — a keyboard-driven kanban-style interface with vim bindings.</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/cli-tool/workspace-terminal.png" alt="Built-in terminal with ud CLI commands" class="img_ev3q"></p>
<table><thead><tr><th>Key</th><th>Action</th></tr></thead><tbody><tr><td><code>j</code> / <code>k</code></td><td>Move through tasks</td></tr><tr><td><code>Enter</code></td><td>Open task detail</td></tr><tr><td><code>i</code></td><td>Create a new task</td></tr><tr><td><code>x</code></td><td>Toggle status</td></tr><tr><td><code>/</code></td><td>Search</td></tr><tr><td><code>f</code></td><td>File picker (fuzzy search local files to create tasks from)</td></tr></tbody></table>
<p>The file picker is a nice touch. Press <code>f</code>, fuzzy-search a markdown file in your current directory, and it becomes a task — first line is the title, the rest becomes the description. Useful when you keep notes in a project repo and want them tracked.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="multi-context-for-multiple-servers">Multi-Context for Multiple Servers<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/cli-tool#multi-context-for-multiple-servers" class="hash-link" aria-label="Direct link to Multi-Context for Multiple Servers" title="Direct link to Multi-Context for Multiple Servers">​</a></h2>
<p>If you self-host UnDercontrol across multiple environments — personal, work, a staging instance — the context system handles it the same way <code>kubectl</code> does.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud config set-context work --api-url https://ud.company.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud login --context work</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Use a different context for a single command</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">UD_CONTEXT=personal ud get task</span><br></span></code></pre></div></div>
<p>Config lives in <code>~/.config/ud/config.yaml</code>. You can also drive the CLI entirely through environment variables (<code>UD_API_URL</code>, <code>UD_API_KEY</code>, <code>UD_TOKEN</code>), which makes it usable in CI pipelines without touching config files.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="getting-started">Getting Started<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/cli-tool#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started">​</a></h2>
<p>Install via npm, Homebrew, or a single curl command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm install -g @oatnil/ud</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># or</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">brew install oatnil-top/ud/ud</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># or</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">curl -fsSL https://get.oatnil.com/ud | bash</span><br></span></code></pre></div></div>
<p>Then point it at your UnDercontrol instance:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud login</span><br></span></code></pre></div></div>
<p>The full command reference — including file attachment, multi-context auth, and advanced query syntax — is in the <a href="https://ud-docs.lintao-amons.workers.dev/docs/cli">CLI Reference</a> docs. If you are not running UnDercontrol yet, the <a href="https://ud-docs.lintao-amons.workers.dev/docs/self-deployment">self-hosting guide</a> covers getting a server up with Docker in a few minutes.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Managing Multiple Accounts with CLI Contexts]]></title>
            <link>https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/multi-account-cli-contexts</link>
            <guid>https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/multi-account-cli-contexts</guid>
            <pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how UnDercontrol's kubectl-style context system lets you switch between multiple accounts and self-hosted instances from the command line.]]></description>
            <content:encoded><![CDATA[<p>If you run more than one UnDercontrol instance — say, a personal server and a work server — you've probably felt the friction of juggling different API endpoints and credentials. The <code>ud</code> CLI ships with a context system modeled after <code>kubectl</code>, so switching between accounts is a single command.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-a-context-is">What a Context Is<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/multi-account-cli-contexts#what-a-context-is" class="hash-link" aria-label="Direct link to What a Context Is" title="Direct link to What a Context Is">​</a></h2>
<p>A context in <code>ud</code> is a named configuration that bundles an API endpoint, credentials (either a session token from interactive login or a static API key), and a display username. Contexts live in <code>~/.config/ud/config.yaml</code> — nothing is sent anywhere.</p>
<p>A typical context list looks like this:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ ud config get-contexts</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CURRENT  NAME      API URL                           USER</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">*        personal  https://ud.home.example.com       me@example.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">         work      https://ud.corp.example.com       me@corp.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">         local     http://localhost:4000              admin@oatnil.com</span><br></span></code></pre></div></div>
<p>The asterisk marks the active context. Every <code>ud</code> command uses that context unless you override it.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="setting-up-your-first-context">Setting Up Your First Context<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/multi-account-cli-contexts#setting-up-your-first-context" class="hash-link" aria-label="Direct link to Setting Up Your First Context" title="Direct link to Setting Up Your First Context">​</a></h2>
<p>The fastest way to create a context is through login. The <code>-n</code> flag names the context in one step:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Login and create a named context</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud login --api-url https://ud.home.example.com -n personal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Add another for work</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud login --api-url https://ud.corp.example.com -n work</span><br></span></code></pre></div></div>
<p>This prompts for your credentials, authenticates, and saves the token under the given context name. If you need a context for CI/CD or headless environments where interactive login isn't practical, use <code>config set-context</code> with an API key:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud config set-context ci --api-url https://ud.corp.example.com --api-key ak_xxxxx</span><br></span></code></pre></div></div>
<p>Generate API keys from the UnDercontrol web interface under Settings. No browser prompt needed at runtime.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="switching-contexts">Switching Contexts<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/multi-account-cli-contexts#switching-contexts" class="hash-link" aria-label="Direct link to Switching Contexts" title="Direct link to Switching Contexts">​</a></h2>
<p>To switch your active context:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud config use-context work</span><br></span></code></pre></div></div>
<p>That's it. Your next <code>ud get task</code> or <code>ud describe task</code> hits the work server with work credentials. Switch back just as easily:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud config use-context personal</span><br></span></code></pre></div></div>
<p>If you're in the TUI, type <code>:ctx</code> in command mode to open an interactive context picker — arrow keys to navigate, Enter to confirm. Same muscle memory as <code>kubectx</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="one-off-overrides">One-off Overrides<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/multi-account-cli-contexts#one-off-overrides" class="hash-link" aria-label="Direct link to One-off Overrides" title="Direct link to One-off Overrides">​</a></h2>
<p>Sometimes you want to target a specific instance for a single command without permanently switching. The <code>--context</code> flag and environment variables handle this:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Use a named context for one command</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud --context work get task</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Or via environment variable</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">UD_CONTEXT=work ud get task</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Point at an arbitrary endpoint without a named context</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">UD_API_URL=http://localhost:4000 UD_API_KEY=dev-key ud get task</span><br></span></code></pre></div></div>
<p>The priority order is: <code>--context</code> flag &gt; <code>UD_CONTEXT</code> env var &gt; <code>current-context</code> in config file. This makes scripts explicit about which instance they target, regardless of whatever context happens to be active on the machine.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="independent-auth-per-context">Independent Auth Per Context<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/multi-account-cli-contexts#independent-auth-per-context" class="hash-link" aria-label="Direct link to Independent Auth Per Context" title="Direct link to Independent Auth Per Context">​</a></h2>
<p>Each context maintains its own authentication state. Logging out of one context doesn't affect others. If your work session token expires, re-login just that context:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud login --context work</span><br></span></code></pre></div></div>
<p>Your personal and local contexts remain untouched.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="inspecting-your-setup">Inspecting Your Setup<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/multi-account-cli-contexts#inspecting-your-setup" class="hash-link" aria-label="Direct link to Inspecting Your Setup" title="Direct link to Inspecting Your Setup">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Show which context is active</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud config current-context</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># List all contexts</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud config get-contexts</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># View the full config (tokens are masked)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud config view</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="housekeeping">Housekeeping<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/multi-account-cli-contexts#housekeeping" class="hash-link" aria-label="Direct link to Housekeeping" title="Direct link to Housekeeping">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Rename a context</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud config rename-context old-name new-name</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Delete a context you no longer need</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud config delete-context staging</span><br></span></code></pre></div></div>
<p>If you delete the currently active context, <code>ud</code> automatically switches to the first remaining one.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-this-matters-for-self-hosted-users">Why This Matters for Self-Hosted Users<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/multi-account-cli-contexts#why-this-matters-for-self-hosted-users" class="hash-link" aria-label="Direct link to Why This Matters for Self-Hosted Users" title="Direct link to Why This Matters for Self-Hosted Users">​</a></h2>
<p>UnDercontrol is built around the premise that your data belongs to you. Running your own instance is a first-class workflow. The context system reflects that — it assumes you might run multiple instances, want to move between them without friction, and need automation without compromising security.</p>
<p>Whether you're managing a personal instance, a family server, and a work deployment, or simply running local dev alongside production, contexts give you a clean mental model and a consistent CLI interface across all of them.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="get-started">Get Started<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/multi-account-cli-contexts#get-started" class="hash-link" aria-label="Direct link to Get Started" title="Direct link to Get Started">​</a></h2>
<p>Install the <code>ud</code> CLI via Homebrew (<code>brew install oatnil/ud/ud</code>) or grab a binary from the releases page. Set up your first context:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud login --api-url https://your-instance.example.com -n myserver</span><br></span></code></pre></div></div>
<p>Full documentation: <a href="https://ud-docs.lintao-amons.workers.dev/docs/cli-auth-context">CLI Authentication &amp; Contexts</a>.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Power User Queries and Saved Filters in UnDercontrol]]></title>
            <link>https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/query-syntax</link>
            <guid>https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/query-syntax</guid>
            <pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to use UnDercontrol's SQL-like query syntax, natural language search, and saved queries to find and filter tasks like a power user.]]></description>
            <content:encoded><![CDATA[<p>If you have more than a handful of tasks in UnDercontrol, you have probably hit the point where "scroll and scan" stops working. You know what you are looking for — overdue items, everything tagged <code>work</code> that is still in progress, tasks with no deadline yet — but getting to them quickly takes more than a status filter.</p>
<p>This post covers the query system built into UnDercontrol: a SQL-like syntax that works across the web UI, the CLI, custom views, kanban boards, and saved queries. Once it clicks, you will use it constantly.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-query-syntax">The Query Syntax<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/query-syntax#the-query-syntax" class="hash-link" aria-label="Direct link to The Query Syntax" title="Direct link to The Query Syntax">​</a></h2>
<p>The syntax is deliberately close to SQL WHERE clauses. If you have ever written a database query, it will feel familiar immediately. If you have not, the basics take about five minutes to pick up.</p>
<p>A simple query looks like this:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'todo'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain"> deadline </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'today'</span><br></span></code></pre></div></div>
<p>That finds every task that is still todo and due today or earlier — in other words, overdue todo items.</p>
<p>You can build on that with tags, text search, date ranges, and custom fields:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">deadline </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'today'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">OR</span><span class="token plain"> tags </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'urgent'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'done'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'archived'</span><br></span></code></pre></div></div>
<p>This is a reliable "needs attention now" query. Pin it as a saved query (more on that below) and you have a one-click urgent task list.</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/query-syntax/task-query.png" alt="Task search with query syntax filtering" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="datetime-expressions">Datetime Expressions<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/query-syntax#datetime-expressions" class="hash-link" aria-label="Direct link to Datetime Expressions" title="Direct link to Datetime Expressions">​</a></h2>
<p>One of the more practical parts of the syntax is the relative date support. Instead of hardcoding dates, you write things like <code>'-7d'</code>, <code>'+1w'</code>, or just <code>'today'</code>.</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">-- Tasks created in the last week</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">created_at </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'-7d'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">-- Due within the next month</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">deadline </span><span class="token operator" style="color:#393A34">BETWEEN</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'today'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'+1m'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">-- Updated today</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">updated_at </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'today'</span><br></span></code></pre></div></div>
<p>The supported units are days (<code>d</code>), weeks (<code>w</code>), months (<code>m</code>), and years (<code>y</code>), with <code>+</code> for future and <code>-</code> for past. Standard ISO 8601 dates like <code>2025-06-01</code> also work when you need a fixed date.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="text-search-and-custom-fields">Text Search and Custom Fields<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/query-syntax#text-search-and-custom-fields" class="hash-link" aria-label="Direct link to Text Search and Custom Fields" title="Direct link to Text Search and Custom Fields">​</a></h2>
<p>Text search uses <code>LIKE</code> (case-sensitive) and <code>ILIKE</code> (case-insensitive) with <code>%</code> as a wildcard:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">title </span><span class="token operator" style="color:#393A34">ILIKE</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'%api%'</span><br></span></code></pre></div></div>
<p>For custom fields, prefix with <code>cf.</code>:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cf</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">priority </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain"> cf</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">department </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'engineering'</span><br></span></code></pre></div></div>
<p>Custom fields support the full range of comparison operators depending on their type — numbers, text, selects, checkboxes, and user references all work.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="natural-language-queries">Natural Language Queries<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/query-syntax#natural-language-queries" class="hash-link" aria-label="Direct link to Natural Language Queries" title="Direct link to Natural Language Queries">​</a></h2>
<p>Writing queries manually is fast once you know the syntax. But if you would rather just describe what you want, the AI integration handles the translation.</p>
<p>In the web UI, open the AI Chat panel on the task page and type something like "show me overdue tasks that have the work tag". The AI generates the structured query and runs it.</p>
<p>From the CLI, use <code>ud task nlquery</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud task nlquery "tasks I need to finish this week"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task nlquery "high priority engineering items with no deadline"</span><br></span></code></pre></div></div>
<p>The <code>nl</code> alias also works if you want to save a few keystrokes. This requires an AI provider to be configured, but once it is set up it handles surprisingly natural phrasing.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="saved-queries">Saved Queries<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/query-syntax#saved-queries" class="hash-link" aria-label="Direct link to Saved Queries" title="Direct link to Saved Queries">​</a></h2>
<p>This is where the query system becomes genuinely useful day-to-day. Saved Queries let you name and store any query, then run it with a single click from the sidebar.</p>
<p>A few worth setting up immediately:</p>
<table><thead><tr><th>Name</th><th>Query</th></tr></thead><tbody><tr><td>Overdue</td><td><code>deadline &lt; 'today' AND status != 'done' AND status != 'archived'</code></td></tr><tr><td>Due This Week</td><td><code>deadline BETWEEN 'today' AND '+7d' AND status != 'done'</code></td></tr><tr><td>Unplanned</td><td><code>deadline IS NULL AND status = 'todo'</code></td></tr><tr><td>Recently Active</td><td><code>updated_at &gt;= '-7d' AND status IN ('todo', 'in-progress')</code></td></tr></tbody></table>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/query-syntax/saved-queries.png" alt="Saved queries for quick access to filtered views" class="img_ev3q"></p>
<p>You can pin queries to keep your most-used ones at the top, reorder them by drag and drop, and edit them at any time. When you click a saved query, results expand inline — no navigation required.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="using-queries-in-the-cli">Using Queries in the CLI<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/query-syntax#using-queries-in-the-cli" class="hash-link" aria-label="Direct link to Using Queries in the CLI" title="Direct link to Using Queries in the CLI">​</a></h2>
<p>The CLI supports the same query syntax through <code>ud task query</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud task query "status = 'todo'" --sort deadline --order asc</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task query "(status = 'todo' OR status = 'in-progress') AND tags = 'work'"</span><br></span></code></pre></div></div>
<p>Flags for pagination (<code>--page</code>, <code>--limit</code>) and sorting (<code>--sort</code>, <code>--order</code>) are available. This makes it straightforward to pipe results into other tools or use queries inside shell scripts.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="getting-started">Getting Started<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/query-syntax#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started">​</a></h2>
<p>The full query syntax reference is in the <a href="https://ud-docs.lintao-amons.workers.dev/docs/query-syntax">Query Syntax documentation</a>, including every operator, all datetime expression formats, and a full set of practical examples to copy and adapt.</p>
<p>If you are not running UnDercontrol yet, the <a href="https://ud-docs.lintao-amons.workers.dev/docs/self-deployment">self-hosting guide</a> covers deployment with Docker. Your data stays on your own infrastructure — that is the whole point.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Keep Your Files Where Your Work Lives: Resource Management in UnDercontrol]]></title>
            <link>https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/resource-management</link>
            <guid>https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/resource-management</guid>
            <pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How UnDercontrol's file and resource management keeps receipts, documents, and diagrams attached to the tasks and expenses they actually belong to.]]></description>
            <content:encoded><![CDATA[<p>Most productivity apps treat file storage as an afterthought — a folder somewhere, disconnected from the work it supports. UnDercontrol takes a different approach: files live next to the tasks, expenses, and budgets they belong to, so a receipt stays with the expense it documents and a design diagram stays with the task it informs.</p>
<p>Here is how the resource management system works in practice.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="upload-the-way-you-actually-work">Upload the Way You Actually Work<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/resource-management#upload-the-way-you-actually-work" class="hash-link" aria-label="Direct link to Upload the Way You Actually Work" title="Direct link to Upload the Way You Actually Work">​</a></h2>
<p>Getting files into UnDercontrol should not require a trip through a file picker every time. There are three main ways to upload:</p>
<p><strong>Drag and drop</strong> — open the Resources page or an attachment panel on a task or expense, then drag a file in. Works for single files and batches.</p>
<p><strong>Paste from clipboard</strong> — press Ctrl+V and the file in your clipboard uploads immediately. This is particularly useful for screenshots. Take a screenshot of a receipt or a bug in a UI, switch to UnDercontrol, paste. No saving to disk first.</p>
<p><strong>CLI upload</strong> — if you live in the terminal, the <code>ud</code> CLI handles uploads directly:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud upload resource ./receipt.png --entity-type expense --entity-id exp-456</span><br></span></code></pre></div></div>
<p>This is useful for scripted workflows, like automatically attaching exported reports to a monthly budget review task.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="attach-once-reference-everywhere">Attach Once, Reference Everywhere<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/resource-management#attach-once-reference-everywhere" class="hash-link" aria-label="Direct link to Attach Once, Reference Everywhere" title="Direct link to Attach Once, Reference Everywhere">​</a></h2>
<p>A single resource can be linked to multiple items. If you have a contract PDF that is relevant to both a budget and a task, you attach it to both — no duplicates, no hunting through folders. When the task gets marked done, you can unlink the file from it while keeping it attached to the budget.</p>
<p>The inspector panel shows you exactly where a file is attached, so you never lose track of which items reference it.</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/resource-management/task-with-attachments.png" alt="Task list view — files attach directly to tasks, expenses, and budgets" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="find-what-you-need">Find What You Need<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/resource-management#find-what-you-need" class="hash-link" aria-label="Direct link to Find What You Need" title="Direct link to Find What You Need">​</a></h2>
<p>The Resources page gives you a full overview of uploaded files with filtering built in. You can narrow down by file type, by which entity type the file is attached to (tasks, expenses, budgets, accounts), or by a date range. For images, the gallery view shows thumbnails so you can visually scan a set of receipts or screenshots without opening each one.</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/resource-management/resources-grid.png" alt="Resource management page showing uploaded files with thumbnails and metadata" class="img_ev3q"></p>
<p>The inspector also surfaces EXIF metadata for photos — useful if you need to confirm when a photo was taken or where.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="storage-local-or-s3">Storage: Local or S3<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/resource-management#storage-local-or-s3" class="hash-link" aria-label="Direct link to Storage: Local or S3" title="Direct link to Storage: Local or S3">​</a></h2>
<p>Because UnDercontrol is self-hosted, you control where your files are stored. The default is local disk storage, which works fine for personal use on a home server or VPS. For larger setups or remote access, you can configure S3-compatible object storage — AWS S3, Backblaze B2, MinIO, whatever you already have.</p>
<p>The key point: your files do not flow through a third-party service. They go from your browser to your server.</p>
<p>Storage limits are configurable. Regular users get 1 GB and a 10 MB per-file cap by default. Admins can operate without limits.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="drawio-diagrams-in-app">Drawio Diagrams, In-App<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/resource-management#drawio-diagrams-in-app" class="hash-link" aria-label="Direct link to Drawio Diagrams, In-App" title="Direct link to Drawio Diagrams, In-App">​</a></h2>
<p>If your workflow involves system diagrams, flow charts, or architecture sketches, UnDercontrol includes built-in drawio support. You can create and edit diagrams directly in the app. No export-to-PNG, no switching to a separate tool and re-uploading. The diagram file lives as a resource attached to whatever task or note it belongs to.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ai-on-images">AI on Images<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/resource-management#ai-on-images" class="hash-link" aria-label="Direct link to AI on Images" title="Direct link to AI on Images">​</a></h2>
<p>For receipts and document scans, the AI integration is worth knowing about. You can open an image resource and ask the AI to extract information from it — line items from a receipt, text from a scanned form. This feeds naturally into the expense tracking workflow: photograph a receipt, attach it to an expense, and let the AI pull out the amount and merchant name.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-this-looks-like-day-to-day">What This Looks Like Day-to-Day<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/resource-management#what-this-looks-like-day-to-day" class="hash-link" aria-label="Direct link to What This Looks Like Day-to-Day" title="Direct link to What This Looks Like Day-to-Day">​</a></h2>
<p>A practical example: you are tracking a freelance project. There is a task for "Review client contract." You attach the contract PDF to that task. Later, you log an expense for software you purchased for the project. You attach the invoice to the expense. Both files show up in the Resources page, filtered by entity type if you want to see only expense attachments, or together if you want a full file audit for the project.</p>
<p>Everything is in one place. No external file hosting, no email threads to dig through.</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/resource-management/budget-overview.png" alt="Budget overview — receipts and invoices attach to expenses within budgets" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="get-started">Get Started<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/05/resource-management#get-started" class="hash-link" aria-label="Direct link to Get Started" title="Direct link to Get Started">​</a></h2>
<p>If you are already running UnDercontrol, the Resources page is available in the main navigation. If you are evaluating whether to self-host, the <a href="https://ud-docs.lintao-amons.workers.dev/docs/self-deployment">deployment guide</a> covers setting up your instance including storage configuration.</p>
<p>The <a href="https://ud-docs.lintao-amons.workers.dev/docs/features/resources">Resource Management documentation</a> has the full reference for CLI commands, storage configuration, and entity attachment options.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[AI-Powered Workflows in UnDercontrol — From Receipt to Record in Seconds]]></title>
            <link>https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/ai-assistant</link>
            <guid>https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/ai-assistant</guid>
            <pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how UnDercontrol's AI assistant turns photos, text, and voice into structured expenses and tasks — including Apple Shortcuts for one-tap capture.]]></description>
            <content:encoded><![CDATA[<p>The part of personal finance and task management that nobody enjoys is the data entry. You finish lunch, you have a receipt, and now you have to open an app, tap through a form, type in the amount, pick a category, and save. Multiply that by every coffee, taxi, and grocery run and it becomes a real friction point.</p>
<p>UnDercontrol's AI assistant is built to eliminate that friction. Here is how it actually works in practice.</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/ai-assistant/dashboard.png" alt="UnDercontrol dashboard — AI assistant integrates across all features" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="snap-a-receipt-skip-the-form">Snap a Receipt, Skip the Form<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/ai-assistant#snap-a-receipt-skip-the-form" class="hash-link" aria-label="Direct link to Snap a Receipt, Skip the Form" title="Direct link to Snap a Receipt, Skip the Form">​</a></h2>
<p>The most immediately useful AI feature is receipt scanning. When you create a new expense, you can upload a photo — drag and drop, paste from clipboard, or select a file. The AI reads the image and extracts the amount, currency, merchant name, date, and a suggested category.</p>
<p>It handles crumpled receipts, tilted angles, and different receipt formats reasonably well. The key practical tip: good lighting matters more than perfect alignment. A clear photo in decent light will almost always parse correctly. A blurry photo taken in a dim restaurant probably will not.</p>
<p>You can also batch-upload multiple receipts at once, which is useful after a work trip or a week where you let things pile up.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="text-input-for-quick-logging">Text Input for Quick Logging<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/ai-assistant#text-input-for-quick-logging" class="hash-link" aria-label="Direct link to Text Input for Quick Logging" title="Direct link to Text Input for Quick Logging">​</a></h2>
<p>Not every expense comes with a receipt. For those, you can just describe it in plain English:</p>
<ul>
<li>"Lunch at the noodle place, 18 dollars"</li>
<li>"Uber home from the airport, 34 EUR"</li>
<li>"Monthly Figma subscription 15 USD"</li>
</ul>
<p>The AI parses the description into a structured expense with the right fields filled in. It is faster than tapping through a form, especially on mobile.</p>
<p>The same pattern works for tasks. Instead of filling out a task form, you describe what needs to happen:</p>
<ul>
<li>"Follow up with the accountant about Q1 taxes"</li>
<li>"Buy a birthday gift for Sarah before Friday"</li>
<li>"Research self-hosted backup solutions"</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/ai-assistant/task-list.png" alt="Task list — AI can create and manage tasks from text or voice input" class="img_ev3q"></p>
<p>UnDercontrol creates a structured task from the description, including a title, any relevant tags it can infer, and a description. You review it, adjust anything that looks off, and save.</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/ai-assistant/ai-chat.png" alt="AI assistant chat interface for logging expenses and creating tasks" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="natural-language-queries">Natural Language Queries<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/ai-assistant#natural-language-queries" class="hash-link" aria-label="Direct link to Natural Language Queries" title="Direct link to Natural Language Queries">​</a></h2>
<p>Once you have tasks and expenses in the system, you can ask questions about them in plain language. Things like "show me overdue tasks" or "what is due this week" get translated into a query and return the matching results. It is not magic — it works best with straightforward questions — but it removes the need to remember UnDercontrol's query syntax for everyday lookups.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="apple-shortcuts-integration">Apple Shortcuts Integration<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/ai-assistant#apple-shortcuts-integration" class="hash-link" aria-label="Direct link to Apple Shortcuts Integration" title="Direct link to Apple Shortcuts Integration">​</a></h2>
<p>On iOS and macOS, UnDercontrol provides Apple Shortcuts that wire the AI features into the system share sheet and shortcut automation. The practical upside is one-tap capture from anywhere on your device.</p>
<p>The most useful shortcut: snap a photo with your camera, run the shortcut, and the receipt gets logged as an expense without ever opening the app. You can also share text — a copied email snippet, a message, a note — and have a task created from it directly.</p>
<p>The shortcuts are available to download from the Subscribe/Download page in your UnDercontrol instance.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bring-your-own-ai-provider">Bring Your Own AI Provider<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/ai-assistant#bring-your-own-ai-provider" class="hash-link" aria-label="Direct link to Bring Your Own AI Provider" title="Direct link to Bring Your Own AI Provider">​</a></h2>
<p>UnDercontrol does not lock you into one AI backend. You can connect your own API key from OpenAI, Anthropic, or any OpenAI-compatible service. There is also support for local models via Ollama or LM Studio if you want everything running on your own hardware with no external API calls at all.</p>
<p>Setup is straightforward: go to Profile settings, find the AI Providers section, add your provider and API key, pick a model, and test the connection. You can add multiple providers and prioritize them. The first working provider in your list is what gets used.</p>
<p>If you are running a shared UnDercontrol instance, an administrator can also configure system-level providers that are available to all users — useful for a family server or a small team.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-to-keep-in-mind">What to Keep in Mind<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/ai-assistant#what-to-keep-in-mind" class="hash-link" aria-label="Direct link to What to Keep in Mind" title="Direct link to What to Keep in Mind">​</a></h2>
<p>AI extraction is good but not perfect. Always glance at the parsed result before saving, especially the amount and date fields. A receipt where the total is visually close to a subtotal line can confuse the parser. Two seconds of review is faster than hunting down a mis-logged expense later.</p>
<p>For text input, more specific descriptions give better results. "Coffee" is harder to categorize than "coffee at the airport before the flight, 6.50 USD."</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="getting-started">Getting Started<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/ai-assistant#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started">​</a></h2>
<p>If you are already running UnDercontrol, head to your Profile settings and add an AI provider. Then try uploading a receipt the next time you log an expense — the difference in workflow is noticeable immediately.</p>
<p>If you have not set up UnDercontrol yet, the self-hosting guide covers everything from Docker deployment to configuration: <a href="https://undercontrol.dev/docs/intro" target="_blank" rel="noopener noreferrer">UnDercontrol Documentation</a>.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Take Control of Your Personal Finances with UnDercontrol's Budget Tracker]]></title>
            <link>https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/budget-expense-tracking</link>
            <guid>https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/budget-expense-tracking</guid>
            <pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how UnDercontrol's budget management feature helps you track spending, log expenses, and stay on top of your finances — all self-hosted.]]></description>
            <content:encoded><![CDATA[<p>Most personal finance tools make you choose between privacy and functionality. Either you hand over your financial data to a cloud service, or you settle for a spreadsheet that breaks the moment your situation gets even slightly complicated. UnDercontrol takes a different approach: a full-featured budget tracker that runs on your own infrastructure, with your data staying exactly where it belongs.</p>
<p>Here's a practical look at how budget tracking works in UnDercontrol.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="creating-a-budget-that-reflects-reality">Creating a Budget That Reflects Reality<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/budget-expense-tracking#creating-a-budget-that-reflects-reality" class="hash-link" aria-label="Direct link to Creating a Budget That Reflects Reality" title="Direct link to Creating a Budget That Reflects Reality">​</a></h2>
<p>Setting up a budget in UnDercontrol starts with the basics: a name, an initial amount, a start date, and a recurrence frequency. Weekly, monthly, quarterly, or yearly — pick whatever matches how you actually think about money.</p>
<p>But the real power comes from budget plans. Instead of locking you into a single fixed amount, UnDercontrol lets you add new plans over time. Say you start the year with a $500/month grocery budget, then prices go up and you need to revise it to $650 in March. You add a new plan with the updated amount. The system handles the math — calculating totals based on which plan was active during which periods — so your historical data stays accurate and your current view is always up to date.</p>
<p>One-time adjustments fill in the gaps that recurring plans can't cover. Got an unexpected refund? A bonus allocation from a project? A correction to fix a data entry mistake? Each adjustment records an amount, a date, and an optional reason. Future you will appreciate those reasons when reconciling months later.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="logging-expenses-and-linking-them-to-budgets">Logging Expenses and Linking Them to Budgets<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/budget-expense-tracking#logging-expenses-and-linking-them-to-budgets" class="hash-link" aria-label="Direct link to Logging Expenses and Linking Them to Budgets" title="Direct link to Logging Expenses and Linking Them to Budgets">​</a></h2>
<p>Expenses in UnDercontrol are first-class records. When you log an expense, you can link it to a specific budget. That link is what powers the "budget vs. actual" view — the expense amount rolls up into the budget's spent total, and it appears in that budget's ledger.</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/budget-expense-tracking/transactions.png" alt="Transaction list with expense entries" class="img_ev3q"></p>
<p>This design means you can also have expenses that aren't tied to any budget, which is intentional. Not every transaction needs to be categorized immediately. You can log it, come back later, and link it when it makes sense.</p>
<p>The budget detail page brings everything together: a hero section showing total allocated, total spent, and remaining balance at a glance, plus a spending trend chart that plots your actual spend against the budget line over 7, 30, or 90 days. If you're running a monthly grocery budget and the chart shows you've crossed the allocation line by day 22, that's a clear signal — no mental math required.</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/budget-expense-tracking/budget-detail.png" alt="Budget detail with spending trend chart" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="multi-account-support-and-the-full-picture">Multi-Account Support and the Full Picture<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/budget-expense-tracking#multi-account-support-and-the-full-picture" class="hash-link" aria-label="Direct link to Multi-Account Support and the Full Picture" title="Direct link to Multi-Account Support and the Full Picture">​</a></h2>
<p>UnDercontrol's account system lets you track money across multiple sources — checking, savings, a separate business account, whatever your setup looks like. Budget accounts contribute to your overall available balance, so when you're planning a new budget, you're working with real numbers rather than guesswork.</p>
<p>This becomes especially useful when you're managing finances for a small team or household. The collaboration system lets you share budgets with other users, so multiple people can log expenses against the same budget and see the same real-time totals. No more emailing spreadsheets back and forth or manually reconciling two separate tracking systems.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="staying-on-top-of-spending-without-the-overhead">Staying on Top of Spending Without the Overhead<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/budget-expense-tracking#staying-on-top-of-spending-without-the-overhead" class="hash-link" aria-label="Direct link to Staying on Top of Spending Without the Overhead" title="Direct link to Staying on Top of Spending Without the Overhead">​</a></h2>
<p>The budget list page is designed to give you a quick read on everything at once. Progress bars, spent and remaining amounts, and a summary sidebar with aggregated totals across all budgets. Search to find specific budgets quickly. A "Show hidden" toggle for budgets you want to archive without deleting.</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/budget-expense-tracking/budget-list.png" alt="Budget overview with progress bars showing spent vs remaining" class="img_ev3q"></p>
<p>Privacy mode deserves a mention: toggle it to hide all monetary amounts across the interface. Useful when you're screen sharing during a meeting and don't need to explain your personal grocery budget to coworkers.</p>
<p>For reporting and data portability, UnDercontrol supports data export so you can pull your expense history out in a structured format. Since you're self-hosting, you also have direct access to the underlying database if you need to run your own queries or pipe data into another tool.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="self-hosted-your-rules">Self-Hosted, Your Rules<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/budget-expense-tracking#self-hosted-your-rules" class="hash-link" aria-label="Direct link to Self-Hosted, Your Rules" title="Direct link to Self-Hosted, Your Rules">​</a></h2>
<p>Everything described here runs on your own server. Your financial data doesn't pass through anyone else's infrastructure. You control the backups, the access, and the retention policy. For anyone who's ever felt uncomfortable typing their bank transactions into a third-party app, that matters.</p>
<p>If you want to get started, the <a href="https://ud-docs.lintao-amons.workers.dev/docs/self-deployment">self-deployment guide</a> walks through setting up UnDercontrol with Docker. The <a href="https://ud-docs.lintao-amons.workers.dev/docs/features/budget">budget documentation</a> covers every feature in detail, including how budget totals are calculated and how to use adjustments effectively.</p>
<p>Set up your first budget, link a few expenses, and check back in a week. The spending trend chart will tell you more than any spreadsheet ever did.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Visual Project Management with Kanban Boards in UnderControl]]></title>
            <link>https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/kanban-boards</link>
            <guid>https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/kanban-boards</guid>
            <pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how UnderControl's kanban boards bring drag-and-drop task management with auto status updates, custom columns, and team sharing to your self-hosted setup.]]></description>
            <content:encoded><![CDATA[<p>If you have been managing tasks through a flat list and wondering when things started feeling unwieldy, kanban boards are probably the answer. UnderControl's kanban view gives you a column-based layout over your existing tasks — no separate system to maintain, no data duplication, just a better way to see what is actually happening.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-board-is-a-view-not-a-silo">The Board is a View, Not a Silo<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/kanban-boards#the-board-is-a-view-not-a-silo" class="hash-link" aria-label="Direct link to The Board is a View, Not a Silo" title="Direct link to The Board is a View, Not a Silo">​</a></h2>
<p>This is the part worth understanding before anything else. In UnderControl, a kanban board is a visual layer on top of your task system. When you drag a card from "Todo" to "In Progress," you are not just moving a card on a board — you are updating the task's status. That change shows up immediately in your task list, your CLI queries, everywhere. There is no synchronization problem because there is only one source of truth.</p>
<p>This means you can switch between kanban and list views freely without worrying about things getting out of sync.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="getting-started-the-all-tasks-board">Getting Started: The All Tasks Board<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/kanban-boards#getting-started-the-all-tasks-board" class="hash-link" aria-label="Direct link to Getting Started: The All Tasks Board" title="Direct link to Getting Started: The All Tasks Board">​</a></h2>
<p>Every account comes with a built-in "All Tasks" board. Open it and you will see all your tasks organized across six columns: Todo, In Progress, Pending, Stale, Done, and Archived. This board cannot be deleted and it always appears first.</p>
<p>It is a good place to start. Drag a task from Todo to In Progress, and watch the status update instantly. That is the basic loop — visual placement drives task state, not the other way around.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="custom-boards-with-query-based-columns">Custom Boards with Query-Based Columns<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/kanban-boards#custom-boards-with-query-based-columns" class="hash-link" aria-label="Direct link to Custom Boards with Query-Based Columns" title="Direct link to Custom Boards with Query-Based Columns">​</a></h2>
<p>Where things get interesting is when you create your own boards. Each column is defined by a filter condition — essentially a query that determines which tasks belong there. A "Blocked" column might filter for tasks tagged <code>blocked</code>. A "Due This Week" column could filter on due date. The column is not just a label; it is a live query.</p>
<p>When you configure column actions, moving a card becomes a trigger. Drag a task into the "Done" column and it gets marked done automatically. Move something into a "Needs Review" column and it can be tagged and assigned in one gesture. You define what dragging into a column means, and the board handles the bookkeeping.</p>
<p>This is genuinely useful for multi-step workflows. If your process is something like Draft -&gt; Review -&gt; Ready to Ship -&gt; Done, you can model that exactly — with each column transition doing the right thing to the underlying task data.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="private-and-shared-boards">Private and Shared Boards<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/kanban-boards#private-and-shared-boards" class="hash-link" aria-label="Direct link to Private and Shared Boards" title="Direct link to Private and Shared Boards">​</a></h2>
<p>Private boards are scoped to you. You can create as many as you need — one for a side project, one for your weekly planning, one for a home renovation. They all pull from your full task pool, filtered through whatever columns you configure.</p>
<p>Shared boards work differently. When you share a board with a group, the board only shows tasks that belong to that group. Everyone in the group can see the board and move cards around based on their permissions. It is a clean model: the board's scope is the group, and access is controlled through group membership.</p>
<p>This makes shared boards practical for small teams. A sprint board for a two- or three-person team, where everyone can see what is in progress and what is blocked, is easy to set up and does not require any additional tooling.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="a-few-workflow-patterns-worth-trying">A Few Workflow Patterns Worth Trying<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/kanban-boards#a-few-workflow-patterns-worth-trying" class="hash-link" aria-label="Direct link to A Few Workflow Patterns Worth Trying" title="Direct link to A Few Workflow Patterns Worth Trying">​</a></h2>
<p>If you are not sure how to structure a board, here are a few approaches that work well:</p>
<p>A <strong>status-based board</strong> mirrors the default setup — Todo, In Progress, Done. Simple, low-overhead, good for solo work.</p>
<p>A <strong>time-based board</strong> uses columns like Backlog, This Week, Today, and Done. The filter conditions look at due dates or custom fields rather than status. Dragging a task into "Today" can update a priority field automatically.</p>
<p>A <strong>project board</strong> with shared access uses the group feature to scope tasks to a specific project. Columns map to your team's actual workflow stages, and everyone operates from the same board.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="everything-stays-connected">Everything Stays Connected<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/kanban-boards#everything-stays-connected" class="hash-link" aria-label="Direct link to Everything Stays Connected" title="Direct link to Everything Stays Connected">​</a></h2>
<p>Because boards are built on top of the same task and tag system as the rest of UnderControl, they compose naturally with other features. Tags you use in task filters work as column conditions. Custom fields you create for a project can drive column membership and be updated by column actions. The board is not a separate module — it is the task system made visual.</p>
<p>If you want to see how this fits into the broader setup, the <a href="https://ud-docs.lintao-amons.workers.dev/docs/features/kanban">Kanban Boards documentation</a> covers column configuration, automatic actions, and sharing in detail. And if you are not running UnderControl yet, the <a href="https://ud-docs.lintao-amons.workers.dev/docs/self-deployment">self-hosting guide</a> will get you up and running in under an hour — your data stays on your infrastructure, always.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[How UnderControl Handles Task Management: Views, Links, and the CLI]]></title>
            <link>https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/task-management-overview</link>
            <guid>https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/task-management-overview</guid>
            <pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A practical look at UnderControl's task system — multiple views, bidirectional linking, markdown notes, and a kubectl-style CLI for power users.]]></description>
            <content:encoded><![CDATA[<p>Most task managers give you a list. Maybe a kanban board if you're lucky. UnderControl takes a different approach: your tasks are a data structure you can view, query, and manipulate from multiple angles — whether you're in the browser, the desktop app, or a terminal.</p>
<p>Here's a practical walkthrough of how the task system works.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="six-statuses-that-actually-mean-something">Six Statuses That Actually Mean Something<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/task-management-overview#six-statuses-that-actually-mean-something" class="hash-link" aria-label="Direct link to Six Statuses That Actually Mean Something" title="Direct link to Six Statuses That Actually Mean Something">​</a></h2>
<p>Tasks in UnderControl move through six statuses: <strong>Todo</strong>, <strong>In Progress</strong>, <strong>Pending</strong>, <strong>Done</strong>, <strong>Stale</strong>, and <strong>Archived</strong>.</p>
<p>The distinction between Pending and Stale is one I find genuinely useful. Pending means you're deliberately waiting — on a reply, a dependency, a decision. Stale means the task just hasn't been touched in a while. That difference matters when you're doing a weekly review and trying to figure out what to act on versus what to clean up.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="pick-the-view-that-matches-your-mental-model">Pick the View That Matches Your Mental Model<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/task-management-overview#pick-the-view-that-matches-your-mental-model" class="hash-link" aria-label="Direct link to Pick the View That Matches Your Mental Model" title="Direct link to Pick the View That Matches Your Mental Model">​</a></h2>
<p>Different work calls for different views. UnderControl gives you seven:</p>
<ul>
<li><strong>List</strong> — The default. Fast, filterable, keyboard-friendly.</li>
<li><strong>Kanban</strong> — Drag cards between status columns. Good for sprint-style work.</li>
<li><strong>Calendar</strong> — Tasks plotted by deadline. Useful before a busy week.</li>
<li><strong>Tree</strong> — Hierarchical view of parent and child tasks. Great for projects with nested sub-tasks.</li>
<li><strong>Graph</strong> — A node-link diagram of all your bidirectional task relationships. Looks cool, but also genuinely useful for spotting how things connect.</li>
<li><strong>Mindmap</strong> — Freeform brainstorming layout.</li>
<li><strong>Trash</strong> — Review and restore deleted tasks.</li>
</ul>
<p>Switching between views doesn't change your data — it's the same tasks, just rendered differently. The Graph view in particular is worth trying if you use linked tasks heavily.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bidirectional-linking">Bidirectional Linking<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/task-management-overview#bidirectional-linking" class="hash-link" aria-label="Direct link to Bidirectional Linking" title="Direct link to Bidirectional Linking">​</a></h2>
<p>You can link any two tasks together, and the connection is bidirectional — follow it from either side. Over time, this turns your task list into something closer to a knowledge graph. The Graph view is where this becomes visible: nodes are tasks, edges are links, and you can see clusters form around related work.</p>
<p>Derived tasks (parent-child relationships) work differently. When you create a task from an existing one, the child inherits context from the parent and links back to it automatically. This is the right pattern for breaking down a large project into concrete steps.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="markdown-notes-with-edit-history">Markdown Notes with Edit History<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/task-management-overview#markdown-notes-with-edit-history" class="hash-link" aria-label="Direct link to Markdown Notes with Edit History" title="Direct link to Markdown Notes with Edit History">​</a></h2>
<p>Every task has a notes section. Notes support full markdown — headers, code blocks, lists, links. More importantly, every note keeps a full edit history. If you wrote something, changed your mind, and want to go back, you can revert to any previous version.</p>
<p>I use notes for things like decision logs, blockers, and meeting summaries attached to a task. It keeps everything in one place instead of scattered across documents and chat threads.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="filtering-and-queries">Filtering and Queries<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/task-management-overview#filtering-and-queries" class="hash-link" aria-label="Direct link to Filtering and Queries" title="Direct link to Filtering and Queries">​</a></h2>
<p>The quick filters cover the common cases: filter by status, tags, or deadline range (overdue, today, this week, and so on). For more specific needs, there's a structured query language:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">status = 'pending' AND tag:work = 'true'</span><br></span></code></pre></div></div>
<p>If you don't want to write the query yourself, the AI assistant accepts plain English — something like "show me overdue tasks tagged with client work" — and translates it into a filter.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="file-attachments-and-sharing">File Attachments and Sharing<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/task-management-overview#file-attachments-and-sharing" class="hash-link" aria-label="Direct link to File Attachments and Sharing" title="Direct link to File Attachments and Sharing">​</a></h2>
<p>Attach any file to a task — images, PDFs, diagrams, exported reports. The attachments live on your server, under your control.</p>
<p>For sharing, you can generate a public link to a specific task with an optional expiration date. Or share with a group and set whether they get read or read-write access.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-cli-is-a-first-class-interface">The CLI Is a First-Class Interface<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/task-management-overview#the-cli-is-a-first-class-interface" class="hash-link" aria-label="Direct link to The CLI Is a First-Class Interface" title="Direct link to The CLI Is a First-Class Interface">​</a></h2>
<p>If you work in a terminal, <code>ud</code> gives you the full task API from the command line:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud task list</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task create "Review Q2 metrics"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task done &lt;id&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task query "status = 'todo' AND deadline &lt; '2026-05-01'"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task apply -f task.md</span><br></span></code></pre></div></div>
<p>The <code>apply</code> command is particularly useful — you can write a task in a markdown file and push it to UnderControl, which fits nicely into scripting and automation workflows. The CLI follows kubectl-style conventions, so if you spend time in Kubernetes or similar tools, the patterns feel familiar.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="recurring-tasks-and-check-ins">Recurring Tasks and Check-ins<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/task-management-overview#recurring-tasks-and-check-ins" class="hash-link" aria-label="Direct link to Recurring Tasks and Check-ins" title="Direct link to Recurring Tasks and Check-ins">​</a></h2>
<p>For repeating work, recurring tasks generate new task instances on a schedule — daily standups, weekly reviews, monthly reports. You can use presets or write a custom CRON expression.</p>
<p>Check-ins are a lighter-weight alternative for habit tracking: each check-in increments a counter and records a timestamp, giving you a simple log of consistency without the overhead of a full task lifecycle.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="try-it-yourself">Try It Yourself<a href="https://ud-docs.lintao-amons.workers.dev/blog/2026/04/04/task-management-overview#try-it-yourself" class="hash-link" aria-label="Direct link to Try It Yourself" title="Direct link to Try It Yourself">​</a></h2>
<p>All of this runs on your own infrastructure. No data leaves your server, no subscriptions, no vendor lock-in.</p>
<p>The full task management documentation is at <a href="https://undercontrol.dev/docs/tasks" target="_blank" rel="noopener noreferrer">undercontrol.dev/docs/tasks</a>, and the self-hosting guide covers deployment with Docker or the prebuilt binaries. If you run into anything, the GitHub repo is the right place to file issues or ask questions.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
    </channel>
</rss>