Post

What I'm Running in My Homelab in 2026

What I'm Running in My Homelab in 2026

In my last homelab tour, I focused on the hardware.

This time, I wanted to answer the question a lot of people asked after that video: what am I actually running on all of this infrastructure?

So this is the software side of the lab in 2026. The services, the applications, and the systems that make the hardware useful.

Some of this is practical. Some of it is for learning. Some of it replaces tools I would otherwise pay for. And some of it is simply because I enjoy self-hosting.

Watch the video


The basic shape of the lab

At a high level, I am running three main layers:

It is a fairly broad setup, but it has settled into a structure that makes sense for how I use the lab.

At home, I keep most of my internal services close to the data. In practice, that means many applications now live directly on TrueNAS with Docker Compose.

For public-facing services and the workloads I want to run in a more orchestrated way, I place those in Kubernetes in my co-location environment.

That split has worked well for me:

  • Home services: Docker on TrueNAS
  • Public services: Kubernetes in co-location

It keeps the home side simpler while still giving me room to run more distributed workloads where it makes sense and to keep my Kubernetes skills sharp.


Network first

Everything starts with the network.

I simplified the network quite a bit this year. I used to have more VLANS which added more complexity. I scaled them back a bit to a network that is easier to maintain and easier to reason about.

My main VLANs are:

  • Main
  • IoT
  • Cameras
  • Management, depending on how you count it

My trusted devices live on main. Laptops, workstations, phones, Apple TVs, HomePods,and my NAS.

I put my HomePods and Apple TVs on this network because it’s much easier (and safer I believe) than trying to create dozens of firewall rules from Main to IoT that I could mess up.

IoT contains the devices I do not fully trust or do not want sharing the same space as my main devices. Lights, thermostats, and similar devices go there.

Cameras are on their own VLAN, which makes sense both from a security standpoint and from a traffic standpoint.

One thing I have to tell myself over and over is that secure does not always mean complicated. A simpler network that I understand is way better than a more elaborate design that becomes difficult to maintain.


Co-location

I also have a few servers running in a co-location. These are 1u servers that I use to run at home.

I moved them there because some of my public-facing services outgrew being hosted at home. After enough traffic hit my documentation site, it became clear that I should move that kind of workload out of the house from both a security and reliability standpoint.

So now I have a few machines there, still on hardware I own, still running services I manage, just with better power, better network, and more separation from my homelab.

There is also a VPN between home and co-location, which makes management and backups easier.

That setup has been a good middle ground between running everything at home and moving everything into the cloud.


Of course, I am still using Proxmox

I am still running Proxmox, and I do not expect that to change anytime soon. It’s great and does everything I want, except native OCI containers (but don’t get me started on that)

At home I have a three-node cluster, and I have another three-node cluster in my co-location. I am not clustering Proxmox because I want Proxmox itself to be the HA, I am clustering it because I want:

  • one pane of glass
  • easier migrations
  • easier backups

That is really all I need. One day if I get a faster network or just want to play with Ceph I will reconsider.

I am not doing HA VMs or HA LXCs in the Proxmox sense. I would rather push high availability down into the service layer itself.

So instead making a VM is highly available, I would rather run three Postgres nodes on LXC, or three Kubernetes control-plane nodes, or redundant DNS, and let the application or platform handle failure the way it was designed to.

This approach better aligns to the way I build and manage systems outside of my homelab.


TrueNAS became more than storage

One of the bigger changes this year is that TrueNAS stopped being just storage and became more like my home production box. “Home Prod” is what I have been calling it.

It is still where my data lives. ZFS, datasets, shares, snapshots, and replication are still at the core of the system.

But now it is also where many of my applications live.

Once I found out I could use Docker Compose on TrueNAS, I went all in and migrated all of my apps to this pattern. Now that I run my apps on TrueNAS, I can keep app data local, manage it with ZFS, snapshot it, replicate it, and roll it back the same way I do with the rest of my data.

That has a few advantages:

  • app data stays local to the machine
  • I am not moving everything over NFS and all of the headaches that come along with that
  • snapshots are easy
  • replication is easy
  • my operational model stays consistent

It is one of the changes that made my NAS feel much more useful.


How I think about Docker vs Kubernetes

I get asked this a lot.

For me, the answer is fairly simple:

  • Docker Compose on TrueNAS for home services
  • Kubernetes for public services and orchestrated workloads

That is not because Kubernetes is better at everything. It is because not everything benefits from Kubernetes.

A lot of services at home just need to run reliably, store some data, sit behind a reverse proxy, and be easy to back up. Docker Compose is well suited for that.

Kubernetes still makes sense for the workloads where I want a more cloud-native setup, a better GitOps flow, or more flexibility around placement and scaling.

You can absolutely run everything in Kubernetes if you want to. I just do not think that automatically improves the outcome.


The services I use most often

There are a few services that I use.

Homepage

I still use Homepage as my main dashboard.

At this point it is less about live status and more about organization. I like that it is YAML driven, simple, and easy to manage as configuration.

It has effectively become my launch point for the rest of the services in my homelab.

Since I showed Homepage in the video, here is a redacted version of the config I am using. I keep URLs, API keys, and host-specific values in environment variables so I can reuse the same config without hardcoding secrets.

settings.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
---
title: Techno Tim Homepage

background:
  image: https://cdnb.artstation.com/p/assets/images/images/006/897/659/large/mikael-gustafsson-wallpaper-mikael-gustafsson.jpg
  blur: md # sm, md, xl... see https://tailwindcss.com/docs/backdrop-blur
  saturate: 100 # 0, 50, 100... see https://tailwindcss.com/docs/backdrop-saturate
  brightness: 50 # 0, 50, 75... see https://tailwindcss.com/docs/backdrop-brightness
  opacity: 100 # 0-100

theme: dark

color: slate

useEqualHeights: true

disableCollapse: true

target: _blank

layout:
  Hypervisor:
    header: true
    style: row
    columns: 6
  DNS:
    header: true
    style: row
    columns: 6
  Network:
    header: true
    style: row
    columns: 6
  Containers:
    header: true
    style: row
    columns: 6
  Monitoring:
    header: true
    style: row
    columns: 6
  Remote Access:
    header: true
    style: row
    columns: 7
  Storage:
    header: true
    style: row
    columns: 6
  Media:
    header: true
    style: row
    columns: 6
  Energy:
    header: true
    style: row
    columns: 6
  Home Automation:
    header: true
    style: row
    columns: 6
  AI:
    header: true
    style: row
    columns: 6
  Documents:
    header: true
    style: row
    columns: 6
  Tools:
    header: true
    style: row
    columns: 6
  Database:
    header: true
    style: row
    columns: 6
  Other:
    header: true
    style: row
    columns: 6

services.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
---
- Hypervisor:
  - Proxmox:
    icon: proxmox.svg
    href: "{{HOMEPAGE_VAR_PROXMOX_URL}}"
    description: pve1
  - Proxmox:
    icon: proxmox.svg
    href: "{{HOMEPAGE_VAR_PROXMOX_URL}}"
    description: pve2
  - Proxmox:
    icon: proxmox.svg
    href: "{{HOMEPAGE_VAR_PROXMOX_URL}}"
    description: pve3
  - Proxmox:
    icon: proxmox.svg
    href: "{{HOMEPAGE_VAR_PROXMOX_MPLS_URL}}"
    description: pve1-mpls
  - Proxmox:
    icon: proxmox.svg
    href: "{{HOMEPAGE_VAR_PROXMOX_MPLS_URL}}"
    description: pve2-mpls
  - Proxmox:
    icon: proxmox.svg
    href: "{{HOMEPAGE_VAR_PROXMOX_MPLS_URL}}"
    description: pve3-mpls
  - PBS:
    icon: proxmox.svg
    href: "{{HOMEPAGE_VAR_PBS_URL}}"
    description: backup server

- DNS:
  - pihole1:
    icon: pi-hole.svg
    href: "{{HOMEPAGE_VAR_PIHOLE_URL_1}}"
    description: pihole1
  - pihole2:
    icon: pi-hole.svg
    href: "{{HOMEPAGE_VAR_PIHOLE_URL_2}}"
    description: pihole2
  - pihole3:
    icon: pi-hole.svg
    href: "{{HOMEPAGE_VAR_PIHOLE_URL_3}}"
    description: pihole3
  - dns01:
    icon: pi-hole.svg
    href: "{{HOMEPAGE_VAR_PIHOLE_URL_4}}"
    description: dns01
  - dns02:
    icon: pi-hole.svg
    href: "{{HOMEPAGE_VAR_PIHOLE_URL_5}}"
    description: dns02

- Network:
  - UniFi:
    icon: unifi-controller.png
    href: "{{HOMEPAGE_VAR_UNIFI_NETWORK_URL}}"
    description: network
  - Traefik:
    icon: traefik-proxy.svg
    href: "{{HOMEPAGE_VAR_TRAEFIK_URL}}"
    description: reverse proxy
  - Uptime Kuma:
    icon: uptime-kuma.svg
    href: "{{HOMEPAGE_VAR_UPTIME_KUMA_URL}}"
    description: internal
  - Uptime Robot:
    icon: uptimerobot.svg
    href: "{{HOMEPAGE_VAR_UPTIME_ROBOT_URL}}"
    description: external
  - OpenSpeedTest:
    icon: openspeedtest.svg
    href: "{{HOMEPAGE_VAR_OPENSPEEDTEST_URL}}"
    description: speed test

- Containers:
  - Rancher:
    icon: rancher.svg
    href: "{{HOMEPAGE_VAR_RANCHER_URL}}"
    description: k8s
  - Longhorn:
    icon: longhorn.svg
    href: "{{HOMEPAGE_VAR_LONGHORN_URL}}"
    description: k8s storage
  - Dozzle:
    icon: dozzle.svg
    href: "{{HOMEPAGE_VAR_DOZZLE_URL}}"
    description: container logs

- Monitoring:
  - Grafana:
    icon: grafana.svg
    href: "{{HOMEPAGE_VAR_GRAFANA_URL}}"
    description: dashboards
  - Prometheus:
    icon: prometheus.svg
    href: "{{HOMEPAGE_VAR_PROMETHEUS_URL}}"
    description: metrics
  - Grafana Alloy:
    icon: alloy.svg
    href: "{{HOMEPAGE_VAR_ALLOY_URL}}"
    description: log collector
  - Scrutiny:
    icon: scrutiny.svg
    href: "{{HOMEPAGE_VAR_SCRUTINY_URL}}"
    description: drive health
  - Loki:
    icon: loki.svg
    href: "{{HOMEPAGE_VAR_LOKI_EXPLORE_URL}}"
    description: log explorer

- Remote Access:
  - PiKVM:
    icon: pikvm.svg
    href: "{{HOMEPAGE_VAR_PIKVM_URL}}"
    description: pikvm
  - kvm-1:
    icon: jetkvm.svg
    href: "{{HOMEPAGE_VAR_KVM_1_URL}}"
    description: jetkvm
  - kvm-2:
    icon: jetkvm.svg
    href: "{{HOMEPAGE_VAR_KVM_2_URL}}"
    description: jetkvm
  - kvm-3:
    icon: jetkvm.svg
    href: "{{HOMEPAGE_VAR_KVM_3_URL}}"
    description: jetkvm
  - kvm-4:
    icon: jetkvm.svg
    href: "{{HOMEPAGE_VAR_KVM_4_URL}}"
    description: jetkvm
  - kvm-5:
    icon: jetkvm.svg
    href: "{{HOMEPAGE_VAR_KVM_5_URL}}"
    description: jetkvm
  - kvm-6:
    icon: jetkvm.svg
    href: "{{HOMEPAGE_VAR_KVM_6_URL}}"
    description: jetkvm
  - IPMI:
    icon: supermicro.svg
    href: "{{HOMEPAGE_VAR_IPMI_1_URL}}"
    description: storinator
  - IPMI:
    icon: supermicro.svg
    href: "{{HOMEPAGE_VAR_IPMI_2_URL}}"
    description: hl15
  - Netboot.xyz:
    icon: netbootxyz.svg
    href: "{{HOMEPAGE_VAR_NETBOOT_URL}}"
    description: network boot
  - Code Server:
    icon: vscode.svg
    href: "{{HOMEPAGE_VAR_CODE_SERVER_URL}}"
    description: browser ide

- Storage:
  - TrueNAS:
    icon: truenas.svg
    href: "{{HOMEPAGE_VAR_TRUENAS_URL}}"
    description: scale
  - MinIO:
    icon: minio.svg
    href: "{{HOMEPAGE_VAR_MINIO_URL}}"
    description: object storage
  - Rackula:
    icon: rackula.svg
    href: "{{HOMEPAGE_VAR_RACKULA_URL}}"
    description: rack diagram
  - UNAS:
    icon: unifi-drive.svg
    href: "{{HOMEPAGE_VAR_UNAS_URL}}"
    description: nas

- Media:
  - Plex:
    icon: plex.svg
    href: "{{HOMEPAGE_VAR_PLEX_URL}}"
    description: media server
  - Tautulli:
    icon: tautulli.svg
    href: "{{HOMEPAGE_VAR_TAUTULLI_URL}}"
    description: plex stats
  - Immich:
    icon: immich.svg
    href: "{{HOMEPAGE_VAR_IMMICH_URL}}"
    description: photo library
  - Dispatcharr:
    icon: dispatcharr.svg
    href: "{{HOMEPAGE_VAR_DISPATCHARR_URL}}"
    description: media dispatcher
  - ErsatzTV:
    icon: ersatztv.png
    href: "{{HOMEPAGE_VAR_ERSATZTV_URL}}"
    description: iptv server
  - Handbrake:
    icon: handbrake.svg
    href: "{{HOMEPAGE_VAR_HANDBRAKE_URL}}"
    description: video transcoder
  - HDHomerun:
    icon: hdhomerun.svg
    href: "{{HOMEPAGE_VAR_HDHOMERUN_URL}}"
    description: flex 4k

- Energy:
  - PeaNUT:
    icon: peanut.svg
    href: "{{HOMEPAGE_VAR_PEANUT_URL}}"
    description: ups monitor
  - Tripp Lite:
    icon: "{{HOMEPAGE_VAR_TRIPP_LITE_ICON_URL}}"
    href: "{{HOMEPAGE_VAR_UPS_1_URL}}"
    description: 1500
  - Eaton:
    icon: "{{HOMEPAGE_VAR_EATON_ICON_URL}}"
    href: "{{HOMEPAGE_VAR_UPS_2_URL}}"
    description: 5p

- Home Automation:
  - Home Assistant:
    icon: home-assistant.svg
    href: "{{HOMEPAGE_VAR_HOME_ASSISTANT_URL}}"
    description: home
  - UniFi Protect:
    icon: unifi-protect.png
    href: "{{HOMEPAGE_VAR_UNIFI_PROTECT_URL}}"
    description: cameras
  - Scrypted:
    icon: scrypted.png
    href: "{{HOMEPAGE_VAR_SCRYPTED_URL}}"
    description: camera mgmt
  - Zigbee2MQTT:
    icon: zigbee2mqtt.svg
    href: "{{HOMEPAGE_VAR_ZIGBEE2MQTT_URL}}"
    description: zigbee bridge
  - SLZB-06M:
    icon: smlight.png
    href: "{{HOMEPAGE_VAR_SLZB06M_URL}}"
    description: zigbee coordinator

- AI:
  - Open WebUI:
    icon: open-webui.svg
    href: "{{HOMEPAGE_VAR_OPEN_WEBUI_URL}}"
    description: llm chat
  - n8n:
    icon: n8n.svg
    href: "{{HOMEPAGE_VAR_N8N_URL}}"
    description: workflow automation

- Documents:
  - Paperless:
    icon: paperless.svg
    href: "{{HOMEPAGE_VAR_PAPERLESS_URL}}"
    description: document mgmt
  - Paperless AI:
    icon: paperless-ai.png
    href: "{{HOMEPAGE_VAR_PAPERLESS_AI_URL}}"
    description: ai document tagging
  - Stirling PDF:
    icon: stirling-pdf.svg
    href: "{{HOMEPAGE_VAR_STIRLING_URL}}"
    description: pdf tools

- Tools:
  - IT Tools:
    icon: it-tools.svg
    href: "{{HOMEPAGE_VAR_IT_TOOLS_URL}}"
    description: developer utilities
  - SearXNG:
    icon: searxng.svg
    href: "{{HOMEPAGE_VAR_SEARXNG_URL}}"
    description: meta search engine
  - Postiz:
    icon: postiz.svg
    href: "{{HOMEPAGE_VAR_POSTIZ_URL}}"
    description: social scheduler
  - Bambu Studio:
    icon: "{{HOMEPAGE_VAR_BAMBUSTUDIO_ICON_URL}}"
    href: "{{HOMEPAGE_VAR_BAMBUSTUDIO_URL}}"
    description: 3d slicer

- Database:
  - pgAdmin:
    icon: pgadmin.svg
    href: "{{HOMEPAGE_VAR_PGADMIN_URL}}"
    description: postgres admin
  - phpMyAdmin:
    icon: phpmyadmin.svg
    href: "{{HOMEPAGE_VAR_PHPMYADMIN_URL}}"
    description: mariadb admin
  - DBgate:
    icon: "{{HOMEPAGE_VAR_DBGATE_ICON_URL}}"
    href: "{{HOMEPAGE_VAR_DBGATE_URL}}"
    description: multi-db client
  - Adminer:
    icon: adminer.svg
    href: "{{HOMEPAGE_VAR_ADMINER_URL}}"
    description: lightweight db client
  - Databasus:
    icon: databasus.svg
    href: "{{HOMEPAGE_VAR_DATABASUS_URL}}"
    description: db admin

- Other:
  - GitLab:
    icon: gitlab.svg
    href: "{{HOMEPAGE_VAR_GITLAB_URL}}"
    description: source code
  - GitHub:
    icon: github.svg
    href: "{{HOMEPAGE_VAR_GITHUB_URL}}"
    description: source code
  - Shlink:
    icon: shlink.svg
    href: "{{HOMEPAGE_VAR_SHLINK_URL}}"
    description: url shortener

.env example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
TZ=America/Chicago
HOMEPAGE_ALLOWED_HOSTS=

# Pi-hole v6 app passwords — generate in each Pi-hole > Settings > API > App passwords
HOMEPAGE_VAR_PIHOLE_API_KEY_1=
HOMEPAGE_VAR_PIHOLE_API_KEY_2=
HOMEPAGE_VAR_PIHOLE_API_KEY_3=
HOMEPAGE_VAR_PIHOLE_API_KEY_4=
HOMEPAGE_VAR_PIHOLE_API_KEY_5=
HOMEPAGE_VAR_PIHOLE_API_URL_1=
HOMEPAGE_VAR_PIHOLE_API_URL_2=
HOMEPAGE_VAR_PIHOLE_API_URL_3=
HOMEPAGE_VAR_PIHOLE_API_URL_4=
HOMEPAGE_VAR_PIHOLE_API_URL_5=
HOMEPAGE_VAR_PIHOLE_URL_1=
HOMEPAGE_VAR_PIHOLE_URL_2=
HOMEPAGE_VAR_PIHOLE_URL_3=
HOMEPAGE_VAR_PIHOLE_URL_4=
HOMEPAGE_VAR_PIHOLE_URL_5=
HOMEPAGE_VAR_PIHOLE_HOST_1=
HOMEPAGE_VAR_PIHOLE_HOST_2=
HOMEPAGE_VAR_PIHOLE_HOST_3=
HOMEPAGE_VAR_PIHOLE_HOST_4=
HOMEPAGE_VAR_PIHOLE_HOST_5=

# Hypervisor
HOMEPAGE_VAR_PROXMOX_URL=
HOMEPAGE_VAR_PROXMOX_MPLS_URL=
HOMEPAGE_VAR_PROXMOX_USER=
HOMEPAGE_VAR_PROXMOX_MPLS_USER=
HOMEPAGE_VAR_PROXMOX_API_KEY=
HOMEPAGE_VAR_PROXMOX_MPLS_API_KEY=
HOMEPAGE_VAR_PBS_URL=
HOMEPAGE_VAR_PVE_HOST_1=
HOMEPAGE_VAR_PVE_HOST_2=
HOMEPAGE_VAR_PVE_HOST_3=
HOMEPAGE_VAR_PVE_HOST_4=
HOMEPAGE_VAR_PVE_MPLS_HOST_1=
HOMEPAGE_VAR_PVE_MPLS_HOST_2=
HOMEPAGE_VAR_PVE_MPLS_HOST_3=

# Network
HOMEPAGE_VAR_UNIFI_NETWORK_URL=
HOMEPAGE_VAR_UNIFI_NETWORK_API_URL=
HOMEPAGE_VAR_UNIFI_NETWORK_USERNAME=
HOMEPAGE_VAR_UNIFI_NETWORK_PASSWORD=
HOMEPAGE_VAR_UNIFI_PROTECT_URL=
HOMEPAGE_VAR_TRAEFIK_URL=
HOMEPAGE_VAR_TRAEFIK_USERNAME=
HOMEPAGE_VAR_TRAEFIK_PASSWORD=
HOMEPAGE_VAR_UPTIME_KUMA_URL=
HOMEPAGE_VAR_UPTIME_ROBOT_URL=
HOMEPAGE_VAR_UPTIME_ROBOT_API_KEY=
HOMEPAGE_VAR_OPENSPEEDTEST_URL=
HOMEPAGE_VAR_UDM_HOST=
HOMEPAGE_VAR_UNVR=

# Containers
HOMEPAGE_VAR_RANCHER_URL=
HOMEPAGE_VAR_LONGHORN_URL=
HOMEPAGE_VAR_DOZZLE_URL=

# Monitoring
HOMEPAGE_VAR_GRAFANA_URL=
HOMEPAGE_VAR_GRAFANA_USERNAME=
HOMEPAGE_VAR_GRAFANA_PASSWORD=
HOMEPAGE_VAR_PROMETHEUS_URL=
HOMEPAGE_VAR_ALLOY_URL=
HOMEPAGE_VAR_LOKI_URL=
HOMEPAGE_VAR_LOKI_EXPLORE_URL=
HOMEPAGE_VAR_SCRUTINY_URL=

# Remote Access
HOMEPAGE_VAR_PIKVM_URL=
HOMEPAGE_VAR_PIKVM_HOST=
HOMEPAGE_VAR_KVM_1_URL=
HOMEPAGE_VAR_KVM_2_URL=
HOMEPAGE_VAR_KVM_3_URL=
HOMEPAGE_VAR_KVM_4_URL=
HOMEPAGE_VAR_KVM_5_URL=
HOMEPAGE_VAR_KVM_6_URL=
HOMEPAGE_VAR_IPMI_1_URL=
HOMEPAGE_VAR_IPMI_2_URL=
HOMEPAGE_VAR_IPMI_1_HOST=
HOMEPAGE_VAR_IPMI_2_HOST=
HOMEPAGE_VAR_NETBOOT_URL=
HOMEPAGE_VAR_CODE_SERVER_URL=
HOMEPAGE_VAR_BROADLINK_CONTROL_URL=

# Storage
HOMEPAGE_VAR_TRUENAS_URL=
HOMEPAGE_VAR_TRUENAS_API_KEY=
HOMEPAGE_VAR_TRUENAS_HOST=
HOMEPAGE_VAR_MINIO_URL=
HOMEPAGE_VAR_RACKULA_URL=
HOMEPAGE_VAR_UNAS_URL=

# Media
HOMEPAGE_VAR_PLEX_URL=
HOMEPAGE_VAR_PLEX_API_TOKEN=
HOMEPAGE_VAR_TAUTULLI_URL=
HOMEPAGE_VAR_TAUTULLI_API_KEY=
HOMEPAGE_VAR_IMMICH_URL=
HOMEPAGE_VAR_IMMICH_API_KEY=
HOMEPAGE_VAR_DISPATCHARR_URL=
HOMEPAGE_VAR_ERSATZTV_URL=
HOMEPAGE_VAR_HANDBRAKE_URL=
HOMEPAGE_VAR_HDHOMERUN_URL=
HOMEPAGE_VAR_HDHOMERUN_HOST=

# Energy
HOMEPAGE_VAR_PEANUT_URL=
HOMEPAGE_VAR_NUT_SERVER_HOST=
HOMEPAGE_VAR_UPS_1_URL=
HOMEPAGE_VAR_UPS_2_URL=
HOMEPAGE_VAR_UPS_1_HOST=
HOMEPAGE_VAR_UPS_2_HOST=
HOMEPAGE_VAR_TRIPP_LITE_ICON_URL=
HOMEPAGE_VAR_EATON_ICON_URL=

# Home Automation
HOMEPAGE_VAR_HOME_ASSISTANT_URL=
HOMEPAGE_VAR_HOME_ASSISTANT_API_KEY=
HOMEPAGE_VAR_SCRYPTED_URL=
HOMEPAGE_VAR_ZIGBEE2MQTT_URL=
HOMEPAGE_VAR_SLZB06M_URL=

# AI
HOMEPAGE_VAR_OPEN_WEBUI_URL=
HOMEPAGE_VAR_N8N_URL=
HOMEPAGE_VAR_N8N_API_KEY=

# Documents
HOMEPAGE_VAR_PAPERLESS_URL=
HOMEPAGE_VAR_PAPERLESS_API_KEY=
HOMEPAGE_VAR_PAPERLESS_AI_URL=
HOMEPAGE_VAR_STIRLING_URL=

# Tools
HOMEPAGE_VAR_IT_TOOLS_URL=
HOMEPAGE_VAR_SEARXNG_URL=
HOMEPAGE_VAR_POSTIZ_URL=
HOMEPAGE_VAR_BAMBUSTUDIO_URL=
HOMEPAGE_VAR_BAMBUSTUDIO_ICON_URL=

# Database
HOMEPAGE_VAR_PGADMIN_URL=
HOMEPAGE_VAR_PHPMYADMIN_URL=
HOMEPAGE_VAR_DBGATE_URL=
HOMEPAGE_VAR_DBGATE_ICON_URL=
HOMEPAGE_VAR_ADMINER_URL=
HOMEPAGE_VAR_DATABASUS_URL=

# Other
HOMEPAGE_VAR_GITLAB_URL=
HOMEPAGE_VAR_GITHUB_URL=
HOMEPAGE_VAR_SHLINK_URL=

LittleLinkServer

I also still use Little Link Server for all of my social links. It is simple, easy to configure, and does exactly what I need it to do.

Jekyll

My documentation site and blog are still built with Jekyll. I have tried several static site generators over time, but I chose Jekyll this time because I really like the Chirpy Theme.

I still use Shlink for link shortening and redirect control. It is one of those services that becomes more useful the longer you run it.


The core infra

The services that make self-hosting are not always the most visible ones.

Traefik

I am still using Traefik as my reverse proxy. It handles routing, certificates, and ingress for a large portion of what I run, both at home and in Kubernetes.

Pi-hole

I still rely on Pi-hole for DNS and ad blocking, but I also use it heavily for local DNS. That becomes more important as my homelab.

Nebula Sync and Keepalived

When you have multiple Pi-hole instances, you need a reliable way to keep them aligned. Nebula Sync handles the synchronization side, and Keepalived helps with failover.

One thing I changed this year was how I think about primary DNS. Most clients strongly prefer the primary until they absolutely cannot use it, so making the primary more resilient made things fail over much smoother.

Previous to discover this I was made my secondary DNS HA.


Monitoring and logging

This year I decided that if I depend on a service, I should monitor it properly.

So I leaned more heavily into:

That stack gives me a good mix of:

  • metrics
  • dashboards
  • logs
  • uptime checks
  • internal visibility
  • external visibility

This is one of the areas where self-hosting can become difficult quickly if you ignore it. It is easy to spin up an application. It is harder to notice when it is failing or throwing lots of errors.

I have also ended up relying on several exporters because many tools do not expose the metrics I want out of the box.

And for quick log visibility, Dozzle is still very useful. Sometimes you do not need a full observability workflow and all you need at the moment is to see what a container is doing right now.


Media

Media is still one of the largest categories in my homelab.

I still run Plex as my primary media server, but I also run Jellyfin against the same library. Part of that is comparison, and part of it is simply having an alternative ready.

If something changes with Plex someday, I do not want to be starting from zero.

I also run a number of companion tools around media:

  • Tautulli for activity and stats
  • Kometa for collection and metadata automation
  • HandBrake for re-encoding
  • HDHomeRun for OTA TV into Plex
  • ErsatzTV for virtual channels
  • Dispatcharr to help feed multiple channel sources into Plex

The live TV and virtual channel side of things is one of the more interesting parts of my homelab. It is not the most essential thing I run, but it has been one of the more enjoyable areas to experiment with.

Immich, which I forgot to mention in the video

I also need to call out Immich because I accidentally skipped over it in my notes while recording and did not mention it in the video.

Immich is awesome.

I primarily use it for my good photos, mostly post-edit, rather than as a complete dump of every photo I take. That has worked out for me and it makes the library feel more intentional and more useful.

I also have a full tutorial on Immich here:

If you are looking for a self-hosted photo application, Immich is well worth a look.


Documents

I have also become more serious about document handling.

Paperless-ngx is a big part of that. It is the kind of tool that becomes more useful the more real world paperwork you put through it.

On top of that I am also using:

That combination makes the Paperless much more useful than OCR alone. It turns it into something closer to a real document workflow.

I also run Stirling PDF for general PDF editing. it handles splitting, merging, and converting all within a clean web ui. I forgot to mention this in the video, as I did a few others due to the super long bulleted outline I was following.


Visual tools

I am a visual learner, so I keep a few tools around that help me think through systems and explain them clearly, especially on video calls.

Excalidraw is great when I want to explain something quickly without worrying much about precision.

draw.io is better when I want something more structured.

Rackula is useful and fun because it helps me diagram my rack and that saved me from running to the basement to see how things are set up.


Automation

I run n8n, and I think it is a very good tool however I don’t have a need for a low-code solution right now.

I still like to write code for a lot of the automation I want, mostly because that’s a big part of my day job.

I also tried Postiz for scheduling social posts. It is useful, and I can see the value, especially for teams or for people planning content farther ahead than I usually do.

Since I am a small solo creator, I find this a little less useful than I originally thought it would be.


Home Assistant

I am still running Home Assistant, and if you have used it, you know it’s quite the undertaking.

It is powerful, flexible, and worth the effort once you get it working the way you want.

Alongside it I am running:

That gives me a flexible setup for home automation, cameras, and bridging devices into ecosystems they were not originally designed for.

Scrypted especially has been very useful in getting my Protect cameras into HomeKit. It’s great.


Databases

A lot of the services I run need databases, so I end up running several of them.

Mainly:

And because I do not always want to manage those from the terminal, I also keep a few admin tools around:

If working on a postgres DB, I always use pgAdmin. But when it comes to MySQL-like DBs I usually reach for Adminer first because it is lightweight and does what I need without much overhead.

For backup and restores I am using databases. It’s an awesome tool to backup almost any type of DB.


Local AI

It is 2026, so yes, I am also running local AI tools in my homelab.

The main pieces there are:

That gives me a local setup for pulling models, running them, and chatting with them without sending everything elsewhere.

I do not think every AI workflow needs to be local, the models just aren’t good enough, but having a local option has been useful, especially when testing or experimenting.


Kubernetes and platform operations

I am running three Kubernetes clusters and managing them with Rancher.

I mostly treat Rancher as the management layer, not the place where I make configuration changes. The actual workflow is still GitOps driven for me, with:

That stack has been working well. I like defining things in Git, I like updates showing up as pull requests, and I like keeping the running environment close to what the repository says it should be.

There is still plenty of complexity in Kubernetes, but GitOps gives that complexity a structure.

There are also a few Kubernetes applications that did not really make it into the video because it was already too long, but they are important enough to mention here.

Longhorn

I use Longhorn for cloud-native storage in Kubernetes. It is one of the pieces that becomes foundational once you start running more stateful workloads in the cluster.

Reflector

Reflector is useful for reflecting or duplicating secrets across namespaces. That simplifies secret management when the same values need to exist in more than one place.

kube-vip

I use kube-vip for service load balancing and as a control-plane load balancer. It is a small component, but an important one.

Reloader

Reloader will automatically cycle services when secrets or configuration changes. That removes a lot of manual restarts.


A few tools that make life easier

There are also a number of smaller tools that do not always fit neatly into one category but are still useful enough to keep around.

Bambu Studio

One other thing that did not make it into the video is Bambu Studio.

I am actually self-hosting it, which is a little jank inside a container, but I have been testing it out. I keep it around for the times when I need to print something and do not have access to my main machine.

It is not the cleanest setup, but it has been useful enough that I keep it running in my homelab.


The main theme this year

If I had to summarize the software side of my homelab this year, it would be this:

I am trying to make it more intentional.

Less “spin things up because I can.” More “put things where they make sense, monitor them properly, back them up, and make them easy to operate.”

That does not mean the lab is simple now. It definitely is not.

But it does feel more cohesive.

More of the services have a reason to exist. More of the architecture choices feel deliberate. More of the setup feels like something I can actually operate without constantly rebuilding it.

That is probably the biggest difference from previous years.


What is next

The follow-up from here is backups.

How I back things up, where they land, what I replicate, what I do not, and how I think about recovery is probably the next important piece to show.

Running a lot of services is one thing.

Restoring them cleanly when something breaks is another.


Final thoughts

This is what I am running right now, not necessarily what I would recommend every person run.

Some of this is more than most people need. Some of it is experimentation. Some of it is simply what happens when a homelab evolves over time.

But I hope it gives you some useful ideas.

Not just for specific tools, but for how to think about the split between home services, public services, storage, orchestration, monitoring, and the operational details in between.

If there is one self-hosted service you absolutely cannot live without, I would be interested to hear what it is.



Join the conversation


🤝 Support the channel and help keep this site ad-free

🛍️ Check out all merch: https://shop.technotim.com/

This post is licensed under CC BY 4.0 by the author.