<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>PSW on PSW Documentation</title><link>/</link><description>Recent content in PSW on PSW Documentation</description><generator>Hugo</generator><language>en</language><atom:link href="/index.xml" rel="self" type="application/rss+xml"/><item><title>AI Planner: Bring Your Own AI, Pay Nothing to PSW</title><link>/docs/ai-planner/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/ai-planner/</guid><description>&lt;h1 id="ai-planner-bring-your-own-ai-pay-nothing-to-psw"&gt;AI Planner: Bring Your Own AI, Pay Nothing to PSW&lt;a class="anchor" href="#ai-planner-bring-your-own-ai-pay-nothing-to-psw"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-it-is"&gt;What it is&lt;a class="anchor" href="#what-it-is"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The AI planner is what decides how your apps map onto your hardware:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;how many LXC targets to create,&lt;/li&gt;
&lt;li&gt;which apps go on which target,&lt;/li&gt;
&lt;li&gt;how many cores, how much RAM, and how big a rootdisk each target gets,&lt;/li&gt;
&lt;li&gt;which target gets GPU passthrough,&lt;/li&gt;
&lt;li&gt;which target gets which USB dongle,&lt;/li&gt;
&lt;li&gt;where bulk data lives (local ZFS vs NFS from a storage node),&lt;/li&gt;
&lt;li&gt;what the storage layout looks like on each Proxmox node.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PSW does &lt;strong&gt;not&lt;/strong&gt; call any AI itself. The planner is a two-step copy/paste protocol:&lt;/p&gt;</description></item><item><title>App Metadata</title><link>/docs/app-metadata/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/app-metadata/</guid><description>&lt;h1 id="app-metadata"&gt;App Metadata&lt;a class="anchor" href="#app-metadata"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;App metadata&lt;/strong&gt; is the identity card of every &lt;a href="../apps/"&gt;app&lt;/a&gt;
 in PSW. It describes everything PSW needs to know about an app: what &lt;a href="https://opencontainers.org/"&gt;container image&lt;/a&gt;
 (a packaged snapshot of the app, run by &lt;a href="https://github.com/containers/podman"&gt;Podman&lt;/a&gt;
) to use, which port it listens on, what secrets it needs, whether it supports single sign-on, how to back it up, what other apps it connects to, and more.&lt;/p&gt;
&lt;p&gt;Think of it like the nutritional label on a food package. You don&amp;rsquo;t need to open the box to know what&amp;rsquo;s inside — the label tells you the ingredients, serving size, and allergens. App metadata tells PSW the ingredients (dependencies), serving size (ports and resources), and allergens (hardware requirements) of each app — so it can deploy and integrate it automatically.&lt;/p&gt;</description></item><item><title>Apps</title><link>/docs/apps/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/apps/</guid><description>&lt;h1 id="apps"&gt;Apps&lt;a class="anchor" href="#apps"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-an-app"&gt;What Is an App?&lt;a class="anchor" href="#what-is-an-app"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;An &lt;strong&gt;app&lt;/strong&gt; is anything PSW can deploy and manage for you — a media server, a database, a monitoring dashboard, a password manager. Each app has a deployment recipe (templates and &lt;a href="../app-metadata/"&gt;metadata&lt;/a&gt;
) describing what it needs and how it fits into your self-hosted solution.&lt;/p&gt;
&lt;p&gt;PSW comes with a catalog of ready-to-use apps. You pick the ones you want, and PSW handles the rest: creating &lt;a href="../infrastructure/#targets"&gt;targets&lt;/a&gt;
, configuring networking, setting up &lt;a href="../secrets/"&gt;secrets&lt;/a&gt;
, &lt;a href="../conventions/"&gt;wiring apps together&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Backups</title><link>/docs/backups/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/backups/</guid><description>&lt;h1 id="backups"&gt;Backups&lt;a class="anchor" href="#backups"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;Looking for the full disaster-recovery story?&lt;/strong&gt; This doc covers
only &lt;strong&gt;per-app bundles&lt;/strong&gt; — Vaultwarden&amp;rsquo;s vault entries, Forgejo&amp;rsquo;s
repos, Frigate&amp;rsquo;s camera footage, Home Assistant&amp;rsquo;s automation
history. For the umbrella view that ties bundles together with
your &lt;strong&gt;git remote&lt;/strong&gt; (project shape) and your &lt;strong&gt;panic backup&lt;/strong&gt;
(encryption keys + credentials), see
&lt;a href="../disaster-recovery/"&gt;disaster-recovery.md&lt;/a&gt;
. Three layers,
restored in three different ways, each documented independently.
The umbrella doc is the right starting point if you&amp;rsquo;ve never
actually walked through a recovery before.&lt;/p&gt;</description></item><item><title>Bootstrap</title><link>/docs/bootstrap/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/bootstrap/</guid><description>&lt;h1 id="bootstrap"&gt;Bootstrap&lt;a class="anchor" href="#bootstrap"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Bootstrap&lt;/strong&gt; is the one-time setup process that brings your &lt;a href="../philosophy/"&gt;self-hosted solution&lt;/a&gt;
 to life. It takes a bare &lt;a href="https://www.proxmox.com/"&gt;Proxmox&lt;/a&gt;
 &lt;a href="../infrastructure/#proxmox-nodes"&gt;node&lt;/a&gt;
 and turns it into a fully functional platform — with a database, reverse proxy, authentication, a git server, and a web dashboard — all in a single command.&lt;/p&gt;
&lt;p&gt;Think of it like building the foundation of a house. You do it once, and everything else (your &lt;a href="../apps/"&gt;apps&lt;/a&gt;
) gets built on top of it.&lt;/p&gt;</description></item><item><title>Conventions</title><link>/docs/conventions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/conventions/</guid><description>&lt;h1 id="conventions"&gt;Conventions&lt;a class="anchor" href="#conventions"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-a-convention"&gt;What Is a Convention?&lt;a class="anchor" href="#what-is-a-convention"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;convention&lt;/strong&gt; is a standardized way for &lt;a href="../apps/"&gt;apps&lt;/a&gt;
 to plug into shared infrastructure automatically. Instead of manually configuring &lt;a href="https://github.com/traefik/traefik"&gt;Traefik&lt;/a&gt;
 routes, SSO clients, or monitoring targets for every app you install, PSW uses conventions to generate all that wiring for you.&lt;/p&gt;
&lt;p&gt;When you add &lt;a href="https://github.com/jellyfin/jellyfin"&gt;Jellyfin&lt;/a&gt;
, PSW doesn&amp;rsquo;t just deploy it — it also:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creates a &lt;a href="https://github.com/traefik/traefik"&gt;Traefik&lt;/a&gt;
 route so &lt;code&gt;https://jellyfin.yourdomain.ca&lt;/code&gt; works&lt;/li&gt;
&lt;li&gt;Registers an SSO client with &lt;a href="https://github.com/authelia/authelia"&gt;Authelia&lt;/a&gt;
 (if the app supports it)&lt;/li&gt;
&lt;li&gt;Adds a &lt;a href="https://github.com/prometheus/prometheus"&gt;Prometheus&lt;/a&gt;
 scrape target (if the app exposes metrics)&lt;/li&gt;
&lt;li&gt;Creates a backup plan for &lt;a href="https://github.com/garethgeorge/backrest"&gt;Backrest&lt;/a&gt;
 (if the app has data worth backing up)&lt;/li&gt;
&lt;li&gt;Adds a dashboard entry on &lt;a href="https://github.com/gethomepage/homepage"&gt;Homepage&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of this happens because Jellyfin&amp;rsquo;s &lt;a href="../app-metadata/"&gt;metadata&lt;/a&gt;
 declares which conventions it participates in. You don&amp;rsquo;t configure any of it — PSW handles it.&lt;/p&gt;</description></item><item><title>Convergence</title><link>/docs/convergence/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/convergence/</guid><description>&lt;h1 id="convergence"&gt;Convergence&lt;a class="anchor" href="#convergence"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Convergence&lt;/strong&gt; is PSW&amp;rsquo;s automatic deployment engine. It runs on your &lt;a href="../infrastructure/#the-bootstrap-target"&gt;bootstrap target&lt;/a&gt;
 (the server where &lt;a href="../apps/#core-apps"&gt;core apps&lt;/a&gt;
 live) and continuously makes sure your &lt;a href="../philosophy/"&gt;self-hosted solution&lt;/a&gt;
 matches what&amp;rsquo;s defined in your &lt;a href="../user-project/"&gt;user project&lt;/a&gt;
 files.&lt;/p&gt;
&lt;p&gt;Think of it like a diligent assistant: every 5 minutes, it checks &amp;ldquo;did anything change in the project?&amp;rdquo; and if so, it applies those changes — creating targets, deploying apps, wiring them together, or tearing down things you&amp;rsquo;ve removed.&lt;/p&gt;</description></item><item><title>Deployment Plan: The Blueprint for What Runs Where</title><link>/docs/deployment-plan/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/deployment-plan/</guid><description>&lt;h1 id="deployment-plan-the-blueprint-for-what-runs-where"&gt;Deployment Plan: The Blueprint for What Runs Where&lt;a class="anchor" href="#deployment-plan-the-blueprint-for-what-runs-where"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-it-is"&gt;What It Is&lt;a class="anchor" href="#what-it-is"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Imagine you&amp;rsquo;re building a house. You tell the architect &amp;ldquo;I want a garage, a home theater, and a wine cellar,&amp;rdquo; and they design the foundation that supports what you need — the right thickness under the theater for soundproofing, a reinforced slab for the garage, drainage for the cellar.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;deployment plan&lt;/strong&gt; works the same way. You tell PSW what apps you want; an AI of your choice designs the &lt;a href="https://linuxcontainers.org/lxc/"&gt;LXC&lt;/a&gt;
 targets, the ZFS storage layout, the GPU passthrough, and the NFS wiring that fits those apps onto your hardware. PSW never talks to an LLM itself — it renders a self-contained prompt you paste into whichever AI you already use (ChatGPT, Claude.ai, Gemini, a local LLM, whatever), and it validates the JSON reply against a strict schema before saving anything. See &lt;a href="../ai-planner/"&gt;AI Planner&lt;/a&gt;
 for the full protocol.&lt;/p&gt;</description></item><item><title>Disaster Recovery</title><link>/docs/disaster-recovery/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/disaster-recovery/</guid><description>&lt;h1 id="disaster-recovery"&gt;Disaster Recovery&lt;a class="anchor" href="#disaster-recovery"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-it-is"&gt;What It Is&lt;a class="anchor" href="#what-it-is"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Disaster recovery&lt;/strong&gt; is the answer to one question: &lt;em&gt;&amp;ldquo;My server burned down — can I bring everything back?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;PSW&amp;rsquo;s answer is yes, and the way it gets to &amp;ldquo;yes&amp;rdquo; is by treating your setup as &lt;strong&gt;three independent things&lt;/strong&gt;, kept in three different places, restored in three different ways. Lose one and the other two can usually carry you. Lose all three and you&amp;rsquo;re rebuilding from memory.&lt;/p&gt;</description></item><item><title>GitOps</title><link>/docs/gitops/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/gitops/</guid><description>&lt;h1 id="gitops"&gt;GitOps&lt;a class="anchor" href="#gitops"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;GitOps&lt;/strong&gt; is a way of managing your &lt;a href="../philosophy/"&gt;self-hosted solution&lt;/a&gt;
 where a &lt;a href="https://git-scm.com/"&gt;git&lt;/a&gt;
 repository is the &lt;strong&gt;single source of truth&lt;/strong&gt; for everything. Instead of logging into servers and making changes by hand, you describe what you want in text files, commit them, push — and the system automatically makes it happen.&lt;/p&gt;
&lt;p&gt;Think of it like writing a shopping list and handing it to someone who goes to the store for you. You don&amp;rsquo;t walk the aisles yourself — you just write down what you need, and it gets done. In PSW, the &amp;ldquo;shopping list&amp;rdquo; is your &lt;a href="../user-project/"&gt;user project&lt;/a&gt;
, and the &amp;ldquo;someone&amp;rdquo; is the &lt;a href="../convergence/"&gt;convergence&lt;/a&gt;
 engine.&lt;/p&gt;</description></item><item><title>Hardware</title><link>/docs/hardware/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/hardware/</guid><description>&lt;h1 id="hardware"&gt;Hardware&lt;a class="anchor" href="#hardware"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;nodes/&amp;lt;name&amp;gt;/hardware.yml&lt;/code&gt; is a complete, machine-readable inventory of one of your servers. It says what CPU is in there, how much RAM, what disks are attached, which NICs (&lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/NIC"&gt;network interface controllers&lt;/a&gt;
 — the chips that connect a computer to the network) are wired up, and which GPUs and USB dongles are plugged in.&lt;/p&gt;
&lt;p&gt;PSW writes one of these files per &lt;a href="../infrastructure/#proxmox-nodes"&gt;Proxmox node&lt;/a&gt;
. Once it exists, every downstream tool — the &lt;a href="../ai-planner/"&gt;AI planner&lt;/a&gt;
, the &lt;a href="https://www.proxmox.com/"&gt;Proxmox installer&lt;/a&gt;
, the OPNsense installer, the dashboard, the wizard — reads it as the source of truth for what that server actually is.&lt;/p&gt;</description></item><item><title>High Availability</title><link>/docs/high-availability/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/high-availability/</guid><description>&lt;h1 id="high-availability"&gt;High Availability&lt;a class="anchor" href="#high-availability"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;Status: roadmap.&lt;/strong&gt; PSW can form Proxmox clusters today (&lt;code&gt;psw node cluster&lt;/code&gt;), but the pieces below — &lt;code&gt;ha: true&lt;/code&gt; on targets, &lt;code&gt;shared_storage:&lt;/code&gt; in &lt;code&gt;network.yml&lt;/code&gt;, &lt;code&gt;psw maintenance start/end&lt;/code&gt;, automatic failover wiring — are not yet implemented. This page captures the intended design so contributors and early users have one north star to build toward.&lt;/p&gt;
&lt;/blockquote&gt;&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;High availability&lt;/strong&gt; (often shortened to &lt;strong&gt;HA&lt;/strong&gt;) means your &lt;a href="../apps/"&gt;apps&lt;/a&gt;
 keep running even when a server fails or needs to go offline for maintenance. If one of your &lt;a href="../infrastructure/#proxmox-nodes"&gt;Proxmox nodes&lt;/a&gt;
 goes down — whether from a dead power supply, a crashed disk, or because you&amp;rsquo;re installing updates — your &lt;a href="../infrastructure/#targets"&gt;targets&lt;/a&gt;
 automatically restart on another node. Your family keeps streaming, your passwords stay accessible, your smart home keeps working.&lt;/p&gt;</description></item><item><title>Idempotency</title><link>/docs/idempotency/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/idempotency/</guid><description>&lt;h1 id="idempotency"&gt;Idempotency&lt;a class="anchor" href="#idempotency"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Idempotency&lt;/strong&gt; means that running the same operation twice produces the same result as running it once. Nothing breaks, nothing duplicates, nothing changes the second time — because the system checks what already exists before acting.&lt;/p&gt;
&lt;p&gt;Think of it like flipping a light switch to &amp;ldquo;on.&amp;rdquo; If the light is already on, flipping the switch again doesn&amp;rsquo;t turn on a second light or cause an error — it just stays on. Every operation in PSW works the same way: if the desired state already exists, it does nothing.&lt;/p&gt;</description></item><item><title>Infrastructure: Nodes, Targets, and Management Hosts</title><link>/docs/infrastructure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/infrastructure/</guid><description>&lt;h1 id="infrastructure-nodes-targets-and-management-hosts"&gt;Infrastructure: Nodes, Targets, and Management Hosts&lt;a class="anchor" href="#infrastructure-nodes-targets-and-management-hosts"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="the-big-picture"&gt;The Big Picture&lt;a class="anchor" href="#the-big-picture"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Your &lt;a href="../philosophy/"&gt;self-hosted solution&lt;/a&gt;
&amp;rsquo;s infrastructure has three layers, from bottom to top:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌───────────────────────────────────────────────────┐
│ Apps (Jellyfin, Sonarr, Grafana, ...) │ ← What you care about
├───────────────────────────────────────────────────┤
│ Targets │ ← Where apps run
├───────────────────────────────────────────────────┤
│ Nodes &amp;amp; Management Hosts (Proxmox, OPNsense) │ ← The physical foundation
└───────────────────────────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Let&amp;rsquo;s go through each layer.&lt;/p&gt;
&lt;h2 id="management-hosts"&gt;Management Hosts&lt;a class="anchor" href="#management-hosts"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;management host&lt;/strong&gt; is a machine that exists on your network &lt;em&gt;before&lt;/em&gt; PSW does anything. These are the physical infrastructure that make everything else possible.&lt;/p&gt;</description></item><item><title>Local AI</title><link>/docs/ai/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/ai/</guid><description>&lt;h1 id="local-ai"&gt;Local AI&lt;a class="anchor" href="#local-ai"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Local AI&lt;/strong&gt; means you run a chatbot — and eventually voice, image generation, photo search, and document tagging — on your own hardware, with the data staying inside your house. No subscriptions. No cloud. The kid asks the speaker to turn off the kitchen light, the family chats about dinner with a private assistant, the photo app finds &amp;ldquo;beach 2018&amp;rdquo; — and none of it ever leaves the box.&lt;/p&gt;</description></item><item><title>Monitoring</title><link>/docs/monitoring/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/monitoring/</guid><description>&lt;h1 id="monitoring"&gt;Monitoring&lt;a class="anchor" href="#monitoring"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Monitoring&lt;/strong&gt; is how PSW answers the question &lt;em&gt;&amp;ldquo;is everything still working?&amp;rdquo;&lt;/em&gt; without you having to SSH around and poke at services. It collects two kinds of signals from every &lt;a href="../infrastructure/#targets"&gt;target&lt;/a&gt;
 and every &lt;a href="../apps/"&gt;app&lt;/a&gt;
:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Metrics&lt;/strong&gt; — numbers over time: CPU, memory, disk, response times, queue lengths, request counts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logs&lt;/strong&gt; — the text each service writes as it runs: errors, warnings, requests served, things that crashed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those signals get shipped to a central place, displayed on dashboards, and — when something goes wrong — turned into a phone notification so you actually find out about it.&lt;/p&gt;</description></item><item><title>Networking</title><link>/docs/networking/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/networking/</guid><description>&lt;h1 id="networking"&gt;Networking&lt;a class="anchor" href="#networking"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Networking&lt;/strong&gt; is everything that lets the parts of your &lt;a href="../philosophy/"&gt;self-hosted solution&lt;/a&gt;
 find and talk to each other — your &lt;a href="https://www.proxmox.com/"&gt;Proxmox&lt;/a&gt;
 servers, the &lt;a href="https://linuxcontainers.org/lxc/"&gt;LXC&lt;/a&gt;
 containers running your apps, your phone browsing the dashboard, and the wider internet reaching an &lt;a href="../remote-access/"&gt;exposed app&lt;/a&gt;
. None of that works without a &lt;strong&gt;router&lt;/strong&gt; sitting in the middle handing out IP addresses, resolving domain names, and shuttling packets.&lt;/p&gt;
&lt;p&gt;PSW supports &lt;strong&gt;two router scenarios&lt;/strong&gt;, picked once at wizard time:&lt;/p&gt;</description></item><item><title>Operations Mode</title><link>/docs/operations-mode/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/operations-mode/</guid><description>&lt;h1 id="operations-mode"&gt;Operations Mode&lt;a class="anchor" href="#operations-mode"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Everything up to and including the &lt;a href="../wizard/"&gt;Setup Wizard&lt;/a&gt;
 is a &lt;em&gt;one-time&lt;/em&gt; experience — you run it once, bare metal to live platform, and never again. &lt;strong&gt;Operations mode&lt;/strong&gt; is what comes after: the dashboard you open every day to see what&amp;rsquo;s running, add new &lt;a href="../apps/"&gt;apps&lt;/a&gt;
, watch &lt;a href="../convergence/"&gt;convergence&lt;/a&gt;
 runs, and check whether anything is on fire.&lt;/p&gt;
&lt;p&gt;The wizard was the installer. Operations mode is the control panel.&lt;/p&gt;
&lt;h2 id="where-do-you-find-it"&gt;Where Do You Find It?&lt;a class="anchor" href="#where-do-you-find-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Two doors to the same room:&lt;/p&gt;</description></item><item><title>Philosophy</title><link>/docs/philosophy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/philosophy/</guid><description>&lt;h1 id="philosophy"&gt;Philosophy&lt;a class="anchor" href="#philosophy"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="self-hosted-solution-not-homelab"&gt;Self-Hosted Solution, Not Homelab&lt;a class="anchor" href="#self-hosted-solution-not-homelab"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is the most important thing to understand about PSW.&lt;/p&gt;
&lt;p&gt;The word &amp;ldquo;homelab&amp;rdquo; implies a &lt;strong&gt;laboratory&lt;/strong&gt; — a place to experiment, break things, learn, and tinker. That&amp;rsquo;s a valid hobby, but it&amp;rsquo;s &lt;strong&gt;not what PSW is for&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;PSW builds a &lt;strong&gt;self-hosted solution&lt;/strong&gt;: production-quality infrastructure that you depend on. The same apps your family uses to watch movies, the same password manager that stores your banking credentials, the same smart home system that controls your locks. These services must be &lt;strong&gt;solid, reliable, and self-healing&lt;/strong&gt; — not experiments.&lt;/p&gt;</description></item><item><title>Project Graph &amp; Validation</title><link>/docs/project-graph/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/project-graph/</guid><description>&lt;h1 id="project-graph--validation"&gt;Project Graph &amp;amp; Validation&lt;a class="anchor" href="#project-graph--validation"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-the-project-graph"&gt;What Is the Project Graph?&lt;a class="anchor" href="#what-is-the-project-graph"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;project graph&lt;/strong&gt; is a single, immutable snapshot of your entire &lt;a href="../user-project/"&gt;user project&lt;/a&gt;
 — every &lt;a href="../apps/"&gt;app&lt;/a&gt;
, &lt;a href="../infrastructure/#targets"&gt;target&lt;/a&gt;
, &lt;a href="../secrets/"&gt;secret&lt;/a&gt;
, &lt;a href="../providers/"&gt;provider&lt;/a&gt;
, and the relationships between them — loaded once and used everywhere.&lt;/p&gt;
&lt;p&gt;Think of it like a photograph of your self-hosted solution&amp;rsquo;s configuration at a point in time. PSW takes this snapshot, validates it for problems, and then hands it to the systems that need it: the &lt;a href="../conventions/"&gt;convention&lt;/a&gt;
 engine, the deployment pipeline, DNS reconciliation, and more.&lt;/p&gt;</description></item><item><title>Project Launcher</title><link>/docs/launcher/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/launcher/</guid><description>&lt;h1 id="project-launcher"&gt;Project Launcher&lt;a class="anchor" href="#project-launcher"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The project launcher is the first screen you see when you run &lt;code&gt;psw wizard&lt;/code&gt; with no arguments. It&amp;rsquo;s where you decide which &lt;a href="../user-project/"&gt;user project&lt;/a&gt;
 to work with &amp;ndash; either by creating a new one or opening one you&amp;rsquo;ve worked on before. (The launcher belongs to the installer UI; once a project is bootstrapped you switch to &lt;code&gt;psw dashboard&lt;/code&gt;, which opens an existing project directly and has no launcher screen of its own.)&lt;/p&gt;</description></item><item><title>Providers</title><link>/docs/providers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/providers/</guid><description>&lt;h1 id="providers"&gt;Providers&lt;a class="anchor" href="#providers"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-a-provider"&gt;What Is a Provider?&lt;a class="anchor" href="#what-is-a-provider"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;provider&lt;/strong&gt; is a backend service that handles a piece of foundational infrastructure your self-hosted solution needs to function. Think of providers as the plumbing behind the scenes — they manage DNS resolution, IP address assignment, and SSL certificates so your &lt;a href="../apps/"&gt;apps&lt;/a&gt;
 are reachable by name with secure HTTPS connections. The three networking providers (local DNS, WAN DNS, DHCP) are the core of how &lt;a href="../networking/"&gt;networking&lt;/a&gt;
 works in PSW.&lt;/p&gt;</description></item><item><title>PSW Documentation Site</title><link>/docs/psw-docs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/psw-docs/</guid><description>&lt;h1 id="psw-documentation-site"&gt;PSW Documentation Site&lt;a class="anchor" href="#psw-documentation-site"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;PSW Documentation&lt;/strong&gt; is the same set of concept docs you&amp;rsquo;re reading right now — every file under &lt;code&gt;docs/concepts/&lt;/code&gt; plus the project &lt;a href="https://github.com/casaeureka/psw/blob/main/README.md"&gt;README&lt;/a&gt;
 — rendered as a real, searchable, browsable website and shipped &lt;em&gt;with your self-hosted solution&lt;/em&gt;. It lives at &lt;code&gt;https://docs.&amp;lt;your-domain&amp;gt;/&lt;/code&gt; (e.g. &lt;code&gt;https://docs.casaeureka.ca/&lt;/code&gt;) and is served by your own server, alongside &lt;a href="https://jellyfin.org/"&gt;Jellyfin&lt;/a&gt;
, &lt;a href="https://github.com/grafana/grafana"&gt;Grafana&lt;/a&gt;
, and everything else.&lt;/p&gt;
&lt;p&gt;So the next time you wonder &amp;ldquo;wait, what does &lt;em&gt;idempotency&lt;/em&gt; mean again?&amp;rdquo; or &amp;ldquo;how do I expose an app remotely?&amp;rdquo;, you don&amp;rsquo;t need to fish for a GitHub tab — open &lt;code&gt;docs.&amp;lt;your-domain&amp;gt;/&lt;/code&gt; and search.&lt;/p&gt;</description></item><item><title>Remote Access</title><link>/docs/remote-access/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/remote-access/</guid><description>&lt;h1 id="remote-access"&gt;Remote Access&lt;a class="anchor" href="#remote-access"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Remote access&lt;/strong&gt; lets you reach your &lt;a href="../apps/"&gt;apps&lt;/a&gt;
 from anywhere on the internet — not just from your local network. When you expose an app, it becomes accessible at its public subdomain (e.g., &lt;code&gt;https://jellyfin.yourdomain.ca&lt;/code&gt;) from your phone, a coffee shop, or anywhere else.&lt;/p&gt;
&lt;p&gt;Remote access sits &lt;strong&gt;on top&lt;/strong&gt; of your normal &lt;a href="../networking/"&gt;networking&lt;/a&gt;
 — it doesn&amp;rsquo;t replace the router or DNS, it just adds an internet-side entry point for apps you explicitly expose.&lt;/p&gt;</description></item><item><title>Reset and Removal</title><link>/docs/reset/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/reset/</guid><description>&lt;h1 id="reset-and-removal"&gt;Reset and Removal&lt;a class="anchor" href="#reset-and-removal"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Reset is PSW&amp;rsquo;s answer to &lt;em&gt;&amp;ldquo;I want to undo something.&amp;rdquo;&lt;/em&gt; That covers a range: uninstalling a single app, wiping a whole test project clean, rebuilding a broken VPS, or nuking everything so you can start over. PSW gives you one command per size, each with its own safety rails.&lt;/p&gt;
&lt;p&gt;Think of the scale like this:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Size of undo&lt;/th&gt;
 &lt;th&gt;Command&lt;/th&gt;
 &lt;th&gt;What dies&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;One app, clean uninstall&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;psw app remove &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;That app&amp;rsquo;s containers, data, database, convention files&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;One &lt;a href="../infrastructure/#targets"&gt;target&lt;/a&gt;
 no longer needed&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;psw target delete &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;The entry in &lt;code&gt;network.yml&lt;/code&gt; (actual LXC survives until a full reset)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;The whole bootstrap &amp;amp; retry&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;psw deploy bootstrap --clean&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Just the bootstrap progress file, so bootstrap starts fresh&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;The whole setup, rebuild from scratch&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;psw deploy reset --confirm&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Every managed LXC, every ZFS dataset, every PSW-managed DNS + DHCP record, every generated project file&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;The remote VPS, rebuilt in place&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;psw remote rotate-vps&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;The VPS&amp;rsquo;s OS reinstalled; certs preserved&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All of these are &lt;strong&gt;declarative-first&lt;/strong&gt; — you don&amp;rsquo;t destroy anything directly. You change a file (or run a command that changes a file), commit, and &lt;a href="../convergence/"&gt;convergence&lt;/a&gt;
 or an explicit deploy step does the actual teardown in a safe, predictable order.&lt;/p&gt;</description></item><item><title>Secrets</title><link>/docs/secrets/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/secrets/</guid><description>&lt;h1 id="secrets"&gt;Secrets&lt;a class="anchor" href="#secrets"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-are-secrets"&gt;What Are Secrets?&lt;a class="anchor" href="#what-are-secrets"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Secrets&lt;/strong&gt; are the passwords, API keys, tokens, and credentials your &lt;a href="../apps/"&gt;apps&lt;/a&gt;
 need to function. Things like database passwords, SSO signing keys, and &lt;a href="../providers/"&gt;provider&lt;/a&gt;
 API tokens.&lt;/p&gt;
&lt;p&gt;PSW encrypts all secrets using &lt;strong&gt;&lt;a href="https://github.com/getsops/sops"&gt;SOPS&lt;/a&gt;
&lt;/strong&gt; (Secrets OPerationS) with &lt;strong&gt;&lt;a href="https://github.com/FiloSottile/age"&gt;age&lt;/a&gt;
&lt;/strong&gt; encryption, so they&amp;rsquo;re safe to store in your git repository. You never have to worry about accidentally leaking a password in a commit — everything in &lt;code&gt;secrets/&lt;/code&gt; is encrypted before it touches git.&lt;/p&gt;</description></item><item><title>Single Sign-On</title><link>/docs/sso/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/sso/</guid><description>&lt;h1 id="single-sign-on"&gt;Single Sign-On&lt;a class="anchor" href="#single-sign-on"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Single Sign-On (SSO)&lt;/strong&gt; means you log in &lt;em&gt;once&lt;/em&gt;, and every &lt;a href="../apps/"&gt;app&lt;/a&gt;
 on your setup recognises you. No per-app account, no twenty-passwords-for-twenty-apps. You visit &lt;a href="https://jellyfin.org/"&gt;Jellyfin&lt;/a&gt;
 without being logged in, you&amp;rsquo;re redirected to a login page, you enter your password, you&amp;rsquo;re back on Jellyfin — and now &lt;a href="https://github.com/grafana/grafana"&gt;Grafana&lt;/a&gt;
, &lt;a href="https://codeberg.org/forgejo/forgejo"&gt;Forgejo&lt;/a&gt;
, the &lt;a href="../operations-mode/"&gt;operations dashboard&lt;/a&gt;
, and everything else just let you in too.&lt;/p&gt;
&lt;p&gt;Think of it like the wristband at a multi-venue festival. You queue once at the gate, they check your ID, and from then on every stage just scans the band.&lt;/p&gt;</description></item><item><title>Split-Horizon DNS</title><link>/docs/split-horizon-dns/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/split-horizon-dns/</guid><description>&lt;h1 id="split-horizon-dns"&gt;Split-Horizon DNS&lt;a class="anchor" href="#split-horizon-dns"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Split-horizon DNS&lt;/strong&gt; means the same domain name points to different addresses depending on where you are. When you type &lt;code&gt;jellyfin.yourdomain.ca&lt;/code&gt; into your browser:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;At home&lt;/strong&gt; → it resolves to your &lt;a href="https://github.com/traefik/traefik"&gt;Traefik&lt;/a&gt;
 server&amp;rsquo;s internal IP (e.g., &lt;code&gt;10.10.0.100&lt;/code&gt;) — traffic stays on your local network&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On the internet&lt;/strong&gt; → it resolves to your public VPS IP (e.g., &lt;code&gt;203.0.113.50&lt;/code&gt;) — traffic goes through a &lt;a href="../remote-access/"&gt;tunnel&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Think of it like a restaurant with two entrances: one for locals (the back door, fast and direct) and one for visitors (the front door, through the lobby). Both entrances lead to the same restaurant, but the path is different depending on who you are.&lt;/p&gt;</description></item><item><title>Stacks</title><link>/docs/stacks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/stacks/</guid><description>&lt;h1 id="stacks"&gt;Stacks&lt;a class="anchor" href="#stacks"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;stack&lt;/strong&gt; is a pre-built bundle of &lt;a href="../apps/"&gt;apps&lt;/a&gt;
 that work well together. Instead of adding apps one by one, you can install an entire group with a single command.&lt;/p&gt;
&lt;p&gt;Think of it like a meal kit: instead of buying each ingredient separately, you get a box with everything you need for a complete recipe. A stack gives you a curated set of apps that form a complete solution — media streaming, home automation, monitoring, and so on.&lt;/p&gt;</description></item><item><title>Storage</title><link>/docs/storage/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/storage/</guid><description>&lt;h1 id="storage"&gt;Storage&lt;a class="anchor" href="#storage"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;Storage&amp;rdquo; in PSW means the disks and filesystems your &lt;a href="../apps/"&gt;apps&lt;/a&gt;
 store their data on. It&amp;rsquo;s split across three places:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://openzfs.org/"&gt;ZFS&lt;/a&gt;
 pools&lt;/strong&gt; — the big shared disks living directly on your &lt;a href="../infrastructure/#proxmox-nodes"&gt;Proxmox node&lt;/a&gt;
, carved into &lt;strong&gt;datasets&lt;/strong&gt; (like labeled drawers)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Container root disks&lt;/strong&gt; — a per-&lt;a href="../infrastructure/#targets"&gt;target&lt;/a&gt;
 small filesystem where the operating system and local-only app data live&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Podman-managed volumes&lt;/strong&gt; — for app data that should stay &lt;em&gt;local&lt;/em&gt; to one container, not shared&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;An &lt;a href="../ai-planner/"&gt;AI planner&lt;/a&gt;
 sits at the front of all this: you tell it what apps you want and it designs the whole layout — pool configuration, datasets with the right tuning, rootdisk sizes per target — based on your actual hardware and the apps you picked. PSW renders the prompt; you paste it into whatever AI you already use (&lt;a href="https://claude.ai"&gt;Claude.ai&lt;/a&gt;
, ChatGPT, Gemini, a local LLM, etc.); you paste the reply back into PSW. PSW validates it and writes &lt;code&gt;nodes/&amp;lt;name&amp;gt;/storage.yml&lt;/code&gt;. No API keys collected anywhere in PSW.&lt;/p&gt;</description></item><item><title>The Execution Plan</title><link>/docs/execution-plan/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/execution-plan/</guid><description>&lt;h1 id="the-execution-plan"&gt;The Execution Plan&lt;a class="anchor" href="#the-execution-plan"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When &lt;a href="../convergence/"&gt;convergence&lt;/a&gt;
 decides it&amp;rsquo;s time to deploy your &lt;a href="../apps/"&gt;apps&lt;/a&gt;
, it doesn&amp;rsquo;t just march through a fixed list of steps. Instead, it builds an &lt;strong&gt;execution plan&lt;/strong&gt; — a map of every piece of work that needs to happen, along with which pieces depend on which others. Then a runner walks that map, doing as much work in parallel as the dependencies allow.&lt;/p&gt;
&lt;p&gt;Think of it like cooking a multi-course dinner for twelve people. You &lt;em&gt;could&lt;/em&gt; cook one dish at a time from start to finish — start the pasta sauce, finish the pasta sauce, then start the salad, then the roast, then dessert. You&amp;rsquo;d eat at midnight. What you actually do is look at the whole menu, notice that the roast takes two hours but the salad takes five minutes, and start the roast &lt;em&gt;first&lt;/em&gt;. While it&amp;rsquo;s in the oven, you chop the salad, simmer the sauce, and prep dessert. Some things still have hard orderings (&amp;ldquo;don&amp;rsquo;t plate the pasta before the sauce is done&amp;rdquo;), but everything else overlaps.&lt;/p&gt;</description></item><item><title>The Setup Wizard</title><link>/docs/wizard/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/wizard/</guid><description>&lt;h1 id="the-setup-wizard"&gt;The Setup Wizard&lt;a class="anchor" href="#the-setup-wizard"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;Setup Wizard&lt;/strong&gt; is the guided, browser-based experience that walks you from &lt;strong&gt;bare hardware in a box&lt;/strong&gt; to a &lt;strong&gt;running, production-grade &lt;a href="../philosophy/"&gt;self-hosted solution&lt;/a&gt;
&lt;/strong&gt;. It&amp;rsquo;s the front door to PSW — the one thing you open the first time.&lt;/p&gt;
&lt;p&gt;You don&amp;rsquo;t memorize commands, edit YAML by hand, or SSH into anything. You open a web page, answer questions, click buttons, and by the end you have a full platform: a &lt;a href="https://www.proxmox.com/"&gt;Proxmox&lt;/a&gt;
 hypervisor, the seven &lt;a href="../apps/#core-apps"&gt;core apps&lt;/a&gt;
, &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/HTTPS"&gt;HTTPS&lt;/a&gt;
 with valid certificates, &lt;a href="../conventions/#sso"&gt;Single Sign-On&lt;/a&gt;
, and automatic &lt;a href="../convergence/"&gt;convergence&lt;/a&gt;
 — all driven from your laptop.&lt;/p&gt;</description></item><item><title>User Project</title><link>/docs/user-project/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/user-project/</guid><description>&lt;h1 id="user-project"&gt;User Project&lt;a class="anchor" href="#user-project"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;User Project&lt;/strong&gt; is a folder on your computer that describes your entire &lt;a href="../philosophy/"&gt;self-hosted solution&lt;/a&gt;
. Think of it as the &lt;strong&gt;blueprint&lt;/strong&gt; for your entire infrastructure — it tells PSW which apps you want, where they should run, how your network is configured, and what secrets (passwords, API keys) are needed.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also a &lt;strong&gt;&lt;a href="https://git-scm.com/"&gt;git&lt;/a&gt;
 repository&lt;/strong&gt; (a version-controlled folder where every change is recorded as a snapshot you can inspect or undo), meaning every change you make is tracked. You can go back in time, see what changed, and even push your project to a remote server (like &lt;a href="https://codeberg.org/forgejo/forgejo"&gt;Forgejo&lt;/a&gt;
) to trigger &lt;a href="../convergence/"&gt;automatic deployments&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Wiring</title><link>/docs/wiring/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/wiring/</guid><description>&lt;h1 id="wiring"&gt;Wiring&lt;a class="anchor" href="#wiring"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Wiring&lt;/strong&gt; is how PSW automatically connects apps to each other. When you install &lt;a href="https://github.com/Sonarr/Sonarr"&gt;Sonarr&lt;/a&gt;
 and &lt;a href="https://github.com/Prowlarr/Prowlarr"&gt;Prowlarr&lt;/a&gt;
, they need to know about each other — Sonarr needs Prowlarr&amp;rsquo;s address and API key to search for content. Wiring takes care of that for you, automatically, without you touching a single settings page.&lt;/p&gt;
&lt;p&gt;Think of it like an electrician connecting outlets in your house. You decide where the appliances go (which apps on which &lt;a href="../infrastructure/#targets"&gt;targets&lt;/a&gt;
) — the electrician wires them together so they can talk to each other.&lt;/p&gt;</description></item><item><title>Wizard Prefill</title><link>/docs/wizard-prefill/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/wizard-prefill/</guid><description>&lt;h1 id="wizard-prefill"&gt;Wizard Prefill&lt;a class="anchor" href="#wizard-prefill"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="what-is-it"&gt;What Is It?&lt;a class="anchor" href="#what-is-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Wizard prefill&lt;/strong&gt; is a way to hand &lt;code&gt;psw wizard&lt;/code&gt; a JSON file that
&lt;em&gt;already contains everything&lt;/em&gt; the first wizard page would ask you —
your domain, your &lt;a href="https://www.openssh.com/"&gt;SSH&lt;/a&gt;
 key path, your
&lt;a href="https://opnsense.org/"&gt;OPNsense&lt;/a&gt;
 and
&lt;a href="https://www.cloudflare.com/"&gt;Cloudflare&lt;/a&gt;
 credentials, and optionally
your &lt;a href="https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol"&gt;SMTP&lt;/a&gt;

relay settings — so PSW can skip that page entirely and drop you
straight on the &lt;em&gt;next&lt;/em&gt; step (Hardware).&lt;/p&gt;
&lt;p&gt;You run it like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;psw wizard --project ~/homelab1 --prefill ~/.config/psw/homelab1.json&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;PSW reads the file, runs the exact same setup pipeline the first
page&amp;rsquo;s &amp;ldquo;Initialize Project&amp;rdquo; button would run, and then opens the
wizard in your browser already one step ahead.&lt;/p&gt;</description></item></channel></rss>