I love Home Assistant. I really do.
But there is one thing that has been driving me absolutely
*insert here your preferred choice of profanity
nuts for a long time:
the UI.
Especially the constant use of tiles/cards where everything seems to be somewhere else depending on what youβre looking at.
One integration has its devices here, entities there, configuration somewhere else, and then you have to remember which menu/card/page you need to open to actually get to the thing you want.
For example: I open Settings β Devices & Services, and I land on the Integrations tab in Tile mode. Thereβs no way to change that view or make it remember my preferred layout.
And every damn time I open it, the tile Iβm looking for is somewhere else. Maybe I added a new integration, deleted something, or simply opened Home Assistant from a different device with different screen dimensions and capabilities.
The result is that the UI feels completely unpredictable. Iβm constantly having to visually hunt for the thing I need instead of knowing where it will be.
It drives me absolutely NUTS.
Yes, it might look nice.
Indeed, it might even be βmodernβ.
But intuitive?
Not really.
And when youβre managing a Home Assistant installation with a lot of integrations, devices and entities, this becomes increasingly annoying.
I donβt want to hunt through tiles.
I donβt want to remember where Home Assistant decided to put something today.
I want a simple overview:
Integration β devices β entities β open integration
All in one place.
And preferably something that looks and behaves like an actual table.
What I want is simple: a stable, user-controlled way to organize this view, with a layout that stays predictable regardless of what I add, remove, or which device Iβm using.
So I built my own.
The goal was pretty simple:
- one integration per row
- integration icon
- readable integration name
- domain / folder ID
- number of devices
- number of entities
- everything clickable
- no separate navigation needed
- alphabetically sorted
- usable on a 10" landscape display
- and, importantly, still perfectly usable in the Home Assistant Companion App on a phone
- and also convenient on a desktop with a row of 4k displays.
-
and most importantly, adjustable and customizable as the user sees fit!
The result looks much more like an administration interface than, jet another, useless collection of colourful tiles.
And thatβs exactly what I wanted.
How it works
The data comes from a small shell script which generates the integration information.
The result is stored in a Home Assistant sensor:
- sensor:
name: "Integration_Info"
command: "/config/integration_info.sh"
value_template: "OK"
json_attributes:
- integrations
The sensor exposes an integrations attribute containing objects like:
{
"domain": "adaptive_lighting",
"devices": 1,
"entities": 4,
"device_url": "/config/devices/dashboard?historyBack=1&domain=adaptive_lighting",
"entity_url": "/config/entities?historyBack=1&domain=adaptive_lighting"
}
I then use flex-table-card to turn that data into an actual table.
The nice part is that the table isnβt just visual.
Everything that should be clickable actually is.
The device count links directly to the device list, the entity count directly to the entities, and the folder icon opens the integration page.
For the integration icons Iβm using the Home Assistant Brands repository:
http://brands.home-assistant.io/<domain>/[email protected]
That also turned out to be important: the http URL works reliably in my setup, while the https version didnβt, since its in a fully isolated network and i therefore donβt need ssl and never bothered to set it up.
I also opted to choose the dark theme icon as my HA is all dark theme.
The final Lovelace card
This is the version Iβm currently using:
title: Integrations
path: integrations
icon: mdi:server
panel: true
cards:
- type: custom:flex-table-card
title: π₯οΈ Server Explorer
entities:
include: sensor.integration_info
sort_by: integration
columns:
# Integration + icon
- name: Integration
id: integration
data: integrations
modify: >
'<div style="display:flex;align-items:center;gap:30px;">' +
'<img
src="http://brands.home-assistant.io/' + x.domain +
'/[email protected]"
style="width:60px;height:60px;object-fit:contain;">' +
'<strong style="font-size:30px;">' +
x.domain.replaceAll('_', ' ').replace(/\b\w/g, c => c.toUpperCase()) +
'</strong>' +
'</div>'
# Integration domain
- name: Ordner-ID
id: domain
data: integrations
modify: |
'<code>' + x.domain + '</code>'
# Devices
- name: Devices
id: devices
data: integrations
align: center
modify: |
x.devices > 0
? '<a href="' + x.device_url + '">' + x.devices + '</a>'
: 'β'
# Entities
- name: Entities
id: entities
data: integrations
align: center
modify: |
x.entities > 0
? '<a href="' + x.entity_url + '">' + x.entities +
'</a>'
: 'β'
# Open integration
- name: ''
id: open
data: integrations
align: center
modify: >
'<a href="/config/integrations/integration/' + x.domain +
'" title="Integration ΓΆffnen">' +
'<span style="font-size:60px;line-height:1;">π</span>' +
'</a>'
css:
table+: 'width: 100%;'
th+: 'padding: 8px 10px;'
td+: 'padding: 7px 10px; font-size: 30px;'
tbody tr+: 'border-bottom: 1px solid var(--divider-color);'
Result
The end result is intentionally boring.
And thatβs a compliment.
Something like:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π₯οΈ Server Explorer β
βββββββββββββββββββββ¬βββββββββββββββββββββ¬ββββββββββ¬ββββββββββββ¬βββββββββββββββ€
β Integration β Domain β Devices β Entities β β
βββββββββββββββββββββΌβββββββββββββββββββββΌββββββββββΌββββββββββββΌβββββββββββββββ€
β [icon] Adaptive β adaptive_lighting β 1 β 4 β π β
β [icon] Browser β browser_mod β 3 β 39 β π β
β [icon] Dreame β dreame_vacuum β 2 β 313 β π β
β [icon] MQTT β mqtt β 8 β 98 β π β
β [icon] ZHA β zha β 57 β 563 β π β
βββββββββββββββββββββ΄βββββββββββββββββββββ΄ββββββββββ΄ββββββββββββ΄βββββββββββββββ
Except, obviously, the actual HA version is much nicer. ![]()
The important thing for me is that the UI now behaves predictably.
I can see whatβs installed.
I can see how many devices and entities each integration has.
I can click directly where I want to go.
No tile hunting.
No βwhere the
*insert here your preferred choice of profanity
did Home Assistant put that again?β
Just a table.
And honestly, this is probably one of the most useful dashboards Iβve built for administering my HA installation.
Ah, I almost forgot:
my integration_info.sh script that sits inside the home assistant docker, thatβs where the action actually is happening:
#!/bin/sh
domains="$(
for d in /config/.cache/brands/integrations/*/; do
[ "$(ls -1 "$d" | wc -l)" -gt 1 ] &&
[ "$(basename "$d")" != "_placeholder" ] &&
basename "$d"
done | sort
)"
jq -n \
--arg domains "$domains" \
--slurpfile config_entries /config/.storage/core.config_entries \
--slurpfile devices /config/.storage/core.device_registry \
--slurpfile entities /config/.storage/core.entity_registry '
($config_entries[0].data.entries) as $entries |
($devices[0].data.devices) as $devices |
($entities[0].data.entities) as $entities |
{
integrations: (
$domains
| split("\n")
| map(select(length > 0))
| map(
. as $domain |
($entries
| map(select(.domain == $domain) | .entry_id)
) as $entry_ids |
{
domain: $domain,
devices: (
$devices
| map(
. as $device |
select(
($device.config_entry_id != null) and
(($entry_ids | index($device.config_entry_id)) != null)
)
)
| length
),
entities: (
$entities
| map(
. as $entity |
select(
($entity.config_entry_id != null) and
(($entry_ids | index($entity.config_entry_id)) != null)
)
)
| length
),
device_url:
("/config/devices/dashboard?historyBack=1&domain=" + $domain),
entity_url:
("/config/entities?historyBack=1&domain=" + $domain)
}
)
)
}
'
- this
integration_info.shfile must be inside the docker container, so in the terminal integration run:docker exec -it homeassistant bashand create the script withtouch /config/integration_info.sh - donβt forget to chmod it to be executable

** hint:chmod +x /config/integration_info.sh
Requirements
- Home Assistant
custom:flex-table-card- the sensor providing the
integrationsattribute - your
integration_info.shscript generating the data
Tested on:
Installation method: Home Assistant OS
Core: 2026.8.1
Supervisor: 2026.07.5
Operating System: 18.2
Frontend: 20260729.6



