Skip to content

Changelog

[1.8.0] — 2026-08-11

Added

  • 11 new languages: Czech, Slovak, Hungarian, Romanian, Bulgarian, Ukrainian, Hindi, Swedish, Danish, Finnish, and Norwegian (Bokmål) — chosen to match the language coverage the underlying ha-parcel-integrations carrier integrations themselves recently added (reported in #13 by peternijssen, who maintains several of them). The card now supports 19 languages in total.

Fixed

  • Repository description was stale — still read "dutch parcels card for home assistant" despite the card supporting 22 international carriers for a while now (#12).

[1.7.0] — 2026-08-11

Added

  • custom_name_scope split into three real scopes — device (browser-only, unchanged), me (renamed from shared: your own Home Assistant account, synced across your own devices), and new everyone (now the default): saved instance-wide via Home Assistant's frontend/get_system_data/set_system_data/subscribe_system_data websocket calls, with live updates — no refresh needed to see a name someone else just added on another device. Reading is open to every user; adding or editing a name requires an administrator account (enforced by Home Assistant itself), so non-admin users see existing shared names read-only. Needs Home Assistant core ≥ ~2025.12 (when the system-data API was added); older cores just show no shared names rather than erroring. shared is still accepted as a legacy alias for me. This follow-up to v1.6.1's me-only "For everyone" came directly out of the discussion on #9 — a single option that was actually just "synced to my own account" was genuinely misleading once someone had two different HA logins in the same household.
  • sort_order option (auto / newest_first / oldest_first) — fixes #11: In Transit and the upcoming half of Sent used to sort the same "most recent first" way as Delivered, putting the parcel arriving furthest in the future above the one arriving today. auto (the default) now sorts soonest-first for anything not yet delivered and most-recent-first for Delivered; the other two options pin one direction everywhere for anyone who'd rather it not change per tab. Parcels with no usable date always sort to the bottom regardless of direction now, instead of jumping to the top the way the old || 0 fallback did once the comparison flipped.
  • group_by_carrier option (default true, unchanged visual behaviour) — set to false for one flat list sorted purely by sort_order, interleaving parcels from every carrier directly by date instead of grouping all of one carrier's parcels into a contiguous section before the next carrier's. Carrier sections (when grouping is on) aren't in a fixed order either — whichever carrier's next parcel is soonest gets shown first, a side effect of the sort_order fix above rather than a separate feature.

Fixed

  • 12-hour clock shown regardless of the Home Assistant profile's 24-hour preference — fixes #10. The card only ever passed hass.language to toLocaleTimeString, ignoring hass.locale.time_format entirely, so English-language profiles always got a 12-hour clock. time_format has four possible values (12/24/language/system), and only 12/24 have a fixed answer — language means "by the display language's own convention" (en-US is 12h, en-GB/nl/de are 24h) and system means "by the browser's own locale," neither of which a simple switch on the language code can resolve correctly. Fixed by mirroring Home Assistant's own frontend algorithm (src/common/datetime/use_am_pm.ts): probe Intl with a known 22:00 timestamp and check whether it rendered as "10" (12h) or "22" (24h), rather than guessing from the language alone.

[1.6.1] — 2026-08-10

Fixed

  • v1.6.0 asset was stale for existing HACS installs — the v1.6.0 release's uploaded file was overwritten in place (via gh release upload --clobber) three separate times while the custom parcel names feature and its "shared" scope option were being built, all under the same version tag. HACS only re-downloads a release when it sees a new version number, not when an existing tag's asset content changes — so anyone who had already updated to v1.6.0 kept the very first upload (Nova Post/Delhivery/SunYou only, no custom names at all), confirmed live by fetching the actually-served file and finding no trace of custom_name_scope. No code changed here; this release exists purely to give HACS a genuinely new version number to fetch.

[1.6.0] — 2026-08-10

Added

  • Custom parcel names — a small "+ Add name" control in each parcel's detail panel lets you give it a short label of your own (e.g. "Birthday gift") instead of just a tracking code (requested in #9). New custom_name_scope option controls where names are saved: device (default) uses the browser's local storage — simple, but per-device only; shared uses Home Assistant's own per-user storage (the same frontend/get_user_data/frontend/set_user_data websocket calls HA's own frontend uses for small preferences), so a name shows up on every device signed into that HA account — the natural choice for a household sharing one login; off hides the control entirely.
  • Nova Post, Delhivery and SunYou carrier support — three new carrier types (nova_post, delhivery, sunyou), all account-less "hub" carriers identical in pattern to Helthjem/Dynalogic: tracking code only, no account, no postal code, no outgoing/letters support. Nova Post and Delhivery are both brand-new ha-parcel-integrations repos (added 2026-08-10); SunYou's integration appeared later than an earlier speculative asset batch for it, so its wiring here was verified fresh against the actual current ha-sunyou code rather than reused unchecked.
  • Nova Post — ha-parcel-integrations/ha-nova-post, brand red #ed1c24 (confirmed against the official Wikimedia SVG and the repo's own bundled brand icon). Ukraine's largest private courier network (Nova Poshta).
  • Delhivery — ha-parcel-integrations/ha-delhivery, brand red #ed1b36 (pixel-sampled from the repo's own bundled brand icon — genuinely close to Nova Post's red, a real coincidence of two red-branded carriers added in the same batch). India-based logistics company.
  • SunYou — ha-parcel-integrations/ha-sunyou, brand green #29a03a (pixel-sampled from SunYou's own "SUNYOU" wordmark logo). China-based cross-border courier (SYPost).

[1.5.8] — 2026-08-05

Fixed

  • DHL not auto-detected — Home Assistant never renames an entity_id when an integration's translation text changes later, so an account set up before ha-dhl-nl's 2026-07-02 wording pass (which renamed "Binnenkomende pakketten" to "Inkomende pakketten") kept the old entity_id (sensor.dhl_<user>_binnenkomende_pakketten) forever — but the card's detection only recognized the current wording, so it silently showed "no sensors found" even though the sensor was real (reported in #8). Added binnenkomende_pakketten to CANONICAL_SUFFIXES so this is recognized for every carrier, not just DHL — an audit of every carrier's full translation history found this exact rename happened only for DHL and DPD (DPD was already covered by its own preset override), on the same day, and nowhere else — so no other carrier is at risk of this specific issue.

[1.5.7] — 2026-08-05

Added

  • 8 new carriers — PostNord, Sameday, Swiss Post, Planzer, Austrian Post, Helthjem, Dynalogic and Budbee. All follow the same account-less "hub" pattern as GLS/Dragonfly/ Trunkrs/Cainiao/Hermes/Packeta/Correos (single config entry, no login, a track_parcel service with a tracking_code field), verified directly against each integration's current source rather than assumed from the naming pattern. Budbee is the one exception in this group — it has real outgoing_parcels/outgoing_delivered_parcels sensors upstream, so it tracks sent parcels too, like Vinted Go. Austrian Post's underlying Home Assistant domain is oesterreichische_post, not austrian_post — sensor auto-detection accounts for that. PostNord, Planzer and Dynalogic are wordmark-only brands with no distinct pictorial mark, so they use the generic package icon rather than an invented one; the rest have their own branded icon, van animation and banner, built from each carrier's real logo. Swiss Post and Austrian Post are also now wired to their real upstream phu: icons.

[1.5.6] — 2026-07-31

Fixed

  • Missing PHU icons for Cainiao, Trunkrs and Vinted Go — the card's phu: icon map (getDefaultIcon()) was never updated when these carriers were added, so they always fell back to the generic mdi:package-variant-closed icon even for users with custom-brand-icons installed and even though a real icon exists for all three. Wired up now. Hermes, Packeta and Correos still fall back to the generic icon — no phu: icon exists for them upstream yet; icons have been submitted (custom-brand-icons#1395) and will be wired up here once merged.
  • Single-carrier banner cropping (Trunkrs, DPD and others) — .header-animation used background-size: cover, which crops to fill a container whose width changes with dashboard zoom/screen size while its height stays fixed at 150px. Depending on the current aspect ratio this could crop either the sides (cutting off e.g. the "s" in "Trunkrs") or the top/bottom (DPD), inconsistently. Changed to contain, matching every other image in the card — the full banner is now always fully visible.
  • Packeta logo badge cut off and mis-centered — packeta-logo.svg's content group was positioned so it extended 24px below the declared canvas height (clipped) and was off-center on both axes. Recentered.

[1.5.5] — 2026-07-31

Added

  • 6 new languages — German, French, Spanish, Italian, Polish and Portuguese join English and Dutch. The card has always picked its language automatically from Home Assistant's own UI language (hass.language), so nothing to configure; any language not yet covered still falls back to English as before. These 6 are AI-drafted from the English source text and marked as such internally until a native speaker has reviewed them — see translations/README.md if you'd like to help confirm one or add another.
  • Community-contributable translation format — translations moved out of a single inline object in hki-parcels-card.js into one translations/<lang>.json file per language, plus a small script (scripts/build_translations.py) that validates every file has exactly the same keys as en.json and bundles them back into the card (still a single self-contained file at runtime — no added network dependency). A new CI check (validate-translations.yml) fails a PR if a translation file is incomplete or the bundle is out of sync, instead of that shipping unnoticed.

Changed

  • GLS and Trunkrs track_parcel field renamed to tracking_code — both integrations standardized their service's tracking-number field on tracking_code on 2026-07-30 (ha-gls v1.3.0, ha-trunkrs v0.10.x), deprecating the old parcel_no/trunkrs_nr names. The old names still work today as an alias, but the card now calls the service with the new field name ahead of that alias eventually being removed.

[1.5.4] — 2026-07-30

Added

  • Vinted Go carrier support — new carrier type (vinted_go), backed by ha-parcel-integrations/ha-vinted-go, tracking parcels bought and sold through Vinted's own shipping service. Unlike every other account-less carrier added recently (Hermes, Packeta, Correos), Vinted Go is account-based — you log in with an e-mail address and a verification link, no password and no tracking-code entry — so it follows the postnl_v4/dhl/dpd pattern instead: no track_parcel service and no "+ Add parcel" control, since every parcel tied to the account already appears automatically. It's also the only account-based carrier in the card that tracks both incoming and outgoing parcels (supports_outgoing: true), matching how Vinted itself works as a peer-to-peer resale marketplace. There is no next_delivery/ETA sensor for this integration at all. Full custom branding included: the real "Vinted Go" script wordmark (rasterised from vintedgo.com's own /assets/logo.svg), an animated van and step icons hue-shifted from the shared master illustration to the confirmed brand teal #007782 (vintedgo.com's own --primary-default CSS custom property).

[1.5.3] — 2026-07-29

Fixed

  • Correos banner still showed "GLS." — the banner asset is supposed to be the carrier's own logo centered on a plain white background (that's how every other carrier's banner works: Hermes shows "Hermes", Packeta shows its red "Packeta" badge), but Correos' banner was left as a straight hue-shifted copy of GLS's own "GLS." wordmark banner, just recoloured to Correos blue — so it still visibly read as the wrong brand. Replaced with Correos' real crown-and-horn mark, centered on white.

[1.5.2] — 2026-07-29

Added

  • Packeta and Correos carrier support — two new carrier types (packeta, correos), both account-less (tracking number only, no postal code) and using the same canonical schema as every other carrier — account detection, entity templating and the editor's carrier-type dropdown all support them like any other carrier out of the box.
  • Packeta — ha-parcel-integrations/ha-packeta, tracking the Central-European pickup-point and locker network (CZ, SK, HU, PL, RO), also known as Zásilkovna, by its "Z" tracking code.
  • Correos — ha-parcel-integrations/ha-correos, tracking Spain's national postal service by tracking code.
  • Both have full custom branding to match every other carrier: the real official logo/mark (Packeta's red badge lockup pixel-sampled from tracking.packeta.com; Correos' crown-and-horn mark taken directly from its official 2019-rebrand SVG), an animated van and step icons produced by hue-shifting the same shared master illustration every other carrier's art already uses, and a translated account-less help string (NL + EN).
  • Neither integration's public tracking exposes an expected delivery time — the next-delivery sensor and Deliveries calendar stay empty for these two carriers, same as already noted for some other account-less carriers.

[1.5.1] — 2026-07-25

Added

  • show_raw_status option — off by default, the card shows a generic translated status label ("In transit", "Delivered", ...) that reads the same across every carrier. Turning this on shows each carrier's own raw status text instead (e.g. GLS's "Onderweg - geladen voor aflevering") when the integration provides one, falling back to the generic label for any parcel without it. Requested via a GitHub Discussion by a GLS user (raw_status was already part of the canonical parcel schema and already shown as a secondary detail line — this makes it usable as the primary one too, without needing any integration-side change).

[1.5.0] — 2026-07-25

Five new carriers, a carrier overview popup, an in-card "+ Add parcel" control, and a round of branding/UX fixes accumulated across the v1.5.0 beta cycle (b1–b5), promoted here to a stable release.

Added

  • Trunkrs, Cainiao, Dragonfly and Hermes carrier support — four new carrier types (trunkrs, cainiao, dragonfly, hermes), all account-less (tracking number only, plus a postal code for Trunkrs) and using the same canonical schema as every other carrier — account detection, entity templating and the editor's carrier-type dropdown all support them like any other carrier out of the box.
  • Trunkrs — ha-parcel-integrations/ha-trunkrs. Early-release integration upstream; currently only maps the SHIPMENT_DELIVERED status, everything else reports unknown.
  • Cainiao — ha-parcel-integrations/ha-cainiao, for cross-border parcels (AliExpress, Temu, Shein, ...) before they reach a local carrier.
  • Dragonfly — ha-parcel-integrations/ha-dragonfly, created by Alwin Hummels (@HummelsTech), who also maintains it standalone at HummelsTech/ha-dragonfly.
  • Hermes — ha-parcel-integrations/ha-hermes, tracking Hermes Germany ("Hermes Paket" / myhermes.de) parcels by 14-digit tracking code.
  • All four have full custom branding to match every other carrier: the real official logo (extracted as vector where possible, e.g. Hermes's from myhermes.de's own SVG), an animated van and step icons produced by hue-shifting the same shared master illustration every other carrier's art is drawn from, with the real logo (or its mark, on the smaller badges) composited onto the building sign, the transit van icon and the animated van. Accent colours were confirmed by pixel-sampling each official logo directly: Trunkrs #2ce27e, Cainiao #0066ff, Dragonfly #00a78f, Hermes #008cc3.
  • "+ Add parcel" control on the card itself — for the account-less carriers (GLS, Dragonfly, Trunkrs, Cainiao, Hermes), the card now shows a small "+ Add parcel" row. Typing a Track & Trace number and submitting calls the integration's own <domain>.track_parcel service directly, so the parcel is genuinely registered with the integration — not just added to the card's own view. For GLS and Trunkrs, which can have multiple hubs (one per postal code), the carrier's configured user value (the postal code) is passed along automatically so the parcel lands on the right hub. New show_add_parcel option (default true) hides it if you'd rather add parcels through each integration's own Configure dialog. Not available for PostNL, DHL or DPD — those integrations are account-based (they auto-sync every parcel tied to the logged-in account) and don't expose a service for registering an individual parcel by tracking number.
  • Carrier overview popup — clicking a carrier's logo in the multi-carrier combo banner opens a popup listing every item for that carrier across all four tabs (In Transit / Delivered / Sent / Letters) in one place, grouped by section with a visible divider between sections. Clicking an item expands its details (tracking number, status, delivery type, tracking link) in place, the same accordion behaviour as the main list — the popup stays open so you can keep browsing.

Changed

  • Combo banner now wraps at 4 logos per row — with more than 4 carriers configured, the combo banner previously squeezed every logo into a single row. It now wraps into multiple rows, capped at 4 per row and distributed as evenly as possible (5 → 3+2, 7 → 4+3, etc.) instead of leaving a near-empty last row.
  • CARRIER_REPO_URLS now points at the ha-parcel-integrations org instead of the original maintainers' personal repos (peternijssen/ha-postnl, -ha-dhl-nl, -ha-dpd, -ha-gls, HummelsTech/ha-dragonfly). Those integrations were moved into the org to be maintained together and are now ahead in version there — peternijssen/ha-gls in particular has had no release since the move. This only affects the "integration not found" link shown in the editor when no sensors are detected yet; already-working sensor auto-detection is unaffected. README and docs links updated to match.
  • Consistent PostNL labelling — the postnl and postnl_legacy carrier presets now use the same "PostNL (<v4.x)" / "PostNL (ArjenBos)" labels the editor's carrier-type dropdown already showed, instead of the older "PostNL (peternijssen v3.x)" / "PostNL (arjenbos)" text. Since this label is also the default carrier name shown on the card itself, the two were previously inconsistent depending on where you looked.
  • Updated screenshots throughout README and docs — refreshed to the current branding and added new ones for the carrier overview popup, the 4-per-row combo banner wrap, and the 4-step delivery tracker with an expanded parcel detail panel — none of these had a screenshot before. Example data in the new screenshots (company names, tracking numbers) has been anonymised.

Fixed

  • DHL's banner was cropped at the edges in the multi-carrier combo banner — the DHL logo artwork extended edge-to-edge with no margin, unlike every other carrier's banner (which centres its logo with generous padding), so the side panels in the combo view sliced straight through it. Rebuilt with the same centred, padded layout as the others.
  • Hover on a combo-banner logo flickered / repeatedly zoomed in and out — the banner is built purely from static carrier config and never actually changes, but it was being torn down and rebuilt from scratch on every hass update tick regardless, resetting :hover state mid-hover. The rebuild is now skipped once the banner is already showing correctly; a config change still triggers a full rebuild as normal.
  • Carrier popup showed the wrong icon/colour for carriers with zero current parcels — the popup header derived its brand icon and accent colour from the first matching parcel item, so a carrier with nothing currently in transit/delivered/sent (e.g. "0 pakketten") had no item to read from and silently fell back to the generic default icon and colour instead of the carrier's own configured branding. The header now reads the icon/colour from the carrier's own config first, falling back to an item only if no matching carrier config is found.
  • Dragonfly was missing from the PHU icon map — custom-brand-icons now ships a phu:dragonfly icon alongside the existing phu:dpd and phu:gls-group ones, but it had never been added to this card's own carrier→PHU lookup table, so it always fell back to the generic mdi icon even when custom-brand-icons was installed. Added.

Deprecation notice

  • PostNL (<v4.x) (type: postnl) will no longer be supported starting from HKI Parcels Card v2.0 — migrate to postnl_v4 ("PostNL") before then.
  • PostNL (ArjenBos) (type: postnl_legacy) will also be removed starting from v2.0, unless arjenbos/ha-postnl receives an update of its own before that point.
  • v2.0 is also planned to bring broader internationalisation (more languages, more carriers selectable by country) — the PostNL/ArjenBos removals above will ship together with that work, not before.

[1.4.1] — 2026-07-09

Fixed

  • DPD's delivered-outgoing sensor was never auto-detected — DPD's slug_first_suffixes preset hardcoded outgoing_delivered: null ("unsupported"), left over from before peternijssen/ha-dpd 2.5.0 added its own outgoing_delivered_parcels sensor. That hardcoded null short-circuited detection before it ever reached the English/Dutch fallback list, so a real sensor like sensor.dpd_<account>_uitgaande_bezorgde_pakketten was invisible even though the same fallback logic already covers exactly that suffix. Removed the override — DPD now falls through to the same generic detection as every other carrier without one.

[1.4.0] — 2026-07-09

Added

  • 4-step delivery tracker — selecting a parcel shows a labelled progress row (Registered · Sorting centre · Out for delivery · Delivered), each step with its own carrier-branded icon and a checkmark badge once that step is actually done, plus a larger illustration and a time/date detail for the current step. The hero info always includes the expected delivery window (if known) alongside whatever else is shown for that step (e.g. "Aangemeld om 08:15" and "Verwachte bezorging: Morgen tussen 09:00 en 11:00"), using the same relative-day wording as the parcel list; nothing is shown once a parcel is actually delivered — there's nothing left to expect.
  • Registered / sorting-centre times need the integration's optional "include history" setting to have data; out for delivery and delivered work without it
  • The existing driving-van animation is used for "out for delivery"; new illustrations for the other three steps, per carrier (PostNL, DHL, DPD, GLS)
  • Parcels with a status outside this happy path (at_pickup_point, returning, problem, unknown) or on a non-canonical schema (legacy PostNL, single-entity, custom) keep the previous plain van/chip + status-text treatment
  • Dynamic combo banner — the no-selection banner for 2+ carriers now shows only the carriers you've actually configured, as full-width equal panels with a brand-colour tint, instead of a static image listing every possible carrier
  • Branded van animations for DHL, DPD and GLS — each carrier's own van, recoloured from the original PostNL animation instead of a generic colour chip
  • GLS brand assets — banner and van animation using GLS's exact brand blue (#061ab1)
  • Expected delivery window always wins in the parcel list — a parcel still in transit shows its planned delivery window ("Today between 16:00 and 18:00", "Expected on 12 Jul between...") instead of a bare date; delivered parcels are unaffected
  • Adding the card now auto-populates every installed carrier, not just a fixed PostNL + DHL example — getStubConfig now receives the live hass object (as Home Assistant provides when the card is first added to a dashboard) and runs the same account-detection used by the editor across every supported carrier type (PostNL, DHL, DPD, GLS), pre-filling a fully configured carrier entry — name, icon, colour, and all detected sensor entities — for each account found. Falls back to the old static PostNL + DHL example only when nothing can be detected yet (e.g. a fresh HA instance with no carrier integrations configured).
  • days_back is now inferred from your actual delivered-parcel history on first add — looks at every auto-populated carrier's delivered sensor, finds the oldest currently-visible delivered parcel, and uses the largest value across all carriers instead of a flat default of 90. This is an approximation based on what's actually visible right now, not each integration's own configured retention setting — a Lovelace card has no supported way to read another integration's stored config-entry options (e.g. DHL/PostNL's delivered_filter_amount), since that lives in the integration's own options flow, not in any entity state or attribute. Falls back to 90 when there's no delivered history yet.

Fixed

  • Duplicate parcels when switching a carrier's type — could leave a carrier silently re-reading another carrier's sent/delivered sensor under its own name; existing saved configs self-heal automatically
  • GLS postal code input — "1234 AB" now sanitises to "1234ab" instead of "1234_ab"
  • DHL brand colours corrected — logo and banner recoloured to DHL's exact official hex values (#FFCC00 yellow / #D40511 red) instead of the original artwork's approximation; DHL's mark is kept on its yellow field rather than as a free-floating shape, matching how DHL's logo is actually used
  • Account detection and entity auto-detection now work regardless of language, and regardless of <account>_<carrier> vs. <carrier>_<account> ordering, for every carrier — replaced the old single hardcoded-English-suffix guess with a universal English/Dutch suffix list for every slot (incoming/delivered/outgoing/outgoing delivered/letters), checked against real state in both possible orderings, on top of any carrier-specific override (e.g. DPD's own Dutch word choices still take priority as the primary guess). Two concrete cases this fixes:
  • GLS wasn't being auto-detected at all on a Dutch-language install — account detection only ever tried the literal English incoming_parcels suffix for GLS (unlike DPD, which already had its own Dutch override), so a real sensor.gls_1363ln_inkomende_pakketten was invisible and the postcode had to be typed in manually every time.
  • DHL's delivered-outgoing sensor guessed wrong — a has_entity_name entity's entity_id is derived from whichever language Home Assistant was displaying when it was first created, not the English translation key, and always lands in the current <device-name>_<entity-name> ordering regardless of what ordering that account's older, pre-has_entity_name sensors use. On one real installation this meant a carrier-first, Dutch entity coexisting with account-first, English sensors on the very same account — auto-detection picked a non-existent entity and the Sent tab's Delivered section stayed empty even though the sensor had data.

Changed

  • Images reorganised into per-carrier folders (images/postnl/, images/dhl/, images/dpd/, images/gls/, images/shared/) instead of one flat folder of prefixed filenames

[1.3.0] — 2026-07-07

Added

  • GLS carrier support — new gls carrier type for peternijssen/ha-gls. Supports the incoming and delivered sensors (auto-detected as sensor.gls_<postcode>_incoming_parcels / sensor.gls_<postcode>_delivered_parcels), carrier branding, and PHU icon (phu:gls-group) when custom-brand-icons is installed. GLS has no sender/account concept, so the Sent tab's outgoing fields are hidden for this carrier — the editor shows an explanatory note instead.

[1.2.1] — 2026-07-04

Added

  • PostNL outgoing delivered parcels — the "Sent" tab's Delivered section now works with peternijssen/ha-postnl ≥ 4.3.1, which adds the sensor.*_postnl_outgoing_delivered_parcels sensor. The card was already templating this entity; it now has an actual sensor to connect to. No configuration change required — the sensor is picked up automatically when the account field is filled in.

[1.2.0] — 2026-07-04

Added

  • Media browser button on URL fields — every URL input field (logo, vehicle GIF, banner, placeholder image) now has a Browse button. It opens a custom media browser overlay that uses the HA WebSocket API (media_source/browse_media) to browse the media library. Folders are clickable; a Back button navigates up. Images from the www folder are served via /local/. The selected URL is filled in automatically.
  • Integration link when carrier not found — when no sensors are found for a carrier, the editor shows a direct link to the relevant integration repository instead of blank input fields. The ✎ button allows manual entry at any time.
  • "Default" colour button for carrier and header colours — resets the colour to the carrier or header default. The button is always visible: active when a custom colour is set, greyed out when the default is already active.
  • Editable hex colour value — a text field next to the colour picker shows the current hex value (#rrggbb) and accepts direct input. Input is validated before the colour is saved.

Changed

  • postnl_v4 carrier label simplified — the label "PostNL (peternijssen v4.x)" has been shortened to "PostNL".
  • Carrier dropdown order updated — new order: PostNL · DHL · DPD · PostNL (<v4.x) · PostNL (ArjenBos) · Custom.

Fixed

  • Dual sensor naming schemes supported — account auto-detection now recognises both sensor.<carrier>_<user>_* (DPD style) and sensor.<user>_<carrier>_* (PostNL/DHL style). Entity fields are populated using the correct scheme automatically.
  • DPD sensors auto-detected — the DPD integration uses Dutch sensor names (binnenkomende_pakketten, bezorgde_pakketten, uitgaande_pakketten). Detection and entity generation now use these names for DPD.
  • Free text input in the account field — the account field now accepts any characters (including ., @, -) while typing; sanitisation to underscores happens only when the field loses focus.
  • Logo, banner and vehicle GIF fields always visible — these fields now use a plain text input with a live image preview instead of ha-selector image:{}, which did not render reliably inside the card editor Shadow DOM.
  • Banner with apostrophe in folder name now renders correctly — background-image now uses double quotes so that an apostrophe in the path (e.g. Logo's) does not break the CSS string.
  • Default placeholder image when field is empty — when placeholder_image is not set, the card now falls back to dutch-parcels.png from the repository instead of showing nothing.
  • Advanced sensor fields stay visible after HA re-render — the open/closed state of the advanced sections is now managed by LitElement instead of the native <details> element, preventing the state from being lost on each re-render.
  • Advanced sensor fields always editable — fields now use plain <input> elements instead of ha-textfield, which did not render correctly in some HA environments.

[1.1.4] — 2026-06-30

Fixed

  • Letter image matching rewritten — now works across all ha-postnl versions — the previous approach derived an image entity prefix from the letters sensor name and matched by slugified date title. This broke in ha-postnl v4.1.0 which changed the image entity naming scheme from image.<user>_postnl_letter_<date> to image.postnl_<user>_brief_<date> (different order, Dutch "brief" instead of English "letter"). The matching now uses the unique id attribute (mailitem-xxx) that ha-postnl sets on both the letter item and its image entity, making it version-independent. Placeholder entities (unavailable state or "placeholder" in entity ID) are still excluded.

[1.1.3] — 2026-06-30

Fixed

  • Placeholder image entities are now skipped when matching letter images — ha-postnl v4.x creates both a real scan image and a placeholder image entity per letter (e.g. image.postnl_letter_30_juni and image.postnl_letter_30_juni_placeholder). The matching loop now skips any entity whose ID contains "placeholder", so only the real scan image is assigned to the letter.
  • "Geen afbeelding" text now always shows when a letter image fails to load — previously, if letterThumb was set to a URL that failed to load in the browser, onerror hid the <img> element but the "geen afbeelding" fallback text was never shown (because letterThumb was truthy). The "geen afbeelding" div is now always rendered for letters and hidden via CSS; onerror on the image makes it visible when the image fails.

[1.1.2] — 2026-06-30

Fixed

  • Letter images no longer flicker — ha-postnl v4.x stores letter images as HA image.* entities whose entity_picture URL contains a time= timestamp that changes on every HA scan. Previously, updateContent() rebuilt the entire list DOM on every hass tick, destroying and recreating <img> elements even when no parcel data changed. The list is now only rebuilt when items actually change (key, delivered status, or status message). Tab switches and parcel selection always force a re-render as before.
  • Letter images now display correctly — when a HA image.* entity for a letter could not be matched, the card returned an empty thumbnail instead of falling back to the image_url that ha-postnl v4.x provides directly in the sensor attributes. The card now always falls back to image_url when image_entity_picture is unavailable.

[1.1.0] — 2026-06-29

Added

  • Three distinct PostNL carrier types — the single postnl type has been split into three explicitly labelled options to eliminate schema guesswork:
Type Label Integration Schema
postnl_v4 PostNL (peternijssen v4.x) peternijssen/ha-postnl ≥ 4.0.0 canonical
postnl PostNL (peternijssen v3.x) peternijssen/ha-postnl ≤ 3.x legacy
postnl_legacy PostNL (arjenbos) arjenbos/ha-postnl single_entity

Existing configurations are not broken — type: postnl still maps to the v3.x legacy preset. To use the v4.x canonical schema, change type to postnl_v4.

  • Default carrier in the editor is now PostNL (v4.x) — clicking "Add carrier" opens the v4.x preset by default, since that is the current recommended integration.

Changed

  • Editor dropdown now shows all three PostNL options with explicit version labels.
  • Editor intro text updated to guide users to the correct PostNL type.

[1.0.9] — 2026-06-29

Fixed — ha-postnl v4.1.0 compatibility

  • Status labels now show correctly for PostNL v4.x — ha-postnl v4.x returns uppercase status enums (IN_TRANSIT, OUT_FOR_DELIVERY, DELIVERED, etc.). The card's status label map used lowercase keys, so every status fell through and displayed as raw enum text. Fixed by lowercasing the enum before lookup; DHL and DPD are unaffected.
  • Delivered PostNL parcels no longer disappear — with schema: legacy, the cutoff filter looked for delivery_date or planned_date fields that do not exist in ha-postnl v4.x data (which uses delivered_at and planned_from instead). The result was epoch (1 Jan 1970), older than any cutoff, causing all delivered parcels to be silently discarded. The legacy normalizer now maps delivered_at → delivery_date and planned_from → planned_date as a fallback.
  • Dutch status message shown in detail panel — ha-postnl v4.x provides a raw_status field with the original Dutch status text. This is now used as status_message in the legacy normalizer instead of the enum string.
  • CANONICAL_DELIVERED_STATUSES extended — added uppercase 'DELIVERED' alongside lowercase 'delivered' so the enum-based delivered fallback works correctly for both ha-postnl v4.x (uppercase) and other integrations (lowercase).

[1.0.8] — 2026-06-29

Fixed

  • Delivered letters no longer appear in the Bezorgd tab — if ha-postnl reports the same letter in both entity_delivered (parcels sensor) and entity_letters, the duplicate is now removed from the Bezorgd tab. Letters are exclusively shown in the Post tab (upcoming section or delivered section). The same deduplication also prevents any sent items that appear in multiple sensors from leaking into the Bezorgd tab.
  • Letters without a delivery date are no longer silently dropped — previously, a letter with no delivery_date was converted to epoch (1 Jan 1970) which is older than the cutoff, so it was discarded entirely. Letters without a date are now placed in the Post → upcoming section.

[1.0.7] — 2026-06-29

Fixed

  • Auto account detection now works without a username prefix — sensors named sensor.postnl_incoming_parcels (without a <user>_ prefix) are now correctly detected and the card generates matching entity names (sensor.postnl_incoming_parcels, sensor.postnl_delivered_parcels, etc.). Previously the auto-detect regex required a username prefix and silently returned nothing for prefix-free sensor setups, causing the editor to show "No sensors found" and leaving all entity fields empty.

[1.0.6] — 2026-06-29

Fixed

  • Advanced sensor fields now accept free text — the entity pickers in "Advanced: override sensors" are replaced with text fields so you can type any entity name, including sensors that do not yet exist in Home Assistant. Previously the ha-selector entity picker only allowed selecting from entities already present in HA.
  • Carrier colors applied to individual parcel items — the status icon, "Open Tracking" button, expand chevron and delivery-complete icon in the animation block now use the carrier's own colour. Previously these elements always used the global orange accent colour regardless of carrier.
  • PHU icons apply to existing configurations — carrier icons are now resolved at render time. If the custom-brand-icons integration is installed after the card was already configured, phu:postnl / phu:dhl / phu:dpd now activate automatically without reconfiguring the carrier.

[1.0.5] — 2026-06-28

Added

  • Split "Letters" tab — the Letters tab is now divided into two clearly labelled sections: Still to be delivered and Delivered. Previously, once a letter was marked as delivered it moved out of the Letters tab entirely and into the general "Delivered" tab alongside parcels. Delivered letters now stay in the Letters tab, in their own section, while still respecting days_back for how long they remain visible.
  • Split "Sent" tab — the Sent tab now has the same two-section layout (Still to be delivered / Delivered) as Letters. This introduces a new optional sensor field per carrier, entity_outgoing_delivered, alongside the existing entity_outgoing. Unlike Letters, the split here is based purely on which sensor reports the parcel (active vs. delivered), not on a date cutoff — so a delivered outgoing parcel stays visible for as long as the sensor itself reports it, regardless of age.
  • Auto-templated as sensor.<user>_<carrier>_outgoing_delivered_parcels when using the account field, same as the other sensors.
  • Configurable manually via the editor's "Advanced: override sensors" section, or via YAML.
  • postnl_legacy (single-entity / arjenbos/ha-postnl) mode is unaffected — it has no concept of a separate delivered-outgoing sensor and keeps its previous combined behaviour.

Fixed

  • Carrier colors no longer default to orange for every carrier — appearance fields (carrier section headers, status chips, icons) now fall back to each carrier's own preset colour (PostNL orange #ed8c00, DHL yellow #ffcc00, DPD red #dc0032) when no custom color is set on the carrier. Previously, any carrier without an explicit color override fell back to a single hardcoded orange default, so DHL and DPD looked identical to PostNL out of the box. The visual editor already showed the correct preset colour in its preview; the card itself did not.
  • Carrier colors applied to individual parcel items — the status icon, "Open Tracking" button, expand chevron and delivery-complete icon in the animation block now all use the carrier's own colour. Previously these elements always used the global accent colour (orange) regardless of carrier.
  • PHU icons now apply to existing configurations — previously, phu:postnl / phu:dhl / phu:dpd were only selected at the moment a carrier was added in the editor. If PHU icons were installed after the card was already configured, the saved mdi:package-variant-closed value would always win. The card now resolves the icon at render time, so PHU icons activate automatically without reconfiguring the carrier.

[1.0.3] — 2026-06-26

Added

  • PHU icon auto-detection — if the custom-brand-icons HACS integration is installed, carrier icons default to phu:postnl, phu:dhl and phu:dpd. Falls back to MDI icons when PHU is not available.
  • Image selector for logo and banner — the appearance override section now uses the Home Assistant image selector (ha-selector with { image: {} }) for Logo and Banner. This adds a Browse button that opens the local HA media library, in addition to manual URL input. The vehicle GIF field remains a URL-only input since GIF animations are typically not stored in the media library.

[1.0.2] — 2026-06-26

Fixed

  • Minor bug fixes.

[1.0.1] — 2026-06-26

Added

  • Multilingual UI — the card and editor follow the Home Assistant language setting (hass.language). Dutch (nl) and English (en) are fully supported; any other language falls back to English.
  • Sensor auto-detection in the editor — when opening a carrier, the card searches for matching sensors automatically:
  • Exactly one account found → auto-filled with a confirmation badge
  • Multiple accounts found → dropdown to choose from
  • None found → manual input with automatic sanitization (special characters replaced by _)
  • A pencil button allows overriding the auto-detected value at any time
  • show_tracking_link option — hides the "Open Tracking" button per carrier detail panel. Useful for kiosk and touch-only setups where an accidental tap would open a full-screen browser page. Configurable via the editor (Display Options) or YAML (show_tracking_link: false).
  • Improved appearance override — the advanced appearance panel now uses:
  • ha-icon-picker — native HA icon search picker with live preview
  • Color swatch — visual color picker showing the hex value and a live icon preview in the chosen color
  • URL fields with image preview — logo, vehicle GIF and banner show a thumbnail as soon as a URL is entered

[1.0.0] — 2026-06-25

First stable release.

Features

  • Multi-carrier support: PostNL, DHL and DPD in a single card
  • Automatic sensor templating based on the account field (sensor.<user>_<carrier>_incoming_parcels etc.)
  • Canonical schema for DHL and DPD (harmonised attribute structure with status enum, delivered bool, planned_from/planned_to, pickup_point)
  • Legacy schema for PostNL v3.x (peternijssen/ha-postnl)
  • PostNL (Legacy) mode for arjenbos/ha-postnl — single combined entity
  • Tabs: In Transit / Delivered / Sent / Letters
  • Parcel detail panel with tracking number, delivery method and tracking link
  • Letters tab (PostNL) with automatically matched image.* entities per date
  • Letter scan popup for full-size image view
  • Animation block with vehicle GIF or carrier chip when a parcel is selected
  • Customisable appearance per carrier: logo, GIF, banner, icon, colour
  • Layout order configurable via editor
  • Visual editor with automatic sensor preview and collapsible sections
  • Based on jimz011/hki-elements