{
    "archive_path": "archive/1792102052.885508",
    "base_url": "viceconsole.fyi/blog/2026/10/10/what-i-self-host",
    "basename": "",
    "bookmarked_date": "2026-10-15 22:07",
    "canonical": {
        "archive_org_path": "https://web.archive.org/web/viceconsole.fyi/blog/2026/10/10/what-i-self-host",
        "dom_path": "output.html",
        "favicon_path": "favicon.ico",
        "git_path": "git/",
        "google_favicon_path": "https://www.google.com/s2/favicons?domain=viceconsole.fyi",
        "headers_path": "headers.json",
        "htmltotext_path": "htmltotext.txt",
        "index_path": "index.html",
        "media_path": "media/",
        "mercury_path": "mercury/content.html",
        "pdf_path": "output.pdf",
        "readability_path": "readability/content.html",
        "screenshot_path": "screenshot.png",
        "singlefile_path": "singlefile.html",
        "warc_path": "warc/",
        "wget_path": "viceconsole.fyi/blog/2026/10/10/what-i-self-host/index.html"
    },
    "domain": "viceconsole.fyi",
    "extension": "",
    "hash": "SF798R45CQP9PMJM54N2",
    "history": {
        "archive_org": [],
        "dom": [],
        "favicon": [
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--max-time",
                    "120",
                    "--output",
                    "favicon.ico",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://www.google.com/s2/favicons?domain=viceconsole.fyi"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-15T22:12:19.865981+00:00",
                "index_texts": null,
                "output": "favicon.ico",
                "pwd": "/data/archive/1792102052.885508",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-15T22:12:19.181147+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--max-time",
                    "120",
                    "--output",
                    "favicon.ico",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://www.google.com/s2/favicons?domain=viceconsole.fyi"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-16T01:41:15.934613+00:00",
                "index_texts": null,
                "output": "favicon.ico",
                "pwd": "/data/archive/1792102052.885508",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-16T01:41:15.313195+00:00",
                "status": "succeeded"
            }
        ],
        "git": [],
        "headers": [
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--head",
                    "--max-time",
                    "120",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://viceconsole.fyi/blog/2026/10/10/what-i-self-host/"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-15T22:12:20.513929+00:00",
                "index_texts": null,
                "output": "headers.json",
                "pwd": "/data/archive/1792102052.885508",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-15T22:12:19.875381+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--head",
                    "--max-time",
                    "120",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://viceconsole.fyi/blog/2026/10/10/what-i-self-host/"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-16T01:41:16.508423+00:00",
                "index_texts": null,
                "output": "headers.json",
                "pwd": "/data/archive/1792102052.885508",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-16T01:41:15.941860+00:00",
                "status": "succeeded"
            }
        ],
        "htmltotext": [],
        "media": [],
        "mercury": [
            {
                "cmd": [
                    "/app/node_modules/@postlight/parser/cli.js",
                    "https://viceconsole.fyi/blog/2026/10/10/what-i-self-host/"
                ],
                "cmd_version": "1.0.0",
                "end_ts": "2026-10-15T22:12:27.839019+00:00",
                "index_texts": null,
                "output": "mercury",
                "pwd": "/data/archive/1792102052.885508",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-15T22:12:22.964532+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "/app/node_modules/@postlight/parser/cli.js",
                    "https://viceconsole.fyi/blog/2026/10/10/what-i-self-host/"
                ],
                "cmd_version": "1.0.0",
                "end_ts": "2026-10-16T01:41:22.996998+00:00",
                "index_texts": null,
                "output": "mercury",
                "pwd": "/data/archive/1792102052.885508",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-16T01:41:18.659120+00:00",
                "status": "succeeded"
            }
        ],
        "pdf": [],
        "readability": [
            {
                "cmd": [
                    "/app/node_modules/readability-extractor/readability-extractor",
                    "/tmp/tmpf_3l9vau",
                    "https://viceconsole.fyi/blog/2026/10/10/what-i-self-host/"
                ],
                "cmd_version": "0.0.11",
                "end_ts": "2026-10-15T22:12:22.950703+00:00",
                "index_texts": [
                    "What I Self-Host, What I Don\u2019t, and Why\nI\u2019ve always had a foot in the self-hosting world, long before it was called that. My freshman year of university, I ran a website from a Linux box underneath my bed. There was some downtime when my roommate got tired of the fan noise and turned it off. For several years I ran MythTV, then XBMC (later known as Kodi).\nRecently, I lived for a few years in India, where streaming services are extremely inexpensive by western standards. We had Netflix, Disney Plus (Hotstar in India), and Spotify. After leaving India, I was unwilling to pay western prices for these services. But I had also become fed up with the engagement treadmill, particularly for my son. We wanted to limit his viewing choices to certain programming, but the constant \u201crecommended for you\u201d and \u201cup next\u201d caused conflict. While there are ways to limit content to specific titles, or disable auto-play, doing this for each service and keeping track of when client applications change and need to be reconfigured is too much work.\nSo, I \u201ccut the cord\u201d in a different sense, ditching streaming services for self-hosted Jellyfin. Over the course of the next year and a half, Jellyfin opened the door to self-hosting many other services, reducing my dependence on cloud service providers, and providing a welcome stability. No longer am I constantly confronted with unnecessary site redesigns, new features of questionable value, and a barrage of e-mails about terms-of-service updates, binding arbitration, data breaches, etc. I read the release notes of new versions of the software I host and decide if and when I want to upgrade.\nRules\nI have a few ground rules.\nWith the exception of VPN servers that run on my router, I do not expose any services directly to the public internet. I don\u2019t care how convenient it would be, or how secure an application is. Especially with AI-assisted hacking, I simply don\u2019t think it\u2019s wise. My ISP also uses CGNAT for its IPv4 addresses, so my home network is not directly reachable from the public internet via IPv4. My VPN servers are only publicly routable on IPv6, a limitation that has some downsides but is workable for my use cases, and likely helps limit unfriendly attempted connections. The biggest downside is that my VPN will almost never function on a public Wifi network, since these rarely offer IPv6. When using my phone, I can disable Wi-Fi and connect over mobile data\u2026 if there is service.\nI prefer running services natively when possible, but will containerize complex services or those with many dependencies. Love: a service that\u2019s a single Go binary. A service that only comes as a Docker compose file and wants to run MySQL, Redis, and three other containers? I\u2019m already looking for an alternative. If the dependencies aren\u2019t overwhelming, native is better, faster, and more efficient. I can use the same management tools and commands across multiple services. There\u2019s no mental overhead of having to get into this container to run some command, finding out this container is missing curl, that one runs busybox so all the arguments are different, or dealing with a virtual network and host port mapping.\nRelated, I don\u2019t do Docker anymore. It\u2019s not really a principled position, but I grew tired of having to manage a completely separate service control system on my server. I\u2019m already using systemd, and at this point Podman\u2019s integration with systemd is excellent.\nHardware\nLast year I bought a Beelink Mini PC, specifically an S12 Pro with an Intel N100 processor, 16 GB RAM, and a 512 GB internal SSD. It was before the rampocalypse, so I paid EUR 180. The same listing on Amazon is currently EUR 359. Ouch! Attached to the server is a 6 TB hard drive for media storage.\nMy comment on Hacker News about what I self-host prompted some questions about how all of this could run on 16 GB RAM. As I describe below, there are some choices I\u2019ve made that reduce resource demand on my server, but ultimately it turns out you don\u2019t need much hardware to run a lot of stuff. Obviously I\u2019m not running any local inference on this hardware, but for everything non-AI, it has just worked out of the box, or with some simple configuration tweaks.\nServices\nIn alphabetical order.\nActual Budget\nBudgeting software with desktop clients and a web application, custom reports, and rules-based categorization. I only use this for budgeting and checking/savings/credit accounts. For tracking investment accounts, I use a cloud service. Some day I\u2019ll try to move away from the latter\u2026\nWhile Actual Budget supports automatic transaction import from various banks, I don\u2019t use this feature. Instead, after each month end, I download the prior month\u2019s transactions (OFX format preferred, CSV if no other option) and import them manually. This works for me because I primarily use Actual Budget for expense tracking, not\u2026 actual\u2026 budgeting.\nPodman.\nAudiobookshelf\nAdd, download and store audiobooks and podcasts on your server, listen to them on your phone. I haven\u2019t used the audiobook feature much, I set it up more for my kids, but it has very nice chapter handling. In the past for podcasts I used PlayerFM, then Pocket Casts, but now unless I\u2019m out of the house without VPN connectivity, I use Audiobookshelf.\nNative.\nAutomatic Ripping Machine (ARM)\nARM automates ripping and transcoding DVDs (and Blu-rays, but I don\u2019t do those). Yes, it\u2019s 2026 and I still rip DVDs. Remember, we cut the cord, so not only is this a conduit for new-to-us content, but it\u2019s also a way for us to get bilingual content (English and French).\nPodman.\nBackrest\nWeb UI for Restic backup software. Backups are important! Especially for Immich (photos). Restic does a good job deduplicating and compressing backed up data, and Backrest makes it easy to manage the storage retention policies. Notifications in case of failure go to Gotify.\nNative.\nBeszel\nBeszel is a simple monitoring dashboard that collects basic stats from agents (in the old-fashioned sense of a small background service) to display CPU load, memory and disk usage, temperature, battery, etc. Helps me keep an eye on various other hosts I have around the house (several Rapsberry Pis and a Proxmox cluster that may be the subject of a future post).\nNative.\nCaddy\nCaddy is a web server and reverse proxy. Early on I didn\u2019t understand the value of a reverse proxy, and I thought I would be fine accessing my services with a local DNS name, or even IP address, and port number. But then I started adding more and more services, and some required HTTPS. So I got a domain name (not this one) and set up Caddy to automatically obtain LetsEncrypt SSL certificates, and now nearly all of my services are accessible on my LAN (or over VPN) with HTTPS and friendly subdomain names. Adding a new service is a quick edit to the Caddyfile.\nNative.\nCockpit\nCockpit is a web-based admin console for the server. It uses normal system authentication methods. For me, it\u2019s mainly useful for spotting failed services when no notifications are set up for them.\nNative.\nForgejo\nForgejo is a fork of Gitea, and deploys as a single binary. Github\u2019s uptime is the butt of a lot of jokes these days, but I also appreciate the speed of having my own git remote. Eventually I\u2019ll set up CI/CD and runners, if only to deploy this blog.\nNative.\n\nWeb-based RSS reader. These days I basically visit two websites, though, so I\u2019ve not been using it much. I do subscribe to the Github releases of some of the services I self-host so I can check out the features and bugfixes in new versions.\nNative.\nFrigate\nNetwork video recorder (NVR). I first started with Zoneminder because I\u2019m of a certain age. But it became clear that Zoneminder is past its prime. Frigate has been fantastic. I run it with 8 IP cameras. It provides alerts for people and cars entering the driveway, integrates with Home Assistant to power various automations (e.g., when a person is detected in the backyard, turn on the camera floodlight). I may write a future post with some details about my IP camera adventures.\nI run all of my cameras at lower resolutions than they support, primarily to avoid Wi-Fi network congestion. Most cameras also support an even lower-resolution RTSP substream, which is what Frigate uses for motion and object detection. Keeping the camera resolutions low avoids excessive CPU and memory from video processing, and excessive disk usage from recordings. They are good enough to identify faces, and privacy laws in my country prohibit filming public rights of way, so my cameras are not aimed at distant points.\nPodman.\nGonic\nSubsonic-compatible server written in Go. I purchased a perpetual Subsonic license a long time ago, but the original project is ancient and the modern alternatives are better. I run two separate instances of Gonic, one serves kid music, the other serves adult music.\nNative.\nGotify\nSimple notification service written in Go. Many self-hosted services directly support Gotify notifications, or can send them via a custom HTTP POST. In conjunction with Uptime Kuma, I use Gotify to get notifications about any services or devices that are down, what my kids are watching on Jellyfin, when a new podcast episode is available in Audiobookshelf, etc.\nNative.\nHome Assistant\nHome Assistant probably deserves its own post. It\u2019s fantastic, and I cannot imagine trying to accomplish the same things within a proprietary ecosystem like Google Home, Amazon Alexa, or Apple Home. Things are better now that device manufacturers are standardizing on protocols like Matter, but the control and flexibility you get with Home Assistant is hard to beat. It has a steep learning curve, though, and I need to think about realistic ways to handle potential server failure without compromising the functionality of my home.\nPodman.\nHomepage\nAt some point I realized I was running so many services, I needed another service just to keep track of them all. Homepage was a good solution. It has widgets for almost all the services I run, so I can get a quick overview of what\u2019s going on, or just a quick link to the subdomain of a service.\nPodman.\nImmich\nGoogle Photos alternative. I was tired of Google constantly promoting paid storage plans in their apps. I was able to manage my storage space, but my wife was always about to run out of room. We moved to Immich last year, just after version 2 was released. It\u2019s much faster to load pages full of photos when all the network activity is within your house. I\u2019ve come up with a solution for sharing albums with family, as well. Still a lot of work to do with Immich - I have many duplicates, and now that storage isn\u2019t a concern, I\u2019ve been less disciplined about culling photos and videos.\nPodman.\nJellyfin\nAs I mentioned in the introduction, I\u2019ve self-hosted media for a long time, going all the way back to MythTV twenty-some years ago. Jellyfin is opinionated about its media organization, but it generally works well. I only use it for movies, TV, and home videos, so I can\u2019t speak to its other features (e-books, music, photos, etc.). While my son still remembers Netflix, he is satisfied with Jellyfin. I appreciate the lack of auto-play, never seeing recommendations, and not having to scroll past a bunch of garbage to find what I want to watch.\nOne of my ways of managing resource demand is by generally preferring 720p media over 1080p or higher. And obviously when ripping DVDs, it\u2019s either 576p or 480p. I do have a 4k TV, but it\u2019s not extremely large, and while I can tell the difference in resolution between SD and HD, for almost everything, 720p seems to be good enough for me.\nPodman.\nMusic Player Daemon (MPD)\nSometimes there are solutions that just work, and don\u2019t really need to change. I think MPD is one of these. It\u2019s been around for 23 years. While Gonic is great for listening to music on my phone, even streaming music from home to my phone while I\u2019m away via VPN, MPD is how I play music through Snapcast to the whole house audio system. I run two instances of MPD, one for music, and one for podcasts.\nNative.\nPocketBase\nI used to keep track of transactions and receipts for special accounts (HSA, 529, etc.) in a SQLite file I accessed directly with SQL Workbench/J. But things became more complicated as I moved between countries, currencies, and different insurance systems, and also wanted to offer my wife the ability to enter transactions. I migrated to PocketBase, which is ultimately still just a SQLite file, but with a nice web-based management frontend that I abuse as a generic CRUD frontend. It\u2019s simple enough for my wife to use as well, and I can still run arbitrary queries against the underlying database file.\nNative.\nReadeck\nReadeck lets me tag and archive copies of stuff I read. I was a heavy Zotero user in graduate school, but I\u2019ve not needed to write a bibliography in years. However, I still read things that I want to ensure I can access later. I tried Wallabag first, but it had trouble archiving things that were paywalled, even when I was logged in on my phone. In contrast, Readeck will archive what my phone is seeing and store it on my server.\nNative.\nSamba\nSamba provides shared network storage, making it easy to copy files to and from the server, or share important documents with my wife. It\u2019s funny how a file sharing protocol first developed in the 1980s and most associated with Windows remains the best option for cross-platform file sharing on a LAN.\nNative.\nslskd\nIYKYK.\nNative.\nSnapcast\nSnapcast provides whole-house synchronized audio. Think Sonos, but without the expensive vendor lock-in and planned obsolescence. This also deserves its own post. It\u2019s complicated to set up, but it works really well. I eventually plan to purchase some additional devices primarily for use as Snapcast receivers.\nNative.\nSyncthing\nSyncthing is part of a backup strategy for my photos in Immich. I\u2019ve set up a one-way sync (receive only) on my Macbook, so that a copy of all the photos in Immich eventually make their way to my Macbook\u2019s external drive.\nNative.\nTransmission Daemon\nThis one is also self-explanatory.\nNative.\nUptime Kuma\nAfter a few instances of my wife saying \u201cX isn\u2019t working\u201d and needing to restart a service manually, I realized I needed a way to keep track of what services were running, or not. Uptime Kuma is simple but has a useful set of features. I can ping devices to ensure they\u2019re online, check the status of Podman containers, look for HTTP 2XX response codes from various services, or even parse a JSON payload and extract some details for the health check. If something goes down, I can send a Gotify notification (after a few retries, of course).\nPodman.\nVaultwarden\nSelf-hosted version of Bitwarden. For years, I used KeePass, but never had a good syncing solution, so just avoided logging into things on my phone. Meanwhile, my wife used LastPass, which had various breaches and incidents, besides autofill just not working very well. Migrating her to KeePass was not practical, and I settled on VaultWarden, which is an open-source API-compatible reimplementation of BitWarden that works with the official BitWarden clients. I\u2019m not a huge fan of the BitWarden browser extension, but it\u2019s mostly fine. The Android application is good enough, and syncs seamlessly and automatically when I\u2019m connected to my LAN; otherwise, I can connect via VPN and manually trigger a sync if needed.\nI am a little concerned that Bitwarden may eventually become hostile to VaultWarden and break the client compatibility. At this point, the only other major Bitwarden compatible client I\u2019m aware of is Keyguard, which does not have an open source license and uses a freemium model.\nPodman.\nVikunja\nI\u2019ve been a Trello user for about a decade. But after Trello\u2019s disastrous multi-day outage earlier this year, I decided to find a self-hosted alternative. I ruled out anything that involved spinning up a PostgreSQL or MySQL database for a service that will serve two users. Vikunja uses SQLite by default, though it can be configured to use other database backends. It\u2019s not perfect, and the Android application has some missing features, but it\u2019s good enough for me. Single binary deployment? Yes, please.\nPodman.\nYubal\nSimple web application to download YouTube Music playlists. I normally use yt-dlp for downloading YouTube videos, or NewPipe for watching on my phone, but Yubal will properly name, organize, and tag music downloaded from YouTube Music.\nPodman.\nNon-Services\nHere are a few things I don\u2019t self-host, tried but decided against, or am unlikely to try.\nThe *arr Stack\nSonarr, Lidarr, Radarr, etc. Every time I read about setting it up, it just sounds like a resource-intensive mess that\u2019s fundamentally prone to frequent breakage. That\u2019s the opposite of what I\u2019m looking for when choosing self-hosted services.\nCollabora Online\nWhile it would be nice to completely part ways with Google, it\u2019s hard to beat Google Docs as a highly convenient and easily accessible way to store and share information. Still, I choose LibreOffice Writer and Calc unless I have a specific reason why the document needs to be in the cloud. Since I already have a shared network drive, it seems pointless to run a service like Collabora Online (a web-based office suite) instead of just using LibreOffice locally.\nFirefly III\nI tried Firefly III before Actual Budget, thinking I needed built-in support for multiple currencies. It was a complex setup, involving multiple containers, including a container just for importing data. Actual Budget was much simpler to set up and use. For my foreign currency accounts, I have my own simple script to handle exchange rate conversion, so everything in Actual Budget stays in USD.\nOwntracks\nI like Google Maps Timeline, but after Google limited the location data to the individual device, I hoped to find a self-hosted version. But I could never get the OwnTracks Android application to consistently report my position, no matter how many battery or location settings I tried. Dawarich is another option in this space, but it wants to run \u201cat least\u201d four containers (PostgreSQL, Redis, Sidekiq, web application). For me, that\u2019s not a compelling trade of resources required versus value I\u2019m likely to obtain.\nMusic Assistant\nMusic Assistant might work better for you if you don\u2019t already have a music setup you like. In my case, I already had Gonic, Snapcast, and MPD working well. Music Assistant felt like it wanted to \u201cown\u201d everything; for example, it seemed to continually rearrange my Snapcast device groups.\nE-mail\nSelf-hosting e-mail seems like a lot of work for very little benefit. I cannot risk not being able to send or receive e-mails. Eventually I would like to transition away from Gmail to a paid provider.\nConclusion\nThat\u2019s 17 native services and 11 Podman services, all managed by systemd. htop currently shows about 7.5 GB of memory in use, and CPUs fluctuating between 30% and 40%. It turns out this Mini PC can run a lot! Given how expensive computer hardware has become due to the AI crunch, I hope we\u2019ll continue to see self-hostable projects that prioritize simplicity and efficiency."
                ],
                "output": "readability",
                "pwd": "/data/archive/1792102052.885508",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-15T22:12:21.257032+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "/app/node_modules/readability-extractor/readability-extractor",
                    "/tmp/tmpq1chythz",
                    "https://viceconsole.fyi/blog/2026/10/10/what-i-self-host/"
                ],
                "cmd_version": "0.0.11",
                "end_ts": "2026-10-16T01:41:18.648582+00:00",
                "index_texts": [
                    "What I Self-Host, What I Don\u2019t, and Why\nI\u2019ve always had a foot in the self-hosting world, long before it was called that. My freshman year of university, I ran a website from a Linux box underneath my bed. There was some downtime when my roommate got tired of the fan noise and turned it off. For several years I ran MythTV, then XBMC (later known as Kodi).\nRecently, I lived for a few years in India, where streaming services are extremely inexpensive by western standards. We had Netflix, Disney Plus (Hotstar in India), and Spotify. After leaving India, I was unwilling to pay western prices for these services. But I had also become fed up with the engagement treadmill, particularly for my son. We wanted to limit his viewing choices to certain programming, but the constant \u201crecommended for you\u201d and \u201cup next\u201d caused conflict. While there are ways to limit content to specific titles, or disable auto-play, doing this for each service and keeping track of when client applications change and need to be reconfigured is too much work.\nSo, I \u201ccut the cord\u201d in a different sense, ditching streaming services for self-hosted Jellyfin. Over the course of the next year and a half, Jellyfin opened the door to self-hosting many other services, reducing my dependence on cloud service providers, and providing a welcome stability. No longer am I constantly confronted with unnecessary site redesigns, new features of questionable value, and a barrage of e-mails about terms-of-service updates, binding arbitration, data breaches, etc. I read the release notes of new versions of the software I host and decide if and when I want to upgrade.\nRules\nI have a few ground rules.\nWith the exception of VPN servers that run on my router, I do not expose any services directly to the public internet. I don\u2019t care how convenient it would be, or how secure an application is. Especially with AI-assisted hacking, I simply don\u2019t think it\u2019s wise. My ISP also uses CGNAT for its IPv4 addresses, so my home network is not directly reachable from the public internet via IPv4. My VPN servers are only publicly routable on IPv6, a limitation that has some downsides but is workable for my use cases, and likely helps limit unfriendly attempted connections. The biggest downside is that my VPN will almost never function on a public Wifi network, since these rarely offer IPv6. When using my phone, I can disable Wi-Fi and connect over mobile data\u2026 if there is service.\nI prefer running services natively when possible, but will containerize complex services or those with many dependencies. Love: a service that\u2019s a single Go binary. A service that only comes as a Docker compose file and wants to run MySQL, Redis, and three other containers? I\u2019m already looking for an alternative. If the dependencies aren\u2019t overwhelming, native is better, faster, and more efficient. I can use the same management tools and commands across multiple services. There\u2019s no mental overhead of having to get into this container to run some command, finding out this container is missing curl, that one runs busybox so all the arguments are different, or dealing with a virtual network and host port mapping.\nRelated, I don\u2019t do Docker anymore. It\u2019s not really a principled position, but I grew tired of having to manage a completely separate service control system on my server. I\u2019m already using systemd, and at this point Podman\u2019s integration with systemd is excellent.\nHardware\nLast year I bought a Beelink Mini PC, specifically an S12 Pro with an Intel N100 processor, 16 GB RAM, and a 512 GB internal SSD. It was before the rampocalypse, so I paid EUR 180. The same listing on Amazon is currently EUR 359. Ouch! Attached to the server is a 6 TB hard drive for media storage.\nMy comment on Hacker News about what I self-host prompted some questions about how all of this could run on 16 GB RAM. As I describe below, there are some choices I\u2019ve made that reduce resource demand on my server, but ultimately it turns out you don\u2019t need much hardware to run a lot of stuff. Obviously I\u2019m not running any local inference on this hardware, but for everything non-AI, it has just worked out of the box, or with some simple configuration tweaks.\nServices\nIn alphabetical order.\nActual Budget\nBudgeting software with desktop clients and a web application, custom reports, and rules-based categorization. I only use this for budgeting and checking/savings/credit accounts. For tracking investment accounts, I use a cloud service. Some day I\u2019ll try to move away from the latter\u2026\nWhile Actual Budget supports automatic transaction import from various banks, I don\u2019t use this feature. Instead, after each month end, I download the prior month\u2019s transactions (OFX format preferred, CSV if no other option) and import them manually. This works for me because I primarily use Actual Budget for expense tracking, not\u2026 actual\u2026 budgeting.\nPodman.\nAudiobookshelf\nAdd, download and store audiobooks and podcasts on your server, listen to them on your phone. I haven\u2019t used the audiobook feature much, I set it up more for my kids, but it has very nice chapter handling. In the past for podcasts I used PlayerFM, then Pocket Casts, but now unless I\u2019m out of the house without VPN connectivity, I use Audiobookshelf.\nNative.\nAutomatic Ripping Machine (ARM)\nARM automates ripping and transcoding DVDs (and Blu-rays, but I don\u2019t do those). Yes, it\u2019s 2026 and I still rip DVDs. Remember, we cut the cord, so not only is this a conduit for new-to-us content, but it\u2019s also a way for us to get bilingual content (English and French).\nPodman.\nBackrest\nWeb UI for Restic backup software. Backups are important! Especially for Immich (photos). Restic does a good job deduplicating and compressing backed up data, and Backrest makes it easy to manage the storage retention policies. Notifications in case of failure go to Gotify.\nNative.\nBeszel\nBeszel is a simple monitoring dashboard that collects basic stats from agents (in the old-fashioned sense of a small background service) to display CPU load, memory and disk usage, temperature, battery, etc. Helps me keep an eye on various other hosts I have around the house (several Rapsberry Pis and a Proxmox cluster that may be the subject of a future post).\nNative.\nCaddy\nCaddy is a web server and reverse proxy. Early on I didn\u2019t understand the value of a reverse proxy, and I thought I would be fine accessing my services with a local DNS name, or even IP address, and port number. But then I started adding more and more services, and some required HTTPS. So I got a domain name (not this one) and set up Caddy to automatically obtain LetsEncrypt SSL certificates, and now nearly all of my services are accessible on my LAN (or over VPN) with HTTPS and friendly subdomain names. Adding a new service is a quick edit to the Caddyfile.\nNative.\nCockpit\nCockpit is a web-based admin console for the server. It uses normal system authentication methods. For me, it\u2019s mainly useful for spotting failed services when no notifications are set up for them.\nNative.\nForgejo\nForgejo is a fork of Gitea, and deploys as a single binary. Github\u2019s uptime is the butt of a lot of jokes these days, but I also appreciate the speed of having my own git remote. Eventually I\u2019ll set up CI/CD and runners, if only to deploy this blog.\nNative.\n\nWeb-based RSS reader. These days I basically visit two websites, though, so I\u2019ve not been using it much. I do subscribe to the Github releases of some of the services I self-host so I can check out the features and bugfixes in new versions.\nNative.\nFrigate\nNetwork video recorder (NVR). I first started with Zoneminder because I\u2019m of a certain age. But it became clear that Zoneminder is past its prime. Frigate has been fantastic. I run it with 8 IP cameras. It provides alerts for people and cars entering the driveway, integrates with Home Assistant to power various automations (e.g., when a person is detected in the backyard, turn on the camera floodlight). I may write a future post with some details about my IP camera adventures.\nI run all of my cameras at lower resolutions than they support, primarily to avoid Wi-Fi network congestion. Most cameras also support an even lower-resolution RTSP substream, which is what Frigate uses for motion and object detection. Keeping the camera resolutions low avoids excessive CPU and memory from video processing, and excessive disk usage from recordings. They are good enough to identify faces, and privacy laws in my country prohibit filming public rights of way, so my cameras are not aimed at distant points.\nPodman.\nGonic\nSubsonic-compatible server written in Go. I purchased a perpetual Subsonic license a long time ago, but the original project is ancient and the modern alternatives are better. I run two separate instances of Gonic, one serves kid music, the other serves adult music.\nNative.\nGotify\nSimple notification service written in Go. Many self-hosted services directly support Gotify notifications, or can send them via a custom HTTP POST. In conjunction with Uptime Kuma, I use Gotify to get notifications about any services or devices that are down, what my kids are watching on Jellyfin, when a new podcast episode is available in Audiobookshelf, etc.\nNative.\nHome Assistant\nHome Assistant probably deserves its own post. It\u2019s fantastic, and I cannot imagine trying to accomplish the same things within a proprietary ecosystem like Google Home, Amazon Alexa, or Apple Home. Things are better now that device manufacturers are standardizing on protocols like Matter, but the control and flexibility you get with Home Assistant is hard to beat. It has a steep learning curve, though, and I need to think about realistic ways to handle potential server failure without compromising the functionality of my home.\nPodman.\nHomepage\nAt some point I realized I was running so many services, I needed another service just to keep track of them all. Homepage was a good solution. It has widgets for almost all the services I run, so I can get a quick overview of what\u2019s going on, or just a quick link to the subdomain of a service.\nPodman.\nImmich\nGoogle Photos alternative. I was tired of Google constantly promoting paid storage plans in their apps. I was able to manage my storage space, but my wife was always about to run out of room. We moved to Immich last year, just after version 2 was released. It\u2019s much faster to load pages full of photos when all the network activity is within your house. I\u2019ve come up with a solution for sharing albums with family, as well. Still a lot of work to do with Immich - I have many duplicates, and now that storage isn\u2019t a concern, I\u2019ve been less disciplined about culling photos and videos.\nPodman.\nJellyfin\nAs I mentioned in the introduction, I\u2019ve self-hosted media for a long time, going all the way back to MythTV twenty-some years ago. Jellyfin is opinionated about its media organization, but it generally works well. I only use it for movies, TV, and home videos, so I can\u2019t speak to its other features (e-books, music, photos, etc.). While my son still remembers Netflix, he is satisfied with Jellyfin. I appreciate the lack of auto-play, never seeing recommendations, and not having to scroll past a bunch of garbage to find what I want to watch.\nOne of my ways of managing resource demand is by generally preferring 720p media over 1080p or higher. And obviously when ripping DVDs, it\u2019s either 576p or 480p. I do have a 4k TV, but it\u2019s not extremely large, and while I can tell the difference in resolution between SD and HD, for almost everything, 720p seems to be good enough for me.\nPodman.\nMusic Player Daemon (MPD)\nSometimes there are solutions that just work, and don\u2019t really need to change. I think MPD is one of these. It\u2019s been around for 23 years. While Gonic is great for listening to music on my phone, even streaming music from home to my phone while I\u2019m away via VPN, MPD is how I play music through Snapcast to the whole house audio system. I run two instances of MPD, one for music, and one for podcasts.\nNative.\nPocketBase\nI used to keep track of transactions and receipts for special accounts (HSA, 529, etc.) in a SQLite file I accessed directly with SQL Workbench/J. But things became more complicated as I moved between countries, currencies, and different insurance systems, and also wanted to offer my wife the ability to enter transactions. I migrated to PocketBase, which is ultimately still just a SQLite file, but with a nice web-based management frontend that I abuse as a generic CRUD frontend. It\u2019s simple enough for my wife to use as well, and I can still run arbitrary queries against the underlying database file.\nNative.\nReadeck\nReadeck lets me tag and archive copies of stuff I read. I was a heavy Zotero user in graduate school, but I\u2019ve not needed to write a bibliography in years. However, I still read things that I want to ensure I can access later. I tried Wallabag first, but it had trouble archiving things that were paywalled, even when I was logged in on my phone. In contrast, Readeck will archive what my phone is seeing and store it on my server.\nNative.\nSamba\nSamba provides shared network storage, making it easy to copy files to and from the server, or share important documents with my wife. It\u2019s funny how a file sharing protocol first developed in the 1980s and most associated with Windows remains the best option for cross-platform file sharing on a LAN.\nNative.\nslskd\nIYKYK.\nNative.\nSnapcast\nSnapcast provides whole-house synchronized audio. Think Sonos, but without the expensive vendor lock-in and planned obsolescence. This also deserves its own post. It\u2019s complicated to set up, but it works really well. I eventually plan to purchase some additional devices primarily for use as Snapcast receivers.\nNative.\nSyncthing\nSyncthing is part of a backup strategy for my photos in Immich. I\u2019ve set up a one-way sync (receive only) on my Macbook, so that a copy of all the photos in Immich eventually make their way to my Macbook\u2019s external drive.\nNative.\nTransmission Daemon\nThis one is also self-explanatory.\nNative.\nUptime Kuma\nAfter a few instances of my wife saying \u201cX isn\u2019t working\u201d and needing to restart a service manually, I realized I needed a way to keep track of what services were running, or not. Uptime Kuma is simple but has a useful set of features. I can ping devices to ensure they\u2019re online, check the status of Podman containers, look for HTTP 2XX response codes from various services, or even parse a JSON payload and extract some details for the health check. If something goes down, I can send a Gotify notification (after a few retries, of course).\nPodman.\nVaultwarden\nSelf-hosted version of Bitwarden. For years, I used KeePass, but never had a good syncing solution, so just avoided logging into things on my phone. Meanwhile, my wife used LastPass, which had various breaches and incidents, besides autofill just not working very well. Migrating her to KeePass was not practical, and I settled on VaultWarden, which is an open-source API-compatible reimplementation of BitWarden that works with the official BitWarden clients. I\u2019m not a huge fan of the BitWarden browser extension, but it\u2019s mostly fine. The Android application is good enough, and syncs seamlessly and automatically when I\u2019m connected to my LAN; otherwise, I can connect via VPN and manually trigger a sync if needed.\nI am a little concerned that Bitwarden may eventually become hostile to VaultWarden and break the client compatibility. At this point, the only other major Bitwarden compatible client I\u2019m aware of is Keyguard, which does not have an open source license and uses a freemium model.\nPodman.\nVikunja\nI\u2019ve been a Trello user for about a decade. But after Trello\u2019s disastrous multi-day outage earlier this year, I decided to find a self-hosted alternative. I ruled out anything that involved spinning up a PostgreSQL or MySQL database for a service that will serve two users. Vikunja uses SQLite by default, though it can be configured to use other database backends. It\u2019s not perfect, and the Android application has some missing features, but it\u2019s good enough for me. Single binary deployment? Yes, please.\nPodman.\nYubal\nSimple web application to download YouTube Music playlists. I normally use yt-dlp for downloading YouTube videos, or NewPipe for watching on my phone, but Yubal will properly name, organize, and tag music downloaded from YouTube Music.\nPodman.\nNon-Services\nHere are a few things I don\u2019t self-host, tried but decided against, or am unlikely to try.\nThe *arr Stack\nSonarr, Lidarr, Radarr, etc. Every time I read about setting it up, it just sounds like a resource-intensive mess that\u2019s fundamentally prone to frequent breakage. That\u2019s the opposite of what I\u2019m looking for when choosing self-hosted services.\nCollabora Online\nWhile it would be nice to completely part ways with Google, it\u2019s hard to beat Google Docs as a highly convenient and easily accessible way to store and share information. Still, I choose LibreOffice Writer and Calc unless I have a specific reason why the document needs to be in the cloud. Since I already have a shared network drive, it seems pointless to run a service like Collabora Online (a web-based office suite) instead of just using LibreOffice locally.\nFirefly III\nI tried Firefly III before Actual Budget, thinking I needed built-in support for multiple currencies. It was a complex setup, involving multiple containers, including a container just for importing data. Actual Budget was much simpler to set up and use. For my foreign currency accounts, I have my own simple script to handle exchange rate conversion, so everything in Actual Budget stays in USD.\nOwntracks\nI like Google Maps Timeline, but after Google limited the location data to the individual device, I hoped to find a self-hosted version. But I could never get the OwnTracks Android application to consistently report my position, no matter how many battery or location settings I tried. Dawarich is another option in this space, but it wants to run \u201cat least\u201d four containers (PostgreSQL, Redis, Sidekiq, web application). For me, that\u2019s not a compelling trade of resources required versus value I\u2019m likely to obtain.\nMusic Assistant\nMusic Assistant might work better for you if you don\u2019t already have a music setup you like. In my case, I already had Gonic, Snapcast, and MPD working well. Music Assistant felt like it wanted to \u201cown\u201d everything; for example, it seemed to continually rearrange my Snapcast device groups.\nE-mail\nSelf-hosting e-mail seems like a lot of work for very little benefit. I cannot risk not being able to send or receive e-mails. Eventually I would like to transition away from Gmail to a paid provider.\nConclusion\nThat\u2019s 17 native services and 11 Podman services, all managed by systemd. htop currently shows about 7.5 GB of memory in use, and CPUs fluctuating between 30% and 40%. It turns out this Mini PC can run a lot! Given how expensive computer hardware has become due to the AI crunch, I hope we\u2019ll continue to see self-hostable projects that prioritize simplicity and efficiency."
                ],
                "output": "readability",
                "pwd": "/data/archive/1792102052.885508",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-16T01:41:16.935706+00:00",
                "status": "succeeded"
            }
        ],
        "screenshot": [],
        "singlefile": [],
        "title": [
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--max-time",
                    "120",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://viceconsole.fyi/blog/2026/10/10/what-i-self-host/"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-15T22:12:21.242605+00:00",
                "index_texts": null,
                "output": "What I Self-Host | Clever Blog Title",
                "pwd": "/data/archive/1792102052.885508",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-15T22:12:21.230168+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--max-time",
                    "120",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) curl/curl 8.14.1 (x86_64-pc-linux-gnu)",
                    "https://viceconsole.fyi/blog/2026/10/10/what-i-self-host/"
                ],
                "cmd_version": "curl 8.14.1 (x86_64-pc-linux-gnu)",
                "end_ts": "2026-10-16T01:41:16.928514+00:00",
                "index_texts": null,
                "output": "What I Self-Host | Clever Blog Title",
                "pwd": "/data/archive/1792102052.885508",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-16T01:41:16.917207+00:00",
                "status": "succeeded"
            }
        ],
        "wget": [
            {
                "cmd": [
                    "wget",
                    "--no-verbose",
                    "--adjust-extension",
                    "--convert-links",
                    "--force-directories",
                    "--span-hosts",
                    "--no-parent",
                    "-e",
                    "robots=off",
                    "--reject=js,mjs,woff,woff2,ttf,otf,eot,mp4,m4v,mov,webm,ogv,mkv,avi,flv",
                    "--timeout=120",
                    "--restrict-file-names=windows",
                    "--page-requisites",
                    "--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) wget/GNU Wget 1.21.3",
                    "--compression=auto",
                    "--timestamping",
                    "https://viceconsole.fyi/blog/2026/10/10/what-i-self-host/"
                ],
                "cmd_version": "GNU Wget 1.21.3",
                "end_ts": "2026-10-15T22:12:21.220983+00:00",
                "index_texts": null,
                "output": "viceconsole.fyi/blog/2026/10/10/what-i-self-host/index.html",
                "pwd": "/data/archive/1792102052.885508",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-15T22:12:20.524561+00:00",
                "status": "succeeded"
            },
            {
                "cmd": [
                    "wget",
                    "--no-verbose",
                    "--adjust-extension",
                    "--convert-links",
                    "--force-directories",
                    "--span-hosts",
                    "--no-parent",
                    "-e",
                    "robots=off",
                    "--reject=js,mjs,woff,woff2,ttf,otf,eot,mp4,m4v,mov,webm,ogv,mkv,avi,flv",
                    "--timeout=120",
                    "--restrict-file-names=windows",
                    "--page-requisites",
                    "--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 ArchiveBox/0.7.4 (+https://github.com/ArchiveBox/ArchiveBox/) wget/GNU Wget 1.21.3",
                    "--compression=auto",
                    "--timestamping",
                    "https://viceconsole.fyi/blog/2026/10/10/what-i-self-host/"
                ],
                "cmd_version": "GNU Wget 1.21.3",
                "end_ts": "2026-10-16T01:41:16.907476+00:00",
                "index_texts": null,
                "output": "IndexError: list index out of range",
                "pwd": "/data/archive/1792102052.885508",
                "schema": "ArchiveResult",
                "start_ts": "2026-10-16T01:41:16.518302+00:00",
                "status": "failed"
            }
        ]
    },
    "icons": null,
    "is_archived": true,
    "is_static": false,
    "latest": {
        "archive_org": null,
        "dom": null,
        "favicon": "favicon.ico",
        "git": null,
        "media": null,
        "pdf": null,
        "screenshot": null,
        "singlefile": null,
        "title": "What I Self-Host | Clever Blog Title",
        "warc": null,
        "wget": "IndexError: list index out of range"
    },
    "link_dir": "/data/archive/1792102052.885508",
    "newest_archive_date": "2026-10-16T01:41:18.659120+00:00",
    "num_failures": 1,
    "num_outputs": 11,
    "oldest_archive_date": "2026-10-15T22:12:19.181147+00:00",
    "path": "/blog/2026/10/10/what-i-self-host/",
    "schema": "Link",
    "scheme": "https",
    "snapshot_id": "b7ad7937-d7b9-4cb9-b180-c7a33e1a1ebd",
    "sources": [
        "/data/sources/1792102052-import.txt"
    ],
    "tags": ",war-wiki",
    "tags_str": "war-wiki",
    "timestamp": "1792102052.885508",
    "title": "What I Self-Host | Clever Blog Title",
    "updated": "2026-10-16T01:41:15.312993+00:00",
    "updated_date": "2026-10-16 01:41",
    "url": "https://viceconsole.fyi/blog/2026/10/10/what-i-self-host/"
}