-
Notifications
You must be signed in to change notification settings - Fork 0
Visual Editors
Both cards have point-and-click editors, so you can build and use templates without writing YAML by hand.
Add a Custom: Decluttering Template Plus card to a view (+ Add card, search declutter). Its editor has a tab strip:

| Field | Meaning |
|---|---|
| Template to define | The name other cards will use. Must be unique on the dashboard. |
| Type of thing to template | Card, Badge, Row or Element. Switching this swaps the body for a starter of the new type. |
| Description | What the template is for. Shown to whoever uses it, and carried with it when shared. |
| Variable declarations | Descriptions of the variables the template takes, so cards using it get real controls. See Describing Variables. |
| Variables | The template's default values, as a YAML list — - name: value per line. |
Underneath is a live preview, outlined in blue and labelled with the template name, rendered from the defaults. Give every variable a default and the preview shows you what you are building as you type.
When the type is Card, a second tab gives you Home Assistant's own card editor for the body:

You get the real editor for whichever card type you chose — entity pickers, feature
pickers, interaction settings, the lot. Show code editor at the bottom left drops to
YAML whenever the visual editor cannot express what you want, which is where you put your
[[variables]].
"Unknown entity selected" is normal here. The entity field shows
[[light]], which is a placeholder, not an entity. The editor does not know that. Ignore the warning — the preview below shows the real card built from your defaults.
Swaps the template body for a different card type, using the standard card picker.
When the type is Row, you get Home Assistant's row editor instead.
Badge and Element templates have no dedicated tab — edit them under Settings → Show code editor.
The hard part of the first conversion is deciding which parts of a card change between copies. The editor can work that out for you.
Put the card into the template — build it on the Card tab, or paste it in through Share — then press Suggest variables from the card on the Settings tab.
Every entity, name, title, heading and icon in it becomes a variable, described with
the right control and defaulting to the value it replaced, so the template renders exactly
what the card did until you pass something else in.
# before
card:
type: vertical-stack
cards:
- {type: tile, entity: light.hall, name: Hall, icon: mdi:lamp}
- {type: tile, entity: light.hall, name: Hall again}# after
variables:
- {name: entity, label: Entity, selector: {entity: {}}, default: light.hall}
- {name: name, label: Name, selector: {text: {}}, default: Hall}
- {name: icon, label: Icon, selector: {icon: {}}, default: 'mdi:lamp'}
- {name: name_2, label: Name 2, selector: {text: {}}, default: Hall again}
card:
type: vertical-stack
cards:
- {type: tile, entity: '[[entity]]', name: '[[name]]', icon: '[[icon]]'}
- {type: tile, entity: '[[entity]]', name: '[[name_2]]'}-
The same value in the same kind of place becomes one variable.
light.hallappears twice above and is one thing to fill in, not two. - Values that are already variables are left alone, as are names the template already declares — so pressing it again after adding another card is safe.
- A list of entities is left alone rather than half replaced.
- Because it rewrites your card, it asks twice before doing anything.
Lists every view on this dashboard that uses the template and how many times, plus any other template that calls it.
Worth a look before changing a template, because what a change affects is not visible from the template card itself — the cards using it can be anywhere, including inside stacks, grids and conditional cards, all of which are counted. A template card defines rather than uses, so it is not counted. Each view in the list is a link, opened in a new tab so the editor — and anything you have not saved yet — stays exactly where it is.
Cards on other dashboards are not counted, even ones that borrow this dashboard's templates.
Renaming a template on the Settings tab offers to rename every use of it on the dashboard at the same time, so a rename does not leave a trail of cards pointing at a name that no longer exists.
The Share tab writes the template out as YAML to send to someone else, and takes YAML somebody sent you and puts it into the template card you are editing.
A template is only ever as portable as the things it is built from, and the YAML cannot say what those are — so the export names them in comments: the custom cards it needs, and any other template it calls, which an export does not carry with it.
Importing replaces the template card you are editing, and nothing is written to the dashboard until you save as usual. If the incoming template has the same name as one you already have, the editor says so and waits for a second press.

The settings tab: what uses this template, and the order its variables appear in.
It says when something uses it. The Where used tab has always known, but only if you went and looked — and the moment it matters is when the card is open in front of you, about to be edited or deleted.
The declared variables can be reordered. Their order in the list is their order in the form every card using the template gets, and changing it used to mean hand-editing the YAML underneath.
Duplicate puts a copy of the template beside it under a new name, which is how most new templates start life. It asks twice, and saves the dashboard when you agree.

Moving off the original card's names. If any card on the dashboard still says
custom:decluttering-card, the Where used tab offers to rewrite them all. They work as
they are — this card answers to both sets of names — but they would stop working the day
the original is installed alongside it, because Home Assistant loads resources in the order
they were added and the original would win.

The Share tab has a handful of worked examples of the shapes people build most: a light tile that names itself, a card per room that lists the lights in it, a sensor row, a badge that only appears when something needs attention, and a numbered grid.
Installing one adds it to the view as its own template card, leaving the template you are editing alone. Anything a starter calls comes with it — installing the room card brings the tile it repeats over.
They are carried in the card itself rather than fetched, so nothing here reaches the internet.
Add a Custom: Decluttering Card Plus card to use a template:

| Field | Meaning |
|---|---|
| Template to use | Dropdown of every template available to this dashboard, sorted. You can also type a name that does not exist yet. |
| Variables | The values to substitute — a YAML list (- name: value per line) or a single mapping. |
| Repeat for each | Render the template once per item. Card templates only. See Repeating a Template. |
| Repeat for each thing Home Assistant knows about (v1.1.0+) | One copy per entity or area, kept up to date. See Repeating a Template. |
| Columns | How many copies sit side by side. |
| Minimum column width (v1.1.0+) | Pixels. Drops a column rather than going narrower. |
| Fit into the layout (v1.1.0+) | Whether this card keeps a box of its own or gets out of the way. See Styling. |
The preview updates as you type.
At the bottom of the card editor, a Result panel shows the card that is actually built once every variable has been put in.
The template is in one place, the values are in another, and what you see on the dashboard
is a third thing — so working out why the result is not what you meant used to mean reading
both and doing the substitution in your head. Anything still written as [[name]] in there
is a variable nothing gave a value to.
It is read-only, and a card repeating over a list shows the first copy.
If the template describes its variables, this editor looks quite different: its description appears at the top, and each variable gets a real control — an entity picker, a dropdown, an icon picker — with anything the template does not describe still editable in an Other variables box underneath.

It also warns about a variable the template uses that has no value anywhere, and about a value set here that the template never reads. Neither stops you saving.
The dropdown includes templates defined in decluttering_templates, templates defined as
cards on any view, and templates
borrowed from other dashboards. Borrowed ones
appear a moment later, once the other dashboard has been read — the editor will not flag a
template name as unknown while that is still in flight.
| Message | Cause |
|---|---|
| No template exists with this name | Typo, or the template is on a dashboard you have not borrowed from |
| Variables must be a list of key and value pairs, or a mapping of them |
variables: or default: is something else entirely — a string, or a number |
| The declarations must be a list, each entry naming one variable | A template's variables: block was written as a mapping. Declarations are a list, because each one names the variable it describes |
| This card is set to get out of the way… (v1.1.0+) |
fit: contents is set alongside a style that paints on the card's own host, which then has nothing to paint on |
Warnings, as opposed to errors, are listed under Describing Variables. None of them stop a save.

A for_each_from is the most powerful thing the card does and used to be completely
invisible until you saved and looked. A typo in a domain or an area name read as "this card
is broken" rather than "nothing matched that".
The editor now counts what it matches as you write it, and lists the first dozen. A filter
that matches nothing says so plainly — and mentions the empty: card if one is set, since
that is what would actually be drawn.
The list is what the card would build now; it is worked out again whenever Home Assistant's registry changes.
The template dropdown also shows each template's description beside its name, which matters once a dashboard has twenty of them.
Rows and picture elements have no card picker entry, so add them in YAML:
- Add (or open) an Entities or Picture Elements card.
- Click Show code editor.
- Add the entry to
entities:orelements:as shown in Rows / Elements.
The template itself can still be built with the visual template editor.
Everything the editors do is plain configuration. ⋮ → Raw configuration editor on the dashboard gives you the whole thing at once, which is usually faster for defining several templates — see Defining Templates.
→ Defining Templates · Using Templates
The template editor's Share tab exports a template for someone else, and imports one they sent you — see Sharing a Template.
Getting started
Core concepts
Content types
Features
- Repeating a Template
- Sharing Between Dashboards
- Sharing a Template
- Visibility
- Styling
- Visual Editors
- Translations
Reference