A Leaflet map card for Home Assistant, and the shared map of the Live Track integrations: aircraft, ships, trains and weather on one map.
It is derived from ha-map-card
1.16.0 by nathan-gs, under the MIT licence.
The options documented below are mostly his, and the Live Track features are
built on his card. This is a separate card with its own name,
custom:live-track-map-card, so it can be installed alongside ha-map-card
(custom:map-card) without either replacing the other.
- Get
live-track-map-card.js: download it from a release's assets, or build it from this repository withnpm ciand thennpm run build, which writesdist/live-track-map-card.js. - Copy it to
/config/www/live-track-map-card/live-track-map-card.js. - Add it as a resource: Settings → Dashboards → ⋮ → Resources → Add
resource (the menu needs Advanced mode, set in your user profile). URL
/local/live-track-map-card/live-track-map-card.js?v=1, type JavaScript module. - Whenever you replace the file, change the
?v=value as well (?v=2, and so on). Browsers cache a resource by its URL for up to 31 days, so a new file behind an unchanged URL can keep loading the old one.
Each Live Track integration publishes what it tracks as geo_location
entities, and every one of them carries a source attribute naming the
integration (live_track_aircraft, live_track_ships, and so on). The shared
map is this card inside auto-entities,
which hands the card every entity matching a filter. A new train or vessel then
appears on the map, and leaves it, without the card being edited.
One integration:
type: custom:auto-entities
card_param: entities
card:
type: custom:live-track-map-card
x: 41.88 # latitude
y: -87.63 # longitude
zoom: 10
filter:
include:
- domain: geo_location
attributes:
source: live_track_ships
options:
display: attribute
attribute: marker_label
position_transition: auto
exclude:
- state: unavailableEvery Live Track integration at once, by leaving source out. That matches
every geo_location entity on the instance, so exclude other integrations'
by their own source (here geo_json_events):
filter:
include:
- domain: geo_location
options:
display: attribute
attribute: marker_label
position_transition: auto
exclude:
- attributes:
source: geo_json_events
- state: unavailablecard_param: entities is required: it is what tells auto-entities which of
the card's options to fill. Whatever goes under options: is applied to every
entity the filter finds. display: attribute with attribute: marker_label
draws the label the integration chose (a train or flight number) instead of
one squeezed out of the entity's name. position_transition: auto slides each
marker to its new position over the time since its last update, at most 30
seconds, and not at all when the browser asks for reduced motion.
Home Assistant contains a native map feature, if you don't need advanced features like WMS layers it might be a better choice.
type: custom:live-track-map-card
x: 51.23
y: 3.652Take a look at: https://nathan.gs/2024/01/06/ha-map-card-a-new-and-alternative-leaflet-based-map/#a-more-advanced-example-measuring-pm25-air-quality-for-my-home
It was written for ha-map-card: to use its examples with this card, change
type: custom:map-cardtotype: custom:live-track-map-card.
| name | Default | note |
|---|---|---|
x |
Latitude | |
y |
Longitude | |
history_start |
Date: 2022-03-01T12:00:00Z Time code: 5 hours ago Entity: input_number.example_number See History options for full details. |
|
history_end |
now |
Date: 2022-03-01T12:00:00Z Time code: 5 hours ago Entity: input_number.example_number See History options for full details. |
focus_entity |
Entity to focus on. Map will default to show all markers if this and X/Y are not set. | |
title |
If empty, don't show a title | |
zoom |
12 | The zoom level. Ignored unless focus_entity or X & Y coords are set. |
card_size |
5 | The Home Assistant card size |
entities |
[] | Array of entities, will be listed as markers |
wms |
[] | WMS Layers, an array of WMS see below |
tile_layers |
[] | Tile Layers, an array of Tile Layers see below |
tile_layer_url |
https://tile.openstreetmap.org/{z}/{x}/{y}.png or https://tile.example.com/{{states('sensor.test') }}/{z}/{x}/{y}.png |
Override the default map source, the url supports entity lookups. See URL Entity lookup. |
tile_layer_attribution |
© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> | Set the correct map attribution |
tile_layer_options |
{} | The options for the default TileLayer |
history_date_selection |
false | Will link with a energy-date-selection on the page to provide an interactive date range picker. |
theme_mode |
auto | auto, light ordark |
focus_follow |
none | none, refocus, contains, reset the map focused entity's, on each update. Some people call this the Autofit feature. |
focus_follow_pause |
0 | Number of seconds to suspend focus_follow after the user pans (mouse down/drag) or zooms the map. 0 disables pausing (default, existing behavior). |
map_options |
{} | The options for the default Leaflet Map |
cluster_markers |
false | Enable marker clustering to group nearby entities together. Click the group icon button to toggle clustering on/off. |
path_following |
true | Boats slide along the water instead of in a straight line across land. See Path-following. false turns it off. |
path_min_zoom |
14 | Path-following works from this zoom up. Below it a slide is straight, as without the feature. |
path_strict_zoom |
14 | From this zoom a boat is never slid on a move the card has not checked: while the water tiles for a move are still loading, the boat is placed at its new position instead of sliding straight. |
path_tile_sources |
OpenStreetMap, then OpenFreeMap | The vector tile sources the water comes from, tried in order. See Path-following. |
shape_layers |
auto | Filled areas published by an integration, such as weather alerts. See Shapes on the map. false turns them off. |
shape_style |
fill 0.25, outline 2 px at 0.9 | How those areas are drawn. See Shapes on the map. |
weather_radar |
on, ticked | The weather radar overlay. See Weather radar. false removes it. |
debug |
false | Enable debug messages in console. |
plugins |
[] | An array of plugin definitions, see: Plugin Options, Available plugins and Developing plugins |
For non-geographic maps, set map_options.crs to simple. The card will translate that into Leaflet's L.CRS.Simple, so you can use image/floor-plan style coordinates and pair them with entity fixed_x / fixed_y values.
type: custom:live-track-map-card
x: 0
y: 0
zoom: 0
map_options:
crs: simple
minZoom: -5
tile_layer_url: ""
entities:
- entity: sensor.room_temperature
fixed_x: 320
fixed_y: 180If x & y or focus_entity is not set it will take the lat/long from the first entity.
When an entity slides from its previous position to a new one (position_transition), a straight line can cross land: a boat between two fixes on a winding river cuts across the bank, through buildings and over piers. With path-following the card slides it along the water instead, and a boat whose reported position sits on land (a mooring against a seawall, a GPS or map error) is drawn in the nearest water.
- What follows paths: entities with
map_layer: water. Nothing else changes. - When: from
path_min_zoom(14) up, where a crossing is big enough to see. Below it every slide is straight. Frompath_strict_zoom(14) a move whose water tiles have not arrived yet is placed, not slid. - What the card fetches: vector map tiles at zoom 14, only for moving boats on screen, kept in the browser for 7 days. Nothing is fetched ahead of viewing.
- Sources, in order: OpenStreetMap's vector tiles (Shortbread schema), then OpenFreeMap (OpenMapTiles schema) if the first fails. An HTTP 429 from either stops all tile fetching for that page; if both fail, slides are straight. The attribution of a source is added to the map once its data has been used.
- What it does not do: it never changes the entity's state or what the recorder stores, and it never slides a boat across land: a move that cannot be routed over water (no way round, or a route more than twice the straight line) places the boat at its new position instead. Piers and breakwaters are never crossed.
Both tile services are run on donated or volunteer infrastructure; please keep their terms in mind (OpenStreetMap vector tile policy, OpenFreeMap).
path_following: true # the default; false turns it off
path_min_zoom: 14
path_strict_zoom: 14
path_tile_sources: # optional; replaces the list
- id: my-tiles
tiles: https://tiles.example.com/{z}/{x}/{y}.pbf
schema: openmaptiles # or shortbread
attribution: '© Example, data © OpenStreetMap contributors'Some integrations publish areas rather than points: weather alerts by forecast zone and county, for example. The card finds any entity that publishes them (a shapes_url naming a file of shapes, and zones naming which to fill now, each with an event), fetches that file once, and fills each area in its event's colour over the map and under every marker. The most important event is drawn on top. Each publisher gets a checkbox in the layer control at the top right, on by default; a viewer's own choice is kept in their browser. The publisher's credit appears in the map's attribution line while its areas are shown.
- The file is fetched from your Home Assistant and kept in memory for the page, never in browser storage. A new file has a new address, so an update is fetched once and the old one dropped.
- If the file cannot be loaded, only the areas the publisher sends with their own outline are drawn, and the card tries again after 10 minutes.
- If the publisher is unavailable, nothing is drawn for it.
shape_layers: auto # the default: every publisher found
# shape_layers: false # none
# shape_layers: # exactly these, with your own label
# - entity: sensor.my_alerts
# name: Warnings
# show: false # start unticked
shape_style: # optional; each key optional
fill_opacity: 0.25
weight: 2 # outline, px
opacity: 0.9 # outline
renderer: svg # or canvas
by_priority: false # true: stronger fill for more important eventsOne radar layer with a checkbox, "Weather radar", in the layer control, on by default. For each map tile the card uses the sharpest radar that covers the whole tile, and RainViewer everywhere else. Only the newest frame is shown; it is refreshed every few minutes while the box is ticked and the layer is on screen. The radar sits over the map tiles and under filled areas and every marker, and is not darkened by the dark theme.
| Where | Source | Licence / terms |
|---|---|---|
| North America, inside its published box (170.3°W–50°W, 16.9°N–67.2°N) | Environment and Climate Change Canada GeoMet | Open Government Licence – Canada |
| Guam, the Aleutians from 176°W to 170.3°W, the Caribbean south of 16.9°N | NOAA nowCOAST | no access constraints or fees (its capabilities) |
| Finland | Finnish Meteorological Institute | CC BY 4.0 |
| Germany | Deutscher Wetterdienst | CC BY 4.0 |
| Japan | Japan Meteorological Agency | Public Data License 1.0 |
| everywhere else | RainViewer (to zoom 7, enlarged beyond) | free for personal use, credit required |
- Credits: each source's credit appears in the map's attribution line while one of its tiles is on screen.
- When a source is down or its newest frame is over 30 minutes old, its tiles fall to the next source; if RainViewer's is too, no radar is drawn.
- Relays: an integration may offer a radar it fetches on your behalf (one that needs your own key). The card finds it by its
radar_relayattribute and loads its tiles through a signed Home Assistant address. Nothing needs configuring. - No radar is stored in the browser beyond its normal image cache; only the viewer's checkbox choice is kept, as for the other overlays. Requests go only to the sources on screen.
weather_radar: true # the default
# weather_radar: false # no radar, no checkbox, no requests
# weather_radar: # each key optional
# opacity: 0.5
# show: false # start unticked
# rainviewer_scheme: 2 # RainViewer colour scheme, 0-8
# sources: [rainviewer] # only these, in this order (fmi, dwd, jma, geomet, nowcoast, rainviewer, or a relay's id)You can add dynamic url's, for example to use a sensor value in the url. When the parameter changes, the map will redraw with the new tile layer.
tile_layer_url: https://tile.example.com/{{states('sensor.test') }}/{z}/{x}/{y}.png
It only supports
stateswithout any filters, this is a crude javascript regex based implementation, not the Jinja2 templating engine from Home Assistant.
Either the name of the entity or:
| name | Default | note |
|---|---|---|
entity |
The entity id | |
display |
marker |
icon, state, attribute, marker or pill. marker will display the picture if available. icon will display the icon if available, otherwise a label composed of first letters of the entity's name. pill shows the entity's current zone icon + its initials together when it is inside a Home Assistant zone, and the normal initials marker otherwise. See Place pill. |
picture |
Set a custom picture to use on the marker. | |
icon |
Set a custom icon to use if display is set to icon. e.g. mdi:cake |
|
label |
Set a custom text label to display on the marker (overrides auto-generated initials). On picture markers, label / prefix / suffix overlay the photo; auto-generated initials do not. |
|
attribute |
Set an attribute to use if display is set to attribute. e.g. speed |
|
prefix |
Optional prefix for a value if display is set to attribute |
|
suffix |
Optional suffix for a value if display is set to attribute |
|
size |
48 | Size of the icon |
color |
Random Color | Can defined as red, rgb(255,0,0), rgba(255,0,0,0.1), #ff0000, var(--red-color) |
css |
text-align: center; font-size: 60%; |
CSS for the marker (only for state and marker) |
history_start |
Will inherit from map config if not set. Date: 2022-03-01T12:00:00Z Time code: 5 hours ago Entity: input_number.example_number See History options for full details. |
|
history_end |
now |
Will inherit from map config if not set. Date: 2022-03-01T12:00:00Z Time code: 5 hours ago Entity: input_number.example_number See History options for full details. |
history_line_color |
Random Color | Can defined as red, rgb(255,0,0), rgba(255,0,0,0.1), #ff0000, var(--red-color) |
history_show_lines |
true | Show the path |
history_show_dots |
true | Show little dots on the path |
fixed_x |
Display a fixed marker, this will ignore the latitude/longitude attributes | |
fixed_y |
Display a fixed marker, this will ignore the latitude/longitude attributes | |
fallback_x |
If the latitude/longitude is missing, use these fixed attributes | |
fallback_y |
If the latitude/longitude is missing, use these fixed attributes | |
tap_action |
{"action": "more-info"} | Allow custom action to be triggered when this entity is clicked. Actions include more-info, call-service, navigate, url, assist, none. Some actions require additional paramaters. navigate requires a navigation_path. url requires a url_path. call-service requires service and an optional data |
gradual_opacity |
The total amount of opacity will be gradually distributed across the paths. gradual_opacity is divided by the number of paths to calculate the opacity step for each path. The base opacity is generated by (1 - gradual_opacity), and as each path progresses, its opacity gradually darkens by the step amount. |
|
focus_on_fit |
true | If this variable is set to false, This entity will be excluded when the map fits the included entities on the screen. |
z_index_offset |
1 | z-index value that determines what is displayed on top when markers overlap. (Setting a gap of at least 20 between the values assigned to each entity is recommended.) |
use_base_entity_only |
false | When set to true, the tracking will use only the base entity without including any associated device trackers. This is useful for scenarios where you want to track the base entity directly and ignore any associated trackers. |
position_update_threshold |
10 | Distance threshold in meters. Marker position only updates if the entity has moved more than this distance. Prevents unnecessary map updates from GPS drift. Useful for clustered markers. |
pill_callout_min_zoom |
15 | Only for display: pill. Map zoom at/above which the pill is drawn as an offset callout (up-left of the point, with a thin leader line to a dot on the exact location). Below this zoom the pill simply centres on the point with no leader, so it isn't obtrusive when the whole region is in view. |
circle |
Display a circle around the marker. More details Circle options |
|
geojson |
Display GeoJSON data from an entity attribute. More details GeoJSON options |
A pill marker answers "who is where" in a single glance. When a tracked entity
is inside a Home Assistant zone, its marker is drawn as a small stadium ("pill")
holding two circles: the zone's icon on the left and the entity's initials
on the right — for example a church icon next to ML, or a home icon next to
MG. When the entity is not in any zone it falls back to the normal initials
marker. It is opt-in per entity and changes nothing for entities that don't set
display: pill.
With the stock marker you can see that someone is on the map, but to learn which named place they're at you have to recognise the spot or click through. And when a person sits on top of their home/zone, you either get two overlapping markers or a cluster bubble showing a count. The pill folds identity and place into one marker — "Mom is at the church" is readable without interaction — using data Home Assistant already has (zones + the entity's state).
There is no extra configuration linking a person to a place; it is derived live:
- The entity is the person. You list a
person.*ordevice_tracker.*on the map as usual. The card already places it at its GPS position and derives its initials from the entity'sfriendly_name(first letter of each word, e.g.Mom Location→ML).label:still overrides the initials if set. - Zones are the named places. Each HA
zone.*has afriendly_name, anicon, a latitude/longitude and a radius. These already exist whenever you create a zone (Settings → Areas & Zones). - Home Assistant links them via state. When a
device_tracker/personis inside a zone, HA sets that entity's state to the zone's name (the Home zone reportshome). This is the join between person and place, maintained by HA core — the card doesn't compute geometry. - The card reads it back. For a
pillentity it takes the entity's raw state, finds thezone.*whosefriendly_namematches it (case-insensitive;home→ the Home zone), and uses that zone'siconfor the left circle. If the state isnot_home/away/unknown — or matches no zone — there is no place, so the normal initials marker is shown instead. - Tooltip. Hovering shows
<person> is at <place>, e.g. Mom is at Extended Family. The person name is the entity'sfriendly_namewith a trailingLocation/Tracker/Device/Phone/GPSstripped, soMom Locationreads asMom. (This uses a Leaflet tooltip, which opens immediately, rather than the browser's delayed nativetitle.)
The marker is rebuilt automatically when the entity enters or leaves a zone, so the pill appears, swaps icon, or collapses to initials as the person moves.
At/above pill_callout_min_zoom (default 15) the pill is offset up-and-left of
the exact position and connected by a thin leader line to a small dot on the
real location, so the pill doesn't cover what's underneath. Below that zoom — when
the whole town or region is in view and a leader line would just be clutter — the
pill simply centres on the point with no leader. Set pill_callout_min_zoom lower
to engage the callout sooner, or very high to effectively disable it.
The pill reuses the entity's existing color (the same per-entity colour the
normal marker uses, or whatever you set with color:) for the outline, icon,
initials and leader, and size for each circle. Dark mode is honoured.
- The places must be real HA zones with an
iconand afriendly_name(icons likemdi:home,mdi:church,mdi:account-group). - The entity must report its zone in its state — GPS
device_trackers andpersons do this automatically; the Home zone reportshome.
type: custom:live-track-map-card
entities:
- entity: device_tracker.mom_location
display: pill
- entity: person.matt
display: pill
pill_callout_min_zoom: 14 # show the offset callout a bit soonerWith device_tracker.mom_location in the Extended Family zone this renders a
pill of mdi:account-group + ML, tooltip "Mom is at Extended Family"; when she
leaves it becomes a plain ML marker.
If history_date_selection:true, any entities that do not define their own history_start and history_end configuration will be automatically linked to this. Please ensure a card of type: energy-date-selection exists on the page before enabling this.
This can be added via the "Add Card" dialog by selecting Manual and entering the text type: energy-date-selection.
Alternatively history_start and history_end can be set to
- A specific date such as
2022-03-01T12:00:00Z - A time code such as
10 days ago4 hours ago1 week agoetc. - An entity that will provide either a
dateornumber(which will be used as the amount of hours ago to show). e.g.input_number.example_number_value
If you want to specify your own unit, configure the history_start/history_end as the below.
history_start:
entity: input_number.example_number_value
suffix: days ago
Each entity can individually override the base config by setting its own history_start/history_end, using any of the options above.
Any entity without its own settings will inherit the map level config.
Display a circle around the marker. It can either be called with the string auto or following options.
circle: auto
| name | Default | note |
|---|---|---|
source |
Where to get the radius from, see below for options. | |
attribute |
The attribute to use for the radius (in case of source: attribute). |
|
radius |
Radius in meters (in case of source: config)(optional) |
|
color |
Color of the circle (will use the entity color if not set) | |
fill_opacity |
0.2 | Opacity of the fill color |
Source
auto- Will use thegps_accuracy, then theradiusattribute from the entity if available, otherwise will use theradiusset in the config.gps_accuracy- Will use thegps_accuracyattribute from the entity.radius- Will use theradiusattribute from the entity.config- Will use theradiusset in the config.attribute- Will use theattributeset in the config.
Display GeoJSON data from an entity attribute. This is useful for displaying zones, areas, routes, or any geographic data stored as GeoJSON in your Home Assistant entities.
The geojson option can be configured in several ways:
Simple usage (uses default attribute name geo_location):
geojson: trueSpecify a custom attribute name:
geojson: zone_geojsonFull configuration:
geojson:
attribute: zone_geojson
color: '#FF5733'
weight: 3
opacity: 1.0
fill_opacity: 0.2
hide_marker: false| name | Default | note |
|---|---|---|
attribute |
geo_location |
The entity attribute containing the GeoJSON data |
color |
Entity color | Color for the GeoJSON features (lines and fills) |
weight |
3 | Line weight for GeoJSON features |
opacity |
1.0 | Opacity of lines |
fill_opacity |
0.2 | Opacity of filled areas |
hide_marker |
false | When set to true, hides the default entity marker and only displays the GeoJSON |
Supported GeoJSON types:
- Point, MultiPoint
- LineString, MultiLineString
- Polygon, MultiPolygon
- GeometryCollection
- Feature, FeatureCollection
Example entity configuration:
entities:
- entity: sensor.my_zone
geojson:
attribute: zone_data
color: '#3388ff'
fill_opacity: 0.3
hide_marker: trueThe GeoJSON data in the entity attribute can be either:
- A JSON string:
'{"type": "Polygon", "coordinates": [[[0,0], [1,0], [1,1], [0,1], [0,0]]]}' - A parsed JSON object (if your integration provides it that way)
Interactive Features:
- GeoJSON zones are clickable - clicking on any GeoJSON feature will show the entity's more-info dialog (or trigger the configured
tap_action) - If the GeoJSON Feature or FeatureCollection includes properties, they will be displayed in tooltips when hovering over the features
| name | note |
|---|---|
url |
The url of the layer, see URL Entity lookup. |
options |
The leaflet layer WMS options or Tile Layer options |
history |
The name of the layer option which controls the dat, if it supports a date or time option. Set history to the name of this property. The history_start value, state or date range picker will then set this property on the layer and update it as necessary. |
name |
tile_layers only. Gives the layer a checkbox in a layer control at the map's top right, so viewers can turn it on and off. Each viewer's choice is kept in their own browser. |
show |
tile_layers only, with name. false starts the layer off; the default is on. A viewer's own choice wins. |
tile_layers:
- url: https://tiles.example.com/overlay/{z}/{x}/{y}.png
name: Rail lines
show: true
options:
opacity: 0.4
attribution: 'Overlay © Example'By default the card will not zoom beyond default property of the maxZoom of the tilelayer, the default is 18, but it can be overriden as follows:
type: custom:live-track-map-card
tile_layer_options:
maxZoom: 20
Keep in mind that the tile layer source also has a maximum zoom level, which is 20 for most OSM maps.
OpenStreetMap tile servers may block tile requests that lack a valid Referer header. By default, referrerPolicy is set to "origin-when-cross-origin", which ensures the browser sends the origin with cross-origin tile requests as required by OSM's Tile Usage Policy. You can override this if needed:
type: custom:live-track-map-card
tile_layer_options:
referrerPolicy: "no-referrer"
More complex use of the WMS/Tile history property can be configured within the history property of the layer.
propertyis the option this should control (often namedtimeordate)sourcedefaults to auto (which means it will inherit from the main map settings). Set this to a date or number entity if this is different.suffixdays ago/weeks ago as with other history entitiesforce_midnightsome WMS/Tile layers only work if the date is set as midnight.
history:
property: time
source: input_number.test_number_value
suffix: months ago
force_midnight: true
| name | note |
|---|---|
name |
Mandatory, a helpful name for this instance of the plugin. Useful for debugging issues. |
url |
The url of the plugin, if the plugin is in the file /var/lib/hass/www/SomePlugin.js , then this would be ./local/SomePlugin.js. |
hacs.module |
The HACS module from which the plugin must be loaded if url is not set. |
hacs.file |
The file within the module from which the plugin must be loaded if `url is not set. |
options |
Options for configuring the plugin |
The url option is used when set.
If the url is not set and the hacs object is, the plugin will be loaded from the HACS plugin with the given name and given filename.
type: custom:live-track-map-card
x: -25.3744
y: 133.7751
plugins:
- name: plugin
url: /local/my-plugin.js
options:
some_option: true
- name: another_instance
url: /local/my-plugin.js
options:
some_option: falseThese plugins were written for ha-map-card. This card's plugin interface
(src/models/Plugin.js) is unchanged from ha-map-card 1.16.0, but none of
them has been tested with it.
| name | description |
|---|---|
bom-radar |
Displays the Australian BoM rainfall radar for the past 90 minutes and the radar forecast for the next 90 minutes as an overlay on the map. |
buienradar |
Displays buienradar.nl as an overlay on the map |
You can find more plugins using the ha-map-card-plugin topic.
The leaflet-extras has a nice list of available tile layer providers.
git clone git@github.com:StrausbergAutomationWorks/LiveTrackMapCard.git
This project uses devenv.sh.
- Install devenv
devenv shelland thenwatchordevenv shell watchto immediatly drop into a watched shell.
npm installnpm run build(npm run watchto update on change)
- All plugins should implement the
Pluginclass. SeePlugin.jsandPlugin.d.ts. - For a concrete example, see
CircleTestPlugin.js. - Typescript example: see bezmi/ha-map-card-plugin-bom-radar.
- For an example HACS plugin installation: see
buienradar.
Tag your Github repo with ha-map-card-plugin for discoverability.
These are about ha-map-card, the card this one is derived from, and are kept here as its credits. Problems with this card belong in this repository's issues, not in ha-map-card's threads.
- home-assistant community: map-card: a slightly improved map-card, the discussion topic for ha-map-card.
- nathan.gs: Map Card, a new leaflet based map with WMS and other advanced features
- nathan.gs: Map Card, displaying Weather and Other Tile Layers
- userbag.co.uk: Home Assistant Exploring location history
- leaflet.js: third party plugins