Skip to Content

A way back into Home Assistant that does not open your router

before you start
HA Tailscale Guide · Part 1

A way back into Home Assistant that does not open your router

You want to see your dashboard while you are out. The usual advice is to forward a port, which puts your Home Assistant login on the public internet as the only thing between a stranger and your house. There is a quieter way: put your phone and your Home Assistant machine on the same private network, so the door is never in public at all. This article covers what that private network is, the four things to write down before you touch anything, and how to install the Tailscale app and stop at exactly the right moment.

4 items
To take inventory of before you install
3 layers
That people mix up, and where each one breaks
0 ports
This flow does not require port forwarding for HA
Why not just open a port

Two ways in, and only one of them is private

Home Assistant is already reachable from your sofa. The problem is only ever the journey from somewhere else — a train, an office, a hotel. There are two shapes of answer to that.

In plain terms

Port forwarding is like taking the lock off your front door and trusting the deadbolt on the study. It works right up until somebody walks down your street trying doors. Tailscale is more like handing a key to the few people you actually want in the house — the door itself never appears in public, so nobody gets to try it.

Tailscale groups the devices that join the same tailnet into one private network. Your phone joins it, your Home Assistant machine joins it, and from then on they reach each other as if they were both on your home wiring — whatever network the phone is actually sitting on. It does not require you to open a router port for Home Assistant to the internet.

flowchart LR
  A["Your phone, away from home"] --> B{"How does it get in?"}
  B -->|"port forwarding"| C["A port opened on your router"]
  C --> D["Reachable from the whole
public internet"] D --> F["The Home Assistant login
is the only thing left"] B -->|"tailnet"| G["Phone signed in to the same tailnet"] G --> H["Private path to the
Home Assistant machine"] H --> F
The same destination, two very different journeysBoth routes end at your Home Assistant login. Only one of them lets the rest of the internet reach that login too.
The rule this whole guide is built on: keep access private first, and never expose Home Assistant directly to the internet. Each change should be verifiable and reversible before you make the next one.

Notice that your Home Assistant login sits on both paths. Tailscale manages the network path; it does not replace accounts, passwords, MFA or admin rights inside Home Assistant. Treating it as though it does is how people end up less safe than they started.

Two doors, and this series only fits the first one. Split “open Home Assistant from outside” into two separate doors. First your devices join the tailnet. Then Home Assistant’s own accounts and MFA govern admin rights — multi-factor authentication on the Home Assistant login is the second door, and nothing you do in Tailscale sets it, checks it or makes up for its absence. Do not treat Tailscale as a replacement for Home Assistant account management.
The three layers

Three things called “Tailscale,” and why it matters

Almost every confusing hour in this subject comes from clicking in the wrong place. Three separate things share the name, and each one fails differently.

In plain terms

Think of an office building. The admin console is the security desk that decides whose pass works. The Tailscale app on your Home Assistant machine is the pass reader on that one door. Home Assistant's own login is the lock on your desk drawer. Getting through the lobby says nothing about the drawer, and a pass that will not open the lobby is not a drawer problem.

LayerWhat it handlesHow you verify it
Tailscale admin console Accounts, the Machines list, routes and policy Home Assistant appears in Machines
HA Tailscale app Runs Tailscale on the Home Assistant host Status healthy, no blocking errors in the log
Home Assistant Login, dashboard and admin rights You log in normally with a personal account

Two more words, because the rest of the series leans on them. A tailnet is your private Tailscale network. A machine is one device that has joined it — your phone is a machine, your laptop is a machine, and after Part 2 your Home Assistant will be one too.

The payoff is that troubleshooting stops being guesswork. Two questions narrow a failure to a single layer:

flowchart TD
  A["You cannot reach Home Assistant"] --> B{"Is Home Assistant listed
in the Machines page?"} B -->|"no"| C["Layer 2: the HA Tailscale app.
Finish the Web UI login,
then read the app log"] B -->|"yes"| D{"Is the phone or laptop signed in
to that same tailnet?"} D -->|"no"| E["Sign that device in to the
same tailnet first"] D -->|"yes"| F["Layer 3: Home Assistant itself.
Check the HA login account
and the URL you are using"]
Two questions, three answersThe source chapters give their troubleshooting as a flat list, in the order: no Apps page, then Home Assistant missing from Machines, then the client not signed in, then an unapproved route, then an uncertain state after several changes. The tree above is our arrangement of the middle of that list, not the source’s own shape. Note what neither version contains: reinstalling the app. That fixes almost none of these.
Four things to write down

Take inventory before you install anything

Four items, written somewhere you will find them again.

Does your Home Assistant have Apps?

This guide is for installs managed by Supervisor, which show an Apps page in Home Assistant. Older interfaces call the same page Add-ons. If you run Home Assistant Container or Core there is no Apps page at all, and the click path in this series does not apply to you.

What is your home LAN range?

Find the address range your router hands out, written as a CIDR — a placeholder example would be 192.168.1.0/24. You do not need it today; you need it in Part 5, and looking it up calmly now beats guessing at it later.

Which phones and laptops should join?

List them by name and owner. A device you add is a device someone can reach the house from, so keep the list short and be able to say why each one is on it.

Who has Tailscale admin rights?

Managing the tailnet — approving devices, approving routes, editing policy — is a separate power from being able to open the dashboard. Decide who holds it before anyone needs it, and keep that list shorter still.

Those last two are least privilege in practice: only the people who need to reach Home Assistant get a path to it, and only the people who need to manage the tailnet get admin console access. It is easier to grant a right later than to work out who quietly has one already.

While you are looking, decide how far you actually want to go. Start with the smallest workable setup, then expand step by step. If all you want is to see your dashboard while away from home, private access over the tailnet is usually easier to control than a public entry point — usually, not always, and it is still your own network and security policy that decides. If you need to reach a LAN subnet, list one subnet with a clear purpose first, and do not advertise every network at once. Starting small is what keeps each step testable.

What you needWhere to startNot yet
View Home Assistant remotely Private access from a device signed in to the tailnet Open ports and unnecessary public sharing
Manage devices The Machines list and personal accounts A shared admin login
Reach your home LAN A single approved subnet route Advertising several subnets without taking inventory
Record the current state before you change any of it: open Settings → Apps and look for Tailscale — if your screen uses the old name, it may say Add-ons. Note whether it is running, and for now do not change any advanced options you are not using. Both halves of that matter: the note is what you compare against when something breaks, and an advanced option you switched on “to see what it did” is the hardest kind of fault to find. If the app is already there and already running, someone set it up before you — find out who and why before you touch it.
Installing the app

Install, start, and then deliberately stop

Four short steps. The discipline is in the fourth: stop before logging in. That belongs to Part 2, on a device you have thought about.

  1. Step 1

    Confirm you have Apps, then search

    Go to Settings → Apps, open the store and search for Tailscale. If there is no Apps entry in Settings, stop here: this is not a Supervisor-managed environment, and the app cannot be installed the way this chapter describes.

  2. Step 2

    Open the official app and read before installing

    Open the Tailscale entry and read two things on that page before you click anything: the current version, and the permissions it asks for. Then choose Install.

  3. Step 3

    Press Start, and change nothing else

    When the install finishes, press Start. Do not enable options you are not using yet. You will meet settings like share_homeassistant, advertise_routes and userspace networking later in this series, and each one gets its own chapter for a reason.

  4. Step 4

    Check the three tabs, then stop

    Go back to the app and look at Info, Configuration and Log. All you are confirming is that it starts and does not fail right away. Logging in and verifying the machine are Part 2's job.

Do not paste YAML from web tutorials into the Configuration tab. Blocks copied out of a blog post carry that author's network, not yours, and a wrong option fails in ways that look like a Tailscale problem rather than a typing problem. The Home Assistant Community App: Tailscale docs list the available options and the default behavior; go by those.
flowchart TD
  A["Settings, then Apps"] --> B{"Is there an Apps page?"}
  B -->|"no"| C["Container or Core install.
This click path does not apply"] B -->|"yes"| D["Search the store for Tailscale"] D --> E["Read the current version
and the permissions"] E --> F["Install"] F --> G["Start"] G --> H["Check Info, Configuration and Log"] H --> I["Stop. Login and machine
verification are Part 2"]
Where Part 1 endsEverything above the last box happens on your own hardware and changes nothing outside it. The step after it joins a device to a network, which is why it gets its own article.
The sign-in that comes next is not a formality. Complete the Web UI sign-in (log in and authorize the device) only on a personal device you trust. That one click authorizes a device onto your private network, and a borrowed laptop, a shared family tablet or a machine you do not control is not something you can quietly un-trust afterwards — it stays a way in until an admin removes it from the Machines list. This is a restriction, not a preference. Part 2 does that step properly, which is exactly why this article stops before it.

It is worth reading now what Part 2 will ask you to confirm, because it tells you what “installed correctly” is going to look like. Open the Machines page in the Tailscale admin console and confirm the machine that corresponds to Home Assistant, its last-seen status and its feature badges. Three things, not one.

What to look atWhat it tells youIf it is not right
The machine that corresponds to Home Assistant The app finished its login and the host actually joined the tailnet Go back to the app’s Web UI and complete the login
Its last-seen status Whether that machine is in touch with the tailnet now, or last was at some point in the past Read the app log rather than reinstalling
Its feature badges What that machine has been marked as doing, beyond simply being present Do not switch a feature on to find out what its badge means
Make a restore point first. Take a Home Assistant backup before you install, or at the very least write down the settings as they are now. That is the difference between undoing a change and reconstructing one from memory.
Where this guide stops

The things left out on purpose

Tailscale can do more than this series asks of it. Three features are left switched off on purpose, and it is worth knowing their names so you recognize them when a forum post suggests one.

  • Exit nodes — routing all of a device's internet traffic through another machine. Useful, and a much bigger change than it sounds.
  • DNS override — letting the tailnet decide how names resolve on your devices. When it goes wrong it goes wrong everywhere at once.
  • Funnel — publishing a service to the public internet. That is the opposite of what this guide is for.

Leave all three disabled unless you have a specific need, and plan them separately from the Tailscale Docs, which are named with their address at the end of this article. Later in this series you will meet Serve, which sounds like Funnel and is not: Serve stays inside your tailnet, Funnel faces the open internet.

Never publish these, anywhere. Login URLs, auth keys, your tailnet domain, full IP addresses, device serial numbers and raw logs. Not in a forum post, not in a group chat, not in a screenshot. Redact them before you ask for help — and note that the screenshots you will see later in this series have exactly these fields blanked out for the same reason.

The same caution applies in reverse, and it is a different mistake from the one above. That one was about publishing your values. This one is about borrowing someone else’s: do not copy the names or IPs in the screenshots as your own values. A device name or an address in a screenshot — in this series or any other guide — is the author’s network being illustrated, not a setting for you to type in.

The security check

Three things to check before you call a chapter done

This check belongs at the end of this chapter and at the end of every chapter after it. It is three questions, it takes a minute, and it catches the mistakes that are cheap now and expensive in a year.

  • The account signed in to Tailscale is the right one. Not a colleague’s, not an old personal account you were logged into in the browser already, not a shared one. Whoever that account belongs to now owns this tailnet.
  • Home Assistant is still managed with separate personal accounts. One account per person, with their own password and their own MFA, and admin rights only for the people who need them. Joining a tailnet changes nothing about this and is not a reason to relax it.
  • The Machines list has no unknown or retired devices. This is the one people skip, and it is the one that quietly accumulates.
In plain terms

A machine on the tailnet is a key that was cut, not a guest who has left. The phone you sold last spring, the laptop that went back to the office, the tablet you joined once to test something — unless somebody took them off the list, all of those keys still turn. When a device leaves your hands, revoke it, the same day, before you forget which one it was.

Least privilege is what makes that list short enough to read. Only the people who need to reach Home Assistant get a path to it, and only the people who need to manage the tailnet get admin console access. A list of four machines you can account for is a security control. A list of nineteen you cannot is a to-do you will keep postponing.

Testing and recording it

Test on two networks, then write it down

A change to network settings is only finished when you have proved it from somewhere other than your sofa. Two tests, in this order.

First on your home network: open Home Assistant on the local LAN and confirm the accounts and dashboard you already had were not affected by anything you just did. Then from a different network: switch a test phone to mobile data or another secure network, confirm Tailscale is connected, and open Home Assistant once. Test only targets you are authorized to reach.

flowchart LR
  A["Change one thing"] --> B["Test on the home LAN:
nothing else broke"] B --> C["Test from mobile data or
another secure network"] C --> D["Write down the date, the purpose,
the result and the device used"] D --> A
The minimal-change loopOne change, two tests, one line of notes, then the next change. Flipping routes, policy, DNS and public sharing together saves an hour and costs a weekend.
In plain terms

The record you keep is the label on the fuse box. Nobody writes it for fun. You write it so that the person standing there in eight months — quite possibly you — knows which switch feeds the garage instead of flipping all of them to find out.

The biggest risk with network settings is not that they are wrong. It is that they were right at the time and nobody remembers why. So when you finish a chapter, note the date, who did it, the purpose, the state before and after, and the device you verified with, in your password manager or your maintenance notes. Something this ordinary is enough:

2026-08-19, the administrator confirmed the Home Assistant machine is still in the designated tailnet; private access tested successfully from a managed laptop on a non-home network.

That note holds no secret and still tells the next person what they need. Secrets belong in a controlled secrets manager, never in the notes.

If the change involved a subnet router, add one clause to that sentence: only a single approved LAN CIDR is advertised, approved in the admin console. It is short, and it records the two things nobody can reconstruct later by looking at the router — that you deliberately advertised one range rather than several, and where the approval that made it live actually lives. Write the clause, not the CIDR itself, and never write street addresses, customer names, the full Tailscale domain or device identifiers into a public repo.

Record thisKeep out of public docsWho needs it next
Purpose of the change, date, verification result Credentials, auth keys, login URLs HA maintainer
Each machine's purpose and its owner's role The full tailnet domain and private IPs Tailscale admin
Which subnet with a clear purpose was approved Unredacted CIDRs, scan results, street addresses Network maintainer

That is what lets you judge which layer to roll back when a phone is lost, a router is replaced, the app is updated, or admin rights change hands.

If something is off

The questions people actually ask first

There is no Apps entry in Settings
Confirm whether your Home Assistant install is managed by Supervisor. Container and Core installs cannot follow the app path in this guide — there is no store to install into. Nothing is broken; it is a different shape of installation.
My screen says Add-on, not App
The Home Assistant interface and its translations vary by version. Recognize the pieces rather than the label: the Tailscale entry, and its Info, Configuration, Log and Web UI. When a name on your screen differs from one here, go by your screen and the two documents named at the end of this section.
Do I need to open a router port?
The private tailnet flow in this guide does not require you to set up public port forwarding for Home Assistant. Assess that against your own network and security policy, but the steps here never ask for a forwarded port.
Does Tailscale replace the Home Assistant login?
No. Tailscale manages the network path. Home Assistant should still use personal accounts, strong passwords and appropriate admin rights. Two doors, and this series only fits the first one.
Home Assistant is not showing up in Machines
Go back to the app's Web UI and complete the login, then read the app log. Reinstalling repeatedly is the common reflex here and it almost never helps — the log usually says what is wrong on the first read.
Can I set up an exit node or DNS override while I am here?
This guide deliberately leaves those out. Finish verifying private Home Assistant access and, if you need it, a single subnet route. Then plan the advanced pieces separately from the Tailscale Docs, as their own change with their own test.
The route seems to exist but the LAN is unreachable
Confirm the route has been approved in route settings on the Machines page. A machine can advertise a route all day; until an admin approves it there, nothing crosses. That pending state is a safety checkpoint, not an error — it is what stops a single app option from quietly exposing a whole home network. Once it is approved, test with the correct CIDR against a target you are authorized to reach. This belongs to Part 5, but people meet it early, usually after a forum post told them to switch on advertise_routes.
I changed several things and now I am not sure what state it is in
Go back to the last known-good state, keep the logs and the change record, then change one thing at a time. This is unglamorous and it is faster than every alternative.

Two documents settle arguments in this series, and it is worth having both bookmarked before you need them. This guide treats them as authoritative:

Home Assistant Community App: Tailscale docshttps://github.com/hassio-addons/app-tailscale/blob/main/tailscale/DOCS.md
Tailscale Docshttps://tailscale.com/docs/

The first covers the app itself — its options, its Web UI, and settings such as share_homeassistant and advertise_routes. The second covers Tailscale as a service: subnet routers and route approval, access controls, and Serve. Interface text changes with the app and the admin console version, so when a name on your screen differs from a name here, go by your screen and those two documents, in that order.

Next

Where to go from here

keep going

The app is installed and started. Nothing has joined anything yet.

Part 2 does the step this article stopped short of: signing in from the app's Web UI on a device you trust, watching Home Assistant appear as a machine on your tailnet, and learning to read the status and the log so the next problem takes five minutes.

Open the full guide

Part 1 of the Home Assistant Tailscale Remote Access Guide series on the Apporo blog.

Adapted from the Home Assistant Tailscale Remote Access Guide, produced by WoowTech and released under CC BY 4.0. This adaptation is published by Apporo under the same licence.

Light · Air · Water · Control · apporo

The habits that keep private access working, and the checklist for when it stops