From f90a0091fd8ecb019f1474cd649faa25a088f514 Mon Sep 17 00:00:00 2001 From: HangerThem Date: Fri, 18 Sep 2026 12:41:31 +0200 Subject: [PATCH] edit(tessera): add new cover --- .../posts/tessera-privacy-first-card-wallet.md | 6 ++++-- public/posts/tessera-logo.png | Bin 0 -> 14300 bytes 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 public/posts/tessera-logo.png diff --git a/content/posts/tessera-privacy-first-card-wallet.md b/content/posts/tessera-privacy-first-card-wallet.md index ac38749..48d23a6 100644 --- a/content/posts/tessera-privacy-first-card-wallet.md +++ b/content/posts/tessera-privacy-first-card-wallet.md @@ -5,8 +5,8 @@ date: 2026-09-18 12:00:00 +0200 updated: 2026-09-18 12:30:00 +0200 category: Projects tags: [projects, pwa, privacy, webdev] -coverImage: tessera-homepage.png -coverImageAlt: Screenshot of Tessera's homepage showing a list of saved loyalty cards with their barcodes. +coverImage: tessera-logo.png +coverImageAlt: Logo of Tessera, simple grid of 2x2 squares. --- ## The Problem @@ -31,6 +31,8 @@ That's the whole thing. No account required. No server involved. All data lives in IndexedDB in your browser. Once installed as a PWA, it works fully offline. +![Screenshot of Tessera's homepage showing a list of saved loyalty cards with their barcodes.](tessera-homepage.png) + ![Screenshot of opened card detail](tessera-active_card.png) ![Screenshot of Tessera's form for adding a new card](tessera-new_card_form.png) diff --git a/public/posts/tessera-logo.png b/public/posts/tessera-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..60af59b628e00399716a4b6d5d9f5dda114221ae GIT binary patch literal 14300 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 T$pS&>xgO9`*Hz0_#ozcpRfg-8 literal 0 HcmV?d00001