Skip to Content

Sign in once, then prove your Home Assistant really joined

the moment it joins
HA Tailscale Guide · Part 2

Sign in once, then prove your Home Assistant really joined

Part 1 left you with the Tailscale app installed and running. Running is not the same as joined — at this point it belongs to nobody's network. This article covers the one sign-in that makes your Home Assistant a member of your private network, the two separate places you check that it worked, and how to read the app's status and log. That last part looks like housekeeping. It is actually the shortest route out of every problem in the rest of this guide.

3 layers
Tell them apart before you click anything
2 networks
Where the acceptance test has to pass
info
The log level the official docs recommend leaving on
Three layers

Three things with almost the same name

Nearly every confusing moment in this guide comes from clicking in the right-looking place on the wrong layer. There are three of them, and they are worth separating now rather than at midnight when something is broken.

  • A tailnet is your private Tailscale network — the whole thing, as a unit.
  • A machine is one device that has joined that tailnet.
  • The Home Assistant app is the Tailscale service managed by Supervisor. You open and configure it from the Apps page inside Home Assistant.
In plain terms

Think of a members-only building. The tailnet is the membership list. A machine is one key card that has been issued against that list. The app is the lock you fitted to your own front door so a card can be recognized there. When something does not work, you are always asking one question: is the problem the list, the card, or the lock?

Each layer is checked in a different place, and each has its own idea of what “working” means.

LayerWhat it handlesHow you verify it in this article
Tailscale admin consoleAccounts, Machines, routes and policyHome Assistant appears in Machines
HA Tailscale appRuns Tailscale on the Home Assistant hostStatus healthy, no blocking errors in the log
Home AssistantLogin, dashboard and admin rightsYou still log in normally with a personal account
flowchart TD
  A["Tailscale admin console
accounts, Machines, routes, policy"] --> B["Your tailnet
the private network itself"] B --> C["Machine: this Home Assistant"] B --> D["Machine: your phone"] B --> E["Machine: your laptop"] C --> F["HA Tailscale app
runs Tailscale on the HA host"] F --> G["Home Assistant itself
separate personal accounts"]
Where each layer sitsThe admin console governs the tailnet. The tailnet holds machines. One of those machines is the app running on your Home Assistant host — and behind it, Home Assistant keeps its own separate logins.

Notice the last arrow. Joining the tailnet changes how a request reaches Home Assistant. It does not change who is allowed to log in once it arrives. Those stay two different questions, answered by two different systems, and Part 1's rule still holds: nothing here puts Home Assistant directly on the public internet.

The sign-in

Authorize once, on a machine you trust

The official app documentation opens with the same move every time: open the Tailscale app's Web UI, sign in, authorize the device, then go back to the app's log to confirm the result. Do this in a browser on a desktop or laptop you trust. Not a shared computer, not a machine in an office you are visiting.

Complete the Web UI sign-in — logging in and authorizing the device — only on a personal device you trust. This is a restriction, not a preference. A borrowed laptop, a family shared computer or a kiosk browser can hold the session, the login URL or the saved credential long after you have walked away, and whoever picks it up next inherits the ability to authorize a device onto your tailnet.
  1. Step 1

    Write down what it looks like right now

    In the Home Assistant left-hand menu, go to Settings → Apps and find Tailscale. If your screen still uses the older name, that entry may read Add-ons instead — the names moved, the page did not. Note whether it is running. Change nothing else while you are in there, especially not advanced options you are not using yet.

  2. Step 2

    Open the app's Web UI

    The app page has four things worth knowing by name: Info, Configuration, Log and Web UI. This step is the Web UI. It opens the Tailscale interface belonging to this app, which is where the join actually happens.

  3. Step 3

    Sign in with the right account

    You will land on a Tailscale sign-in page — an email box and a Sign in button, or one of several third-party sign-in options. Use the account that owns the tailnet this device is meant to join. Signing in with a different identity does not fail loudly; it quietly puts the device somewhere else.

  4. Step 4

    Authorize the device

    Complete the authorization the page asks for. This is the moment the Home Assistant host stops being a program that has Tailscale installed and starts being a machine on your tailnet.

  5. Step 5

    Go back to the app's Log tab

    Do not close the browser and assume. Return to the app page in Home Assistant and open Log. The app writes the outcome of the join there, which makes it the first evidence you have that step 4 worked rather than looked like it worked.

The login URL is a credential. Do not paste it into a public chat room, a forum post, an issue tracker or a screenshot. Nor auth keys, your tailnet domain, full IP addresses, device serial numbers, or raw logs. Anyone who reaches that link is holding the thing that authorizes a device.
The Tailscale sign-in page in a browser. The tailscale wordmark sits centered at the top. Below it an input box labeled Enter your email, partly covered by an annotation, and under that a dark Sign in button. An OR divider separates those from five stacked buttons: Sign in with Google, Sign in with Microsoft, Sign in with GitHub, Sign in with Apple, and Sign in with a passkey, each with its provider icon. Beneath them a line reads First time? Learn more at tailscale.com. At the bottom, small print says that by clicking the buttons above you acknowledge you have read and agree to Tailscale's Terms of Service and Privacy Policy. A red circled number 1 and a Chinese annotation box overlap the email field.
The sign-in pageWhat step 3 looks like. This is the Tailscale account page, reached from the app's Web UI.The red marker and the box beside it are the source author's annotation, not part of the page
  • Enter your email and the dark Sign in button are the top path. This signs you into Tailscale. It is not your Home Assistant login and it is not a second Home Assistant user — a point worth being certain of before you type anything.
  • The five buttons under the OR divider — Google, Microsoft, GitHub, Apple and a passkey — are identity providers. Whichever one you pick becomes the account that owns this device's membership. Pick the one that already owns your tailnet, not whichever is one click away.
  • First time? Learn more at tailscale.com sits just below them. If you genuinely are on a first tailnet, this page is also the point where one gets created — so it matters even more that you are signed in as the identity you intend to keep.
  • The Terms of Service and Privacy Policy links at the bottom apply to every button above, including the third-party ones.
  • The red 1 is the source author's marker, and the Chinese note beside it points forward to the Machines list as the next stop. Worth saying plainly: this page does not show a Machines list. It is the sign-in, and nothing more. The Machines check comes next, in a different place.
Proving it joined

Two separate places have to agree

A sign-in page that redirects without complaining is not proof of anything. Two places can confirm the join independently, and they are worth checking in this order.

In plain terms

Authorize once, verify twice. It is the difference between a courier app saying “delivered” and you walking to the porch to look at the box. The app is usually right. The reason you still walk out there is that when it is wrong, it is wrong quietly.

First, inside Home Assistant. The Tailscale app has its own page showing what this device now is on the network — its device details. That is the local view: the host telling you what it believes about itself.

The Tailscale app page inside Home Assistant. Down the left is the Home Assistant sidebar: Overview, a map entry, a system health entry, Energy, Activity, History, File editor, HA-MCP, Media, Pi Agent, and Tailscale, which is highlighted in blue as the current page, with Settings showing a badge of 3, Notifications showing 1, and the admin user at the bottom. The main panel opens with the tailscale logo beside a gray box in place of the tailnet name, and a Viewing dropdown at the top right. Under a Device details heading, two large gray boxes stand where the machine identifier, IP addresses and tailnet domain would be. Below them a DEBUG section shows one row, TUN Mode, with the value No. The last line reads: Want even more details? Visit this device's page in the admin console. A red circled number 1 and a Chinese annotation box sit over the heading area.
Device details, seen from inside Home AssistantThe Tailscale entry in the sidebar is selected. Everything that would identify this tailnet or this machine has been covered over before publication.Gray boxes are redactions, not empty fields on a working install
  • Tailscale in the sidebar is highlighted blue — you are still inside Home Assistant, on the app's own page. This is not the Tailscale admin console, and nothing on this screen governs the tailnet.
  • The gray boxes stand where the tailnet name, the machine identifier, the IP addresses and the tailnet domain appear. They were covered before this screenshot was published. On your own install those fields carry real values — and those values are exactly the ones the warning above tells you not to publish.
  • Device details is the heading that matters. If this section is populated on your screen, the host believes it is a machine on a tailnet. That is the first of your two confirmations.
  • DEBUG → TUN Mode: No is a single row near the bottom. You do not need to act on it. Note the value down, because it describes how this app is running on your host and it is the sort of detail a support channel asks for first.
  • Want even more details? Visit this device's page in the admin console is the last line, and it is the doorway to the second check. The link crosses from the local view to the authoritative one.

Second, in the Tailscale admin console. Open the Machines page and find the entry that corresponds to this Home Assistant. Confirm the machine, its last-seen status and its feature badges.

No screenshot of the admin console appears anywhere in this guide. That is deliberate: those pages carry account names, device names and addresses that cannot be usefully redacted. Follow the description, not a picture — and never copy a name or an address out of somebody else's screenshot as if it were your own value.
flowchart TD
  A["Signed in and authorized
from the app's Web UI"] --> B["Check 1 · Inside Home Assistant
Device details is populated"] B -->|"populated"| C["Check 2 · Admin console
Machines lists this device"] B -->|"empty or errored"| D["Read the app Log
the join did not complete"] C -->|"listed, seen recently"| E["Joined. Move on to the test"] C -->|"not listed"| D D --> F["Return to the Web UI
and complete the sign-in"] F --> A
The verification loopTwo checks, and one recovery path. Notice where the recovery path goes: back to the Web UI and the log, not to uninstalling and installing again.

While you are in the Machines list, spend thirty seconds on it as an inventory rather than a checklist. Is the account you signed in with the right one? Is Home Assistant still managed with its own separate personal accounts? Are there devices in the list you no longer recognize, or ones that were retired and never removed? Least privilege is the principle underneath all of it: 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.

Status and logs

Logs are evidence, not decoration

This is the part people skip, and then spend an evening guessing. Learn to read the app's status and log before you change any network option, because from Part 3 onward every change you make is one you will want to be able to check.

The order is always the same. Is the app running? Then read the last few lines of its log. Two questions, in that order, and they tell you which of the three layers to go and look at.

flowchart TD
  A["Remote access is not working"] --> B{"Is the app running?"}
  B -->|"no"| C["Start it, then read the log
from the beginning"] B -->|"yes"| D["Read the last few lines of the log"] D --> E{"Does it show a
blocking error?"} E -->|"yes"| F["Fix at the app layer
then re-check Device details"] E -->|"no"| G{"Does the admin console
list this machine?"} G -->|"no"| H["The join is incomplete
go back to the Web UI"] G -->|"yes"| I["Check the client device
is on the same tailnet"]
The order to check things inEvery branch ends by naming one layer. That is the whole point of separating them in section 01 — this chart is unusable if the three are still blurred together in your head.

Leave the log level alone

Keep log_level at info. The official documentation lists it as the recommended level, and it is the level all of the advice above assumes. Raise the verbosity only while you are actively troubleshooting one specific thing, and turn it back down when you are finished.

In plain terms

A log level is a volume knob. At info you hear the announcements. Turn it up and you hear every conversation in the room at once, which is useful for about ten minutes while you are listening for one particular voice, and useless the rest of the time. It also fills the log with far more detail about your network than you would want to hand to anyone.

Why there are no example logs here

You may have noticed this guide never prints a sample log, and that is not an oversight. Real logs from a working install contain accounts, device names, your tailnet domain, private IP addresses and sometimes login URLs. A fabricated one would be worse than useless, because you would compare your real output against invented lines.

So do it the other way round. Read the startup and connection messages on your own app's Log page, and when you need help, ask your support channel with a redacted excerpt — the few lines around the problem, with identifiers removed.

Before you paste anything: reread the excerpt looking specifically for a tailnet domain, an IP address, an account name and a URL with a token in it. Those four cover almost everything that gets leaked into forum posts by accident.
The two-network test

The test only counts on the second network

Testing remote access while sitting on your home Wi-Fi proves nothing at all — everything works there anyway. The acceptance test has two halves, and the second one is the real one.

  1. Half 1

    On the home network

    Open Home Assistant on your local network and confirm that the existing accounts and the dashboard were not affected by anything in this article. This half is not testing Tailscale. It is testing that you did not break what already worked.

  2. Half 2

    On a different network

    Switch your test phone to mobile data, or to another network you trust. Confirm Tailscale is connected on that phone, then open Home Assistant once. That single successful page load is what you are actually buying with all of this.

    One limit on that test, and it applies from here to the end of the guide: test only targets you are authorized to manage. Opening your own Home Assistant is the whole test. Probing other addresses, other people's devices or anything on a network you do not own is not troubleshooting — it is scanning somebody else's property, and no part of this guide asks you to do it.

  3. Then

    Record the result

    Write down success or failure, which device you used, and the time. Six weeks from now, “it used to work” is worth nothing and “it worked from the managed laptop on mobile data on the 19th” is worth a great deal.

  4. And stop

    Stop at the security boundary

    Exit nodes, DNS override and public Funnel setup are outside this guide. Leave them disabled unless you have a specific need and have read the official documentation for them separately.

The same restraint applies to everything else you might be tempted to switch on while you are in there. Start with the smallest setup that works, then expand one step at a time. If all you want is to see your dashboard while you are away from home, private access over the tailnet is usually easier to control than a public entry point. If you need to reach a LAN subnet, list one subnet with a clear purpose first, and do not advertise every network at once.

What you wantWhere to startNot yet
View Home Assistant remotelyPrivate access from a device signed in to the tailnetOpen ports and unnecessary public sharing
Manage your devicesThe Machines list, with personal accountsA shared admin login
Reach your home LANA single approved subnet route, with a clear purposeAdvertising several subnets before taking inventory

The third row is Part 5's whole subject, and it is listed here mainly so you can see what “not yet” looks like from where you are standing.

The record you leave

Five lines that make this handover-safe

The biggest risk with network settings is not a bad setting. It is a good setting that worked at the time and that nobody can explain a year later. When you finish this article, write down five things: the date, who did it, the purpose, the state before and after, and the device you verified with. Your password manager or your site maintenance notes are the right home for that.

Here is what one looks like written out, taken from the source guide:

“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.”

One sentence. It names a date, a person, a claim and the evidence for the claim. Later, once you reach subnet routing, you would add a line such as “only a single approved LAN CIDR is advertised, approved in the admin console” — describing the decision without writing the range itself into the note.

That last distinction is the one to get right, because the record is not a place to store secrets.

Record thisKeep out of public docsWho needs it next
Purpose of the change, date, verification resultCredentials, auth keys, login URLsThe Home Assistant maintainer
Each machine's purpose and its owner's roleThe full tailnet domain and private IP addressesThe Tailscale admin
Which subnet, with a clear purpose, was approvedUnredacted CIDRs, scan results, street addressesThe network maintainer

Passwords, auth keys and full private subnets belong in a controlled secrets manager. Never in a public repository, and never alongside customer names or street addresses. What stays in the notes is only the description the next maintainer needs in order to understand the decision — which is what lets somebody judge which layer to roll back when a phone is lost, a router is replaced, the app is updated, or admin rights are handed to someone else.

The minimal-change principle: change one thing at a time, test from another network when you are done, then write down the result. That preserves your ability to reverse a change far better than flipping routes, policy, DNS and public sharing all in one evening and hoping.
If it does not work

The things that actually go wrong here

I cannot find Apps in the Settings menu
Confirm whether your Home Assistant install is managed by Supervisor. Container and Core installs cannot follow the app path this guide uses — the page you are looking for does not exist on them. That is a different shape of installation, not a fault.
Home Assistant is not showing up in Machines
Go back to the app's Web UI and complete the sign-in, then read the app log. Resist the urge to uninstall and reinstall repeatedly — a join that did not finish is not repaired by reinstalling, and each attempt loses you the log that would have explained it.
Machines shows Home Assistant, but Home Assistant will not open
Two checks, in order. First, confirm the client device is signed in to the same tailnet — not just that it has Tailscale installed and running. Second, check the Home Assistant login account and the address you are opening. This is the classic case of the network layer being fine and the application layer being the problem.
The route seems to exist but the LAN is unreachable
This one belongs to Part 5, but it is worth knowing the answer now, because the symptom is misleading: the route looks like it is there and nothing reaches it. Confirm the route has been approved in route settings on the Machines page — advertising a route from the app is only half of it, and an unapproved route sits waiting rather than failing. Then test with the correct CIDR, against a target you are authorized to reach. Both halves matter: the wrong range tests nothing, and a target you do not own is not yours to probe.
My screen says Add-on, not App
The Home Assistant interface and its translations vary by version. Recognize the shape rather than the word: the Tailscale entry, and its Info, Configuration, Log and Web UI pages. When a name on your screen differs from a name in a guide, go by your screen and the official documentation.
Does Tailscale replace the Home Assistant login?
No, and this matters. Tailscale manages the network path — whether a request can reach your Home Assistant at all. Home Assistant still needs its own personal accounts, strong passwords and appropriate admin rights. Removing one because you have the other leaves you with a private network that anybody on it can log into.
Do I need to open a port on my router?
The private tailnet flow in this guide does not require public port forwarding for Home Assistant. Assess that against your own network and security policy rather than taking it as a universal statement.
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 later a single subnet route, before you plan anything else — and plan it from the official documentation rather than from here.
Things got uncertain after I changed several settings
Return to the last known-good state. Keep the logs and the change record from before you started. Then change one thing at a time, testing after each. It feels slower and it is reliably faster.
Where the facts here come from: the Home Assistant Community App: Tailscale docs and Tailscale Docs are the two authoritative sources for this guide. They are named rather than waved at, because “the official docs” gives you nothing to look up. Interface wording changes with app and admin console versions — when a name differs, believe your screen and the official docs before you believe any guide.

The four pages worth knowing by name

Of everything on those two sites, the source guide points at four pages specifically. The first one covers this article. The other three cover ground you reach in Parts 4 and 5 — they are listed here so you know the documentation exists before you need it, not so you go and switch things on tonight.

App options, Web UI, share_homeassistant, advertise_routes and userspace networking — the app's own documentation. Those two option names are worth recognizing now: they live in the app's Configuration tab, not anywhere in the Tailscale console, which is why people search the wrong site for them.
Tailscale: Access controls, grants and ACL — the reference behind least privilege, in Part 4.
Tailscale: Serve and private tailnet services — how to publish a service that stays inside the tailnet.
A map, not a to-do list. Leave all three of those advanced areas alone for now. advertise_routes in particular does nothing on its own — a route that is advertised and not approved simply sits there — and a route approved without an inventory of what lives on that subnet opens a wider door than you meant to.
Next

Where to go from here

keep going

Your Home Assistant is on the tailnet. Now use it from somewhere else.

Part 3 covers opening Home Assistant properly from a phone or laptop away from home, and then what the Machines list is really for — naming devices, reading last-seen status, and revoking a device when it leaves your hands.

Open the full guide

Part 2 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

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