Guide · Metabase

How to show a Metabase dashboard on a TV without a login screen

Metabase dashboards look great on a wall, until the session expires and the TV shows a login form. Here are the ways that work to show a dashboard on a screen with no login at all, from a two-click public link to a signed embed with locked filters, how to keep one private, the URL options for refresh and dark mode, and how to keep the screen alive afterwards.

Updated 2026-09-0810 minute readApplies to Metabase 50 and newer, checked against Metabase 63; open source, Pro and Enterprise

Why a Metabase wallboard ends up on the login page

Your laptop stays signed in because Metabase keeps a session cookie for you. By default that session lasts 14 days, and a screen has nobody to sign in again when it ends. Fullscreen mode and auto-refresh change what the dashboard looks like, not who is allowed to see it.

The fix is a URL that shows the dashboard without a person's session. Metabase offers two: a public link and a signed static embed. Both are view-only, both are free, and both can be made private again with basic auth on your own reverse proxy.

Before you start

  • Admin access to Metabase; only admins can create public links and embeds.
  • A dashboard you are happy to show on a wall (make a copy if it needs tidying).
  • For method 3: a reverse proxy such as Caddy or nginx in front of a self-hosted Metabase.
  • A supported Raspberry Pi and a free DisplayOps account for the last part.

When you are done

  • A URL that opens the dashboard with no login, dark, refreshing every minute.
  • Filters pinned to the values the wall should show.
  • Optionally a password on the URL that only your screens know.
  • A screen that reloads, recovers and reports back by itself.

Choose a method

MethodWorks onWho sets it upLogin promptsBest forCaveat
Public linkEvery edition, Metabase Cloud and self-hostedA Metabase adminNeverMost wallboards. Two clicks, no server work.Anyone with the link sees the data. View-only, no drill-through, filter values visible in the URL.
Signed static embedEvery edition (Pro and Enterprise remove the "Powered by Metabase" banner). Still supported; guest embeds are its successor for apps.A Metabase admin, plus a script to sign the tokenNeverLocked filters, one token per screen, nothing listed under public sharing.The token is a secret inside the URL and needs a script to create it.
Either one behind basic authSelf-hosted Metabase behind your own reverse proxyWhoever runs the proxyNever; DisplayOps answers the promptDashboards that must not be visible to anyone who finds the link.Needs a reverse proxy you control; not possible on Metabase Cloud.
Log in on the screenAnyNobodyAfter 14 days, and after every browser restart without Remember meA laptop.A DisplayOps screen has no keyboard, and the session ends anyway.

Rule of thumb: start with a public link. Move to a static embed when filters must be locked or when the admin's list of public links should stay empty. Add basic auth when the data must not be one leaked URL away.

Method 1Share the dashboard with a public link

A public link is a read-only URL that runs the dashboard's saved questions for anyone who has it, no login, on every edition including Metabase Cloud. Public sharing is on by default; an admin can turn it off, and can see every active link in one place.

  1. Check that public sharing is enabled

    Open Grid iconAdminSettingsPublic sharing and make sure the toggle is on. The same page lists every dashboard, question and document that has a public link, with an × to revoke each one.

  2. Tidy a copy for the wall

    Duplicate the dashboard and remove cards nobody reads from across a room. In the menu at the top right choose Full width so the layout uses the whole TV instead of a centred column.

  3. Create the link

    On the dashboard click Share at the top right (older versions show a sharing arrow icon instead), then Create a public link. Copy the URL. It looks like this:

    https://metabase.example.com/public/dashboard/4a3b2c1d-…

    Open it in a private browser window: the dashboard renders with no login and no Metabase navigation.

  4. Pin the filters and set the look

    Filter values go in the query string, hash options after the #. A wall URL that shows the west region, hides the filter widget, refreshes every minute and uses the dark theme:

    https://metabase.example.com/public/dashboard/4a3b2c1d-…?region=west#hide_parameters=region&refresh=60&theme=night&titled=false

    Filter names are lower case with underscores instead of spaces. The full list of options is in the URL options table.

  5. Later: pause or remove the link

    SharePublic linkRemove public link kills the URL; every screen using it then shows a "not found" page until you share again and update the content item in DisplayOps.

Know the limits

Public dashboards are view-only: no drill-through, no clicking into the underlying data. Whoever has the link can also change the filter values by editing the URL, so lock filters with a static embed if that matters. Treat the URL like a password and revoke it when someone who had it leaves.

Method 2A signed static embed with locked filters

Static embedding was built for putting Metabase inside another web app, but the embed URL also opens directly in a browser, which makes it a good kiosk URL. The dashboard id and the locked filter values live inside a token signed with your Metabase secret key, so nobody can change them, and each screen can carry its own token with its own expiry. It is free on every edition; the open-source edition shows a small "Powered by Metabase" banner. Since Metabase 58 (January 2026) the docs recommend the newer guest embeds for applications and say existing static embeds keep working; see the note at the end of this method for why a screen still uses the static form.

  1. Enable static embedding

    Go to SettingsAdmin settingsEmbeddingStatic and turn on Enable static embedding. Copy the Embedding secret key shown on that page; you sign tokens with it.

  2. Publish the dashboard for embedding

    On the dashboard, ShareEmbedStatic embedding. For each filter choose Locked (value fixed in the token), Editable (shown on the page) or Disabled. Click Publish. Metabase shows sample server code in several languages; the Python below does the same.

  3. Create a token for the screen

    Run this once per screen. The exp claim is when the wall goes dark, so choose it deliberately and write the date into the display's name in DisplayOps.

    make-token.py
    import jwt, time   # pip install pyjwt
    
    payload = {
        "resource": {"dashboard": 12},   # the dashboard id from its URL
        "params": {"region": "west"},    # values for filters set to Locked
        "exp": int(time.time()) + 365 * 86400,   # one year; note the date
    }
    secret = "YOUR-EMBEDDING-SECRET-KEY"
    print(jwt.encode(payload, secret, algorithm="HS256"))
  4. Build the URL

    Put the token in the path and the appearance options after the #:

    https://metabase.example.com/embed/dashboard/eyJhbGciOi…#theme=night&bordered=false&titled=false&refresh=60

    Opened in a private window it renders the dashboard with the locked filters applied and no way to change them.

  5. Revoke when needed

    Unpublish the dashboard from the same Embed dialog to stop every token for it, or regenerate the secret key in the admin settings to invalidate every embed at once.

Guest embeds, and why not here

Guest embeds (Metabase 58 and newer) are the successor to static embedding and what Metabase recommends for apps. They need a host page of your own that loads Metabase's embed.js and places a <metabase-dashboard> element with a server-signed token; there is no URL to open directly. For a screen that is extra work with no gain, so this guide keeps the static embed URL, which Metabase says continues to work. If you already run a host page for the wall (see the custom dashboard guide), a guest embed fits in it.

Method 3Make either URL private with basic auth

A public link or an embed is only as private as the URL. If Metabase sits behind a reverse proxy you run, put the wall's route behind HTTP basic auth and store the username and password on the DisplayOps content item. The screen answers the browser's prompt itself, for the page and every request it makes, and the URL alone is no longer enough to see the data. Metabase Cloud cannot be fronted this way.

  1. Protect the public and embed paths at the proxy

    Hash a password with caddy hash-password, then match the two path prefixes Metabase uses for public links and embeds. Everything else, including the normal login, stays as it is:

    Caddyfile
    metabase.example.com {
      # the wall's route: public links and static embeds ask for a password
      @wall path /public/* /embed/*
      basic_auth @wall {
        lobby-tv $2a$14$Yu3…hashed-bcrypt-password…
      }
      reverse_proxy metabase:3000
    }

    The nginx equivalent uses auth_basic in a location ~ ^/(public|embed)/ block; the HTTP authentication guide has the snippet.

  2. Confirm the prompt

    In a private window the public link now asks for a username and password, and loads completely once you enter them.

  3. Store the credential on the content item

    When you add the URL in DisplayOps (next section), tick The page asks for a username and password (HTTP authentication) and enter the proxy user you created. Nothing goes into the URL.

URL options worth knowing

Public links and static embeds read these hash options; logged-in dashboards understand fullscreen and refresh. Combine options with &.

OptionWhat it does
refresh=60Reloads the dashboard data every 60 seconds (dashboards only). Public links, static embeds and normal dashboards all accept it.
theme=nightDark background, the usual choice for a TV. Public links and static embeds. Leave it out for the light theme.
titled=falseHides the dashboard title on public links and static embeds. Default true.
bordered=falseRemoves the border drawn around an embed. Default true inside an iframe, false when the URL is opened directly.
background=falseTransparent dashboard background (dashboards only).
hide_parameters=state,regionHides the named filter widgets. Names are lower case with underscores instead of spaces.
?state=VermontSets a filter. Query parameters go before the # and hash options after it: /public/dashboard/…?state=Vermont#refresh=60&theme=night
fullscreenHides the Metabase navigation on a normal, logged-in dashboard. Public links and embeds have no navigation to hide.
downloads=falseHides the export buttons. Disabling downloads needs a Pro or Enterprise plan; locale= and font= are Pro and Enterprise features too.

A complete wall URL: https://metabase.example.com/public/dashboard/4a3b…?region=west#hide_parameters=region&refresh=60&theme=night&titled=false. The older hide_download_button option was removed in favour of downloads.

Put it on the screen and keep it there

A Raspberry Pi with a browser will show the URL once. What breaks wallboards over the following weeks is everything after that: browser memory, a power blip, an HDMI handshake, a link someone revoked. DisplayOps is a managed player for that job. The steps assume a supported Raspberry Pi and a free account.

  1. Flash and pair

    Write the DisplayOps image to a microSD card, plug the Pi into the TV and the network, and enter the pairing code shown on screen under DisplaysPair in the portal.

  2. Add the dashboard as content

    Content+ New content, type Website, paste the wall URL from method 1 or 2. If you used method 3, tick the HTTP authentication option and enter the proxy username and password. Save.

  3. Set a reload interval

    Open the display, SettingsAuto refresh, and choose Every hour. Metabase's own refresh= keeps the data current; the hourly reload clears browser memory and picks up dashboard edits.

  4. Assign it

    Open the display, or a group of displays, and choose the content. The screen switches within seconds and returns to the same URL after any reboot.

    Take a screenshot from the display page: charts rendered, dark theme, no login form.

  5. Rotate and schedule, if useful

    Several dashboards go in a slideshow with a duration each. Show the sales board during the day and a calm status page at night with a schedule, or push a message to every screen during an incident.

Three screens are free on the Personal plan. The always-on dashboard use case covers office-hours schedules and offline alerts.

Troubleshooting

  • The login page appears after a while. The screen was given a normal dashboard URL and the session ended. Use a public link or a static embed; neither depends on a session.
  • "Public sharing is not enabled" or the Share menu has no public link option. An admin turned public sharing off, or you are not an admin. Check AdminSettingsPublic sharing.
  • The public link shows "not found". The link was removed, or the dashboard was deleted or moved to the trash. Create a new link and update the content item once; every screen follows.
  • The static embed says the token is invalid or expired. The secret key was regenerated, the dashboard was unpublished, or exp passed. Mint a new token.
  • Filters show default values instead of yours. The parameter name in the URL or token does not match the filter's name (lower case, underscores), or the filter is Disabled in the embed settings.
  • The dashboard is a narrow column on the TV. Switch the dashboard to Full width in its menu, and use fewer, larger cards.
  • Times are off by a few hours. Set the report time zone under AdminSettingsLocalization; the screen's own time zone does not affect query results.
  • The browser slows down after days. Set the display's Auto refresh; DisplayOps also restarts a player that stops responding.

Security checklist

  • One public link or token per wall, never a person's own login on a screen.
  • A copy of the dashboard for the wall, containing only what the wall should show.
  • Locked filters in a static embed when viewers must not change what they see.
  • Basic auth on the public and embed paths when the dashboard is reachable from the internet.
  • HTTPS everywhere; a token or link on plain HTTP is readable on the wire.
  • The admin's public sharing list reviewed when someone leaves; token expiry dates noted on the display names.

Metabase on a TV: questions we get

Does Metabase have a kiosk or TV mode?

Not as such. Fullscreen mode hides the navigation on a logged-in dashboard, auto-refresh reloads the data, and the Full width layout uses the whole screen. None of them keeps you logged in, which is why a screen needs a public link or a signed embed.

How long does a Metabase login last?

By default a session ends 14 days after login (the MAX_SESSION_AGE setting, 20,160 minutes), and without "Remember me" it ends when the browser closes. An inactivity timeout is a paid feature. A screen cannot log in again by itself, so do not rely on a session.

Can I use auto-refresh on a public dashboard?

Yes. Add #refresh=60 (seconds) to the public link. The same hash option works on static embeds. Metabase reloads the questions in place; a DisplayOps page reload on top of it is only needed to clear browser memory now and then.

The dashboard shows "Powered by Metabase".

Static embeds created with the open-source edition carry that banner; removing it needs a Pro or Enterprise plan. Public links are the alternative if the banner matters on the wall.

Can I show a dashboard with filters the viewer cannot change?

On a public link, set the filter in the query string and hide it with #hide_parameters=name; anyone who edits the URL can still change it. On a static embed, mark the filter Locked and put its value in the token, which cannot be changed without the secret key.

Can DisplayOps log in to Metabase for me?

Not to the Metabase login form. It does answer HTTP basic or digest prompts from a stored, encrypted credential, so a public link or embed behind basic auth on your reverse proxy is private and still works on any screen.

Put the Metabase dashboard on the wall and forget about it.

Three screens free. Flash, pair, paste the link.