<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tomas Truben</title>
    <description>The latest articles on DEV Community by Tomas Truben (@tomastruben).</description>
    <link>https://dev.to/tomastruben</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3384952%2F7d4ca1a1-1f08-4cde-800a-75fe4a70258c.jpeg</url>
      <title>DEV Community: Tomas Truben</title>
      <link>https://dev.to/tomastruben</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tomastruben"/>
    <language>en</language>
    <item>
      <title>I built a self-improving home server that autoconfigures itself</title>
      <dc:creator>Tomas Truben</dc:creator>
      <pubDate>Wed, 15 Apr 2026 18:14:49 +0000</pubDate>
      <link>https://dev.to/tomastruben/i-built-a-self-improving-home-server-that-autoconfigures-itself-e0p</link>
      <guid>https://dev.to/tomastruben/i-built-a-self-improving-home-server-that-autoconfigures-itself-e0p</guid>
      <description>&lt;p&gt;I built &lt;strong&gt;Talome&lt;/strong&gt; over the last couple of weeks. It's an open-source home server platform (AGPL-3.0) where AI is the primary interface. You tell it what you want in plain English, and it does the work — installs apps, wires services together, monitors containers, creates new apps, and when I'm really annoyed at the UI, rewrites its own source code.&lt;/p&gt;

&lt;p&gt;No YAML. No wiki tabs. No spreadsheet of port assignments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7slrojtf3y5da42vlws.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7slrojtf3y5da42vlws.gif" alt="Talome demo" width="640" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The one-message media stack
&lt;/h2&gt;

&lt;p&gt;If you've ever set up a media server, you know the drill. Install Jellyfin. Install Sonarr. Install Radarr. Install Prowlarr. Install qBittorrent. Now wire them together — Sonarr needs to know about qBittorrent, Radarr needs the same, Prowlarr needs to push indexers to both. Each service has its own web UI, its own settings page, its own API key format.&lt;/p&gt;

&lt;p&gt;It's an afternoon of work, every single time.&lt;/p&gt;

&lt;p&gt;In Talome, it's one message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;User:&lt;/strong&gt; Set up a media server with Jellyfin, Sonarr, Radarr, Prowlarr, and qBittorrent. My media is at &lt;code&gt;/mnt/media&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Behind the scenes, the assistant chains through 10+ tool calls — &lt;code&gt;search_apps&lt;/code&gt;, &lt;code&gt;install_app&lt;/code&gt; (x5), &lt;code&gt;wire_apps&lt;/code&gt;, &lt;code&gt;arr_add_root_folder&lt;/code&gt;, &lt;code&gt;arr_add_download_client&lt;/code&gt;, &lt;code&gt;arr_sync_indexers_from_prowlarr&lt;/code&gt;, &lt;code&gt;check_service_health&lt;/code&gt; — and reports back with URLs. About 60 seconds later, everything is running, connected, and ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's inside
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Installs and wires services together&lt;/strong&gt; — download clients, API keys, root folders, quality profiles. One message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suggests what to put on tonight&lt;/strong&gt; — learns what you watch, pulls from Plex/Jellyfin on-deck and your Radarr library, asks if you're in the mood for the same thing or something new.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Organizes your audiobook library&lt;/strong&gt; — Audiobookshelf integration, cover art, metadata, series grouping, ID3 cleanup. No more &lt;code&gt;Volume 1 — track 03.mp3&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Background monitoring&lt;/strong&gt; — rule-based detectors every 60s, LLM triage, attempted remediation. You wake up to a summary instead of a page at 3am.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Self-improvement&lt;/strong&gt; — reads its own TypeScript source, writes fixes, runs the type checker, rolls back via &lt;code&gt;git stash&lt;/code&gt; if anything breaks. Yes, it can edit its own UI. No, it hasn't escaped yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creates new apps from a description&lt;/strong&gt; — "a dashboard that shames me for how many Docker containers I have running" becomes a working app with its own web UI, built against Talome's design system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uses Claude Code under the hood for heavy lifting&lt;/strong&gt; — app scaffolding and self-improvement run through headless Claude Code, which means the interactive chat stays cheap and fast while the expensive work happens out of band.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP server + skills&lt;/strong&gt; — drive every Talome tool from Claude Code or Cursor. Skills like &lt;code&gt;/create-app&lt;/code&gt;, &lt;code&gt;/self-improve&lt;/code&gt;, &lt;code&gt;/add-domain&lt;/code&gt; are part of the repo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dashboard&lt;/strong&gt; with drag-and-drop widgets, cinema mode, dark mode, 20+ ready widgets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;230+ tools&lt;/strong&gt; that actually execute across Docker, media, networking, backups, and monitoring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AGPL-3.0.&lt;/strong&gt; No feature gates. No license switch. No "community edition".&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I think is actually novel
&lt;/h2&gt;

&lt;p&gt;Talome can read and modify its own TypeScript source code.&lt;/p&gt;

&lt;p&gt;Tell it "the dashboard sidebar feels cluttered" and it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reads the relevant component with &lt;code&gt;read_file&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Drafts a diff with &lt;code&gt;plan_change&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Applies it with &lt;code&gt;apply_change&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Runs &lt;code&gt;tsc --noEmit&lt;/code&gt; in the affected workspace&lt;/li&gt;
&lt;li&gt;If the compiler fails → automatic rollback via &lt;code&gt;git stash&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;If it passes → commit with a full audit trail&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every change is reversible with &lt;code&gt;rollback_change&lt;/code&gt;. There's a full evolution log in the dashboard showing every attempt, the diff, which files changed, and how long it took.&lt;/p&gt;

&lt;p&gt;The heavy lifting here runs through &lt;strong&gt;headless Claude Code&lt;/strong&gt; — not the Vercel AI SDK — because Claude Code has its own prompt caching and session management, which keeps token costs down for long-running tasks like "refactor this component" or "implement this feature."&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript strict&lt;/strong&gt; everywhere, Zod for all runtime validation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hono&lt;/strong&gt; backend, &lt;strong&gt;Next.js 16&lt;/strong&gt; frontend (App Router, React 19)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLite + Drizzle ORM&lt;/strong&gt; — single-file database, no external services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel AI SDK&lt;/strong&gt; + Anthropic Claude, OpenAI, or local Ollama&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; for managed apps, multi-arch image (amd64 + arm64)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP server&lt;/strong&gt; that auto-syncs from the tool registry — zero extra config&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tool registry is worth a word. Tools are organized into &lt;strong&gt;domains&lt;/strong&gt; that activate dynamically based on which apps you have configured. Install Sonarr, and 27 arr tools appear. Configure Home Assistant, and 5 smart-home tools unlock. The LLM only sees tools it can actually use, which keeps it fast and accurate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I'm at
&lt;/h2&gt;

&lt;p&gt;So far Talome is playing well with Claude and Claude Code on my Mac mini — that's the setup I've been daily-driving. OpenAI support is in, Ollama is experimental. I'd love to see how it behaves with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Other providers&lt;/strong&gt; — OpenAI in production, Ollama on a real local model, anything else I should try&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other platforms&lt;/strong&gt; — Linux homelabs, Synology / UGREEN NAS boxes, Raspberry Pi, whatever you're running&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other use cases&lt;/strong&gt; — I built it around media + monitoring because that's my pain, but the tool system is generic. Curious what people bend it toward: smart home, dev environments, family photo backups, whatever&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://get.talome.dev | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Requirements: macOS or Linux, 2GB RAM, 5GB disk, Docker (for managed apps), and an Anthropic API key.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://talome.dev" rel="noopener noreferrer"&gt;talome.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/tomastruben/Talome" rel="noopener noreferrer"&gt;github.com/tomastruben/Talome&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://talome.dev/docs" rel="noopener noreferrer"&gt;talome.dev/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Discord: &lt;a href="https://discord.gg/HK7gFaVRJ" rel="noopener noreferrer"&gt;discord.gg/HK7gFaVRJ&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm looking for people to break it before a public launch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the installer work on your hardware?&lt;/li&gt;
&lt;li&gt;What breaks?&lt;/li&gt;
&lt;li&gt;What's missing?&lt;/li&gt;
&lt;li&gt;What would you want it to do that it doesn't?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First 50 testers get credited in the README + an &lt;code&gt;@Early Adopter&lt;/code&gt; role in Discord. I'm there daily, bugs get triaged fast.&lt;/p&gt;

&lt;p&gt;Thanks for reading. Honest feedback welcome.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6e0j52kib0qwzv3xugr9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6e0j52kib0qwzv3xugr9.gif" alt=" " width="640" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>showdev</category>
      <category>ai</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
