Preskočiť na obsah

Changelog

Changelog

Vybrané najdôležitejšie zmeny z posledných verzií. Pre úplné verzie API a pravidlá pre spätne nekompatibilné zmeny (Breaking-Change-Policy) si pozrite Verziovanie API & LTS pravidlá.

Podrobné zmeny jednotlivých endpointov: Špecifikácia OpenAPI a interaktívna API referencia.


2026-10 · Farby v Dashboarde

  • Novinka: detailná stránka kódu má kartu Farby: popredie a pozadie ako hex hodnota, priehľadné pozadie, náhľad cez skutočnú cestu k obrázku. Kontrola je rovnaká ako pri PATCH /v1/codes/{id}: kritické dvojice vyžadujú potvrdenie, dvojice pod 1,5:1 sa nedajú uložiť.
  • Obnovenie čiernej na bielej vracia vo všetkých štyroch formátoch opäť rovnaké bajty ako bez farieb. Kódy bez farieb sa nemenia.
  • Priehľadné kódy sa vo všetkých náhľadoch Dashboardu zobrazujú na šachovnici. Podrobnosti: Farby v Dashboarde.

2026-10 · Farby v PDF a EPS

  • Novinka: qr.pdf a qr.eps vykresľujú fg a bg, ako parametre aj ako uložené farby. Čierna a akákoľvek sivá sa zapisujú ako odtieň sivej (iba čierny plát), akákoľvek iná farba ako CMYK v celých percentách, napríklad 1F4E79 ako C74 M36 Y0 K53.
  • Pozadie ako pri SVG: Akonáhle je zvolená farba, za kódom a jeho tichou zónou sa nachádza nepriehľadná plocha, biela alebo bg. bg=transparent nevykresľuje žiadnu. Názov zostáva čierny, podklad loga biely.
  • Žiadna zmena bez farieb: Bez fg/bg a bez uložených farieb poskytujú oba formáty rovnaké bajty ako predtým. PDF produktového pasu zostáva nezafarbené.
  • Obmedzenia: žiadny ICC profil, žiadne PDF/X. Podrobnosti: Farby pri tlači.

2026-09 · Statické kódy bez vyrovnávacej pamäte presmerovania, súbežné odstraňovanie

  • Zmena: Statické kódy sa už nenachádzajú vo vyrovnávacej pamäti presmerovania. Volanie ich krátkeho odkazu (redirect_url) vždy načíta aktuálny stav. Po DELETE /v1/account preto statický kód pri ďalšom volaní už nepresmeruje, predtým to trvalo až 24 hodín. Aj zmena tarify sa pri statických kódoch prejaví okamžite. Dynamické kódy sa pri vymazaní účtu odstránia ako doteraz. Vytlačené statické kódy obsahujú svoj cieľ priamo a nie sú ovplyvnené.
  • Opravené: Dve súbežné požiadavky DELETE /v1/codes/:id na rovnaký kód vrátia raz 200 a raz 404. Webhook qr.deleted sa odošle presne raz, predtým dvakrát.
  • Novinka: POST a DELETE /v1/codes/:id/logo odpovedajú s 409 (errors/conflict), ak iná požiadavka súbežne zmenila logo rovnakého kódu, a vtedy nič nezmenia. Predtým mohlo nahrané logo zostať uložené bez využitia. Dve súbežné požiadavky DELETE /v1/codes/:id/logo vrátia obe 200. Podrobnosti: Logo.

2026-09 · TypeScript-SDK 1.2.0

  • Nové v @qr3/sdk 1.2.0: client.codes.update() prijíma appearance a vracia výsledky kontroly kontrastu ako issues vo výsledku; bez nálezu toto pole chýba. client.codes.imageUrl() prijíma fg, bg a ecc. Každý kód, ktorý API vracia (get, list, create, update, batchCreate), obsahuje title a appearance.
  • Aktualizácia: npm install @qr3/sdk@latest. Python, Go a PHP budú nasledovať. Podrobnosti: SDK a CLI a Uloženie farieb v kóde.

2026-09 · Zmenený čas expirácie platí do približne jednej minúty

  • Opravené: PATCH na expires_at teraz vymaže vyrovnávaciu pamäť presmerovaní kódu. Nový čas expirácie tak začne platiť do približne jednej minúty namiesto až o 24 hodín neskôr. Predtým odstránená alebo posunutá expirácia naďalej vracala 410 až po dobu 24 hodín, a expirácia nastavená na aktuálny čas nechala presmerovanie fungovať až ďalších 24 hodín.
  • Opravené: Kód vytvorený s expires_at vyprší načas aj vtedy, ak čas expirácie nastane počas prvých 24 hodín.
  • Opravené: Ak sa kód vymaže počas nahrávania alebo odstraňovania jeho loga, POST a DELETE /v1/codes/:id/logo odpovedia s 404 a vymazaný kód nezmenia, rovnako ako už predtým PATCH.
  • Opravené: Aj statický kód, ktorého skrátený odkaz (redirect_url) bol otvorený, sa nachádza vo vyrovnávacej pamäti presmerovaní. Zmena, pozastavenie a vymazanie ho teraz tiež vymažú, nielen pri dynamických kódoch.

2026-09 · Ukladanie farieb ku kódu

  • Novinka: PATCH /v1/codes/:id akceptuje appearance s foreground_color a background_color (#RRGGBB, pozadie aj transparent). qr.svg a qr.png vykresľujú uložené farby bez akýchkoľvek parametrov; parameter dopytu ako ?fg=000000 má stále prednosť. PDF a EPS budú vykresľovať farby až v neskoršej verzii.
  • Kontrola kontrastu: Pár pod 1,5:1 vráti 422. Slabšie páry sa uložia a nahlásia v meta.issues ako warning alebo critical; transparentné pozadie je vždy critical, nikdy nie je zablokované.
  • Zlúčenie: Vynechané polia si ponechajú svoju uloženú hodnotu, null ju resetuje. Súbežné zmeny na rovnakom kóde sa už navzájom neprepíšu.
  • V každej odpovedi kódu: appearance sa nachádza v každej odpovedi kódu a vo webhookoch qr.created a qr.updated. POST, batch a import ho odmietnu s kódom 422.
  • Žiadna zmena pre existujúce kódy: Bez uložených farieb poskytuje každý kód rovnaké bajty ako predtým. Podrobnosti: Ukladanie farieb ku kódu.

2026-09 · Farby a korekcia chýb ako parametre obrázkových trás

  • Novinka: Všetky štyri obrázkové trasy prijímajú fg (farba popredia), bg (farba pozadia alebo transparent) a ecc (korekcia chýb L, M, Q, H). SVG a PNG vykresľujú farby; PDF a EPS ich prijímajú, ale vykreslia ich až v neskoršom vydaní. ecc funguje vo všetkých štyroch formátoch, logo naďalej vynucuje H.
  • Transparentné: bg=transparent poskytuje SVG bez pozadia a PNG so skutočným alfa kanálom. Podklad musí byť svetlý a tichá zóna musí zostať voľná.
  • Nikdy nie chyba: Neplatné hodnoty sa ignorujú; obrázok sa potom vráti presne tak isto, ako keby bol bez parametrov.
  • Medzipamäť: Každý účinný parameter poskytuje Cache-Control: public, max-age=300 namiesto 24 hodín predvoleného obrázka.
  • Žiadna zmena správania bez parametrov: Akýkoľvek existujúci kód poskytuje vo všetkých štyroch formátoch rovnaké bajty ako predtým.
  • K dispozícii v každej tarife. Podrobnosti: Farby a korekcia chýb.
  • Rozšírenie: qr.pdf a qr.eps teraz vkladajú nastavené logo rovnako ako qr.svg a qr.png (pozri nižšie) — ako vložený obrázok (PDF cez Image XObject, EPS cez slovník obrázkov v PostScripte, tam iba s %%LanguageLevel: 3), vycentrované na rovnakej ploche, s rovnakým zvýšením opravy chýb na H. Oba formáty doteraz logo nedodávali; toto je teraz opravené.
  • Medzipamäť: S nastaveným logom teraz aj qr.pdf a qr.eps poskytujú Cache-Control: public, max-age=300 namiesto zvyčajných 24 hodín — presne ako SVG/PNG.
  • Záložné riešenie: Ak samotný obrázok loga nemožno spracovať (napríklad poškodený uložený objekt), oprava chýb zostáva H, ale vyhradená plocha zostane prázdna namiesto obrázka — nikdy nedôjde k chybe servera.
  • Žiadna zmena správania bez loga: Kódy bez loga naďalej poskytujú qr.pdf/ qr.eps bajtovo identické, s nezmenenou 24-hodinovou medzipamäťou.
  • Podrobnosti a pokyny na tlač: Logo v QR kóde.

2026-09 · Logo v QR kóde — Dashboard a API

  • Novinka: Kód teraz môže obsahovať logo v strede. V paneli Dashboard detailná stránka kódu vytvorí vlastnú kartu loga: Vybrať logo, pri prvom pridaní alebo odstránení potvrdiť upozornenie s povinným začiarkavacím políčkom (obe akcie menia vzor bodiek), potom Nahrať logo/Odstrániť logo. Nahradenie nevyžaduje potvrdenie — zmení sa iba obrázok, nie vzor. Rola viewer vidí stav a náhľad, ale žiadnu z týchto troch akcií.
  • API: POST /v1/codes/{id}/logo (multipart pole file; PNG, JPEG alebo WebP, maximálne 1 MB, SVG je odmietnuté) vytvorí alebo nahradí logo; DELETE /v1/codes/{id}/logo ho opäť odstráni a je idempotentné. Príliš veľký obrázok vráti 413, nepodporovaný formát 422, rola viewer 403.
  • Vykresľovanie: qr.svg a qr.png vkladajú logo ako skutočné pixely (512 × 512, normalizované) a kvôli tomu zvyšujú úroveň korekcie chýb na H. Pridanie a odstránenie tak menia vzor bodiek (M ↔ H), nahradenie nie. qr.pdf a qr.eps nevkladajú žiadne logo a zostávajú nezmenené. Už vytlačený kód funguje v každom prípade ďalej, pretože kódovaný cieľ nezávisí od loga — znova tlačiť musí iba ten, kto chce (nový) vzhľad s logom vidieť aj na materiáli, pričom by nemal miešať staré a nové tlačové súbory.
  • Medzipamäť: S nastaveným logom vracajú qr.svg a qr.png Cache-Control: public, max-age=300 namiesto bežných 24 hodín. Podrobnosti, limity a pokyny na tlač: Logo v QR kóde.

2026-08 · operationId pre všetkých 75 operácií a návod „kedy použiť“ pre agentov

  • Doplnenie: Všetkých 75 operácií v špecifikácii OpenAPI teraz obsahuje operationId — listCodes, createCode, getCodeStats, archiveWorkspace a tak ďalej. Doteraz toto pole úplne chýbalo, takže každý generátor musel názov metódy odvodzovať z HTTP metódy a cesty (postV1Codes). Takéto názvy závisia od cesty a menia sa pri každej zmene štruktúry cesty. Formát názvu je na všetkých 75 miestach rovnaký: list/get/create/update/replace/delete, inak sloveso vyjadrujúce biznis logiku (validateDpp, registerGs1Identifier, pingWebhook). Sloveso sa riadi biznis logikou, nie HTTP metódou — archiveWorkspace je DELETE, importDpps je POST.
  • Dopad na vlastnoručne generovaných klientov: Tí, ktorí si generujú svoje SDK zo špecifikácie, získajú pri ďalšom spustení premenované metódy (postV1Codes → createCode). To je účelom tejto zmeny, ide však o premenovanie v cudzom kóde — preto to tu výslovne uvádzame. Cesty, parametre, formáty odpovedí a stavové kódy zostávajú nezmenené; oficiálne SDK, CLI a MCP servery nie sú ovplyvnené.
  • Vstup pre agentov: https://qr3.app/llms.txt má sekciu ## When to use qr3.app — šesť úloh namiesto šiestich funkcií, plus vetu o tom, na čo qr3.app nie je tým správnym nástrojom. Rovnakú informáciu teraz poskytuje MCP server pri nadviazaní spojenia: initialize voči https://mcp.qr3.app/mcp odpovedá s poľom instructions (predtým: jedenásť nástrojov bez akéhokoľvek zaradenia). Zahrnuté je aj to, ktoré volania vyžadujú API kľúč — initialize a tools/list nie, každé tools/call áno.
  • Opravy v llms.txt: Štyri údaje boli overené voči produkcii a neobstáli: (1) Python SDK qr3app nie je zverejnené na PyPI — riadok s pip install je bez náhrady odstránený; (2) Accept: text/markdown platí pre úvodnú stránku a blog, nie pre každú serverom renderovanú stránku; (3) kontaktná adresa je [email protected], a to aj v JSON-LD úvodnej stránky; (4) /de/security/ je presmerovanie na kotvu, nie samostatná stránka. Nový odkaz: docs.qr3.app/de/skills/.
  • Zabezpečenie: Tri overenia v openapi-spec.test.ts — úplnosť, jedinečnosť, lowerCamelCase —, každé spätne skontrolované pomocou mutácie. Deväť ďalších testov fixuje štyri opravené údaje, aby sa predišlo ich opätovnému výskytu.
  • Známe obmedzenie: Dve zo 75 operácií sú popísané v špecifikácii, ale odpovedajú kódom 404 (GET /v1/codes/{id}/stats a GET /v1/account). Tu dostali svoj názov a opäť oň prídu, hneď ako sa rozhodne, či budú implementované alebo odstránené.

2026-08 · Downgrade-y programov a zrušenia teraz vplývajú aj na limity

  • Oprava: Stripe webhook pri zmene programu a zrušení zapisoval iba názov programu, nie štyri stĺpce limitov organizácie (max_workspaces, max_members, max_dynamic_codes, max_scans_per_month). Keďže vynucovanie limitov berie maximum z uloženej hodnoty a základnej úrovne (baseline) programu, organizácia s downgrade-om alebo zrušeným predplatným si ponechala svoje staré, vyššie limity — downgrade bol neúčinný. Webhook teraz pri každej skutočnej zmene programu nastaví stĺpce na základnú úroveň nového programu a pri zrušení na základnú úroveň Free — presne tak, ako to už robí administrátorská správa.
  • Správanie: Rutinné aktualizácie predplatného (predĺženie, platobné prostriedky, pomerné účtovanie) sa limitov naďalej nedotýkajú; individuálne udelené vyššie limity prežijú bez zmien. Až skutočná zmena programu ich nastaví na základnú úroveň nového programu.
  • Dopad: Žiadna zmena API ani formátu odpovede. Organizácie, ktorých downgrade prebehol pred touto opravou, si ponechajú staré hodnoty, kým nenastane ďalšia zmena programu alebo ich neupraví podpora.

2026-08 · Keyset kurzor teraz na všetkých zoznamových endpointoch

  • Oprava: Oprava kurzora pre GET /v1/codes a GET /v1/dpp (pozri nižšie) je teraz nasadená na všetky ostatné zoznamy s pagináciou pomocou kurzora: GET /v1/qr-codes/:id/comments, /v1/workspaces, /v1/gs1/identifiers, /v1/members, /v1/audit-logs, /v1/admin/orgs, /v1/admin/users a /v1/webhooks/:id/deliveries. Všetky doteraz stránkovali iba na základe created_at; riadky s identickou časovou pečiatkou (záznamy auditu z dávkovej operácie, opakované pokusy webhookov, importy členov) sa mohli na nasledujúcej stránke stratiť. Kľúčom na triedenie je teraz všade n-tica (created_at, id).
  • Zmena API: V týchto zoznamoch je meta.pagination.next_cursor odteraz taktiež nepriehľadná hodnota (base64url) namiesto čistej časovej pečiatky; nečitateľné kurzory vracajú 400, staré kurzory s časovou pečiatkou budú prechodne naďalej akceptované. Výnimkou je GET /v1/webhooks/:id/deliveries: tam zostáva next_cursor ID posledného doručenia (neznáme ID → prvá stránka). Klienti, ktorí vracajú next_cursor nezmenený — Dashboard, CLI, SDKs, MCP —, nemusia nič meniť.
  • Dopad: Nie je potrebná žiadna migrácia. Ak vám pri prechádzaní v niektorom z týchto zoznamov (napr. audit log alebo log doručení v Dashboarde) chýbali položky: Nikdy nezmizli — zoznamy ich odteraz zobrazujú kompletne.

2026-08 · Časové pečiatky po úprave a vymazaní opäť v súlade s OpenAPI

  • Oprava: Po PATCH /v1/codes/{id} sa updated_at vracal vo formáte SQLite bez časového pásma (2026-08-17 09:00:00), hoci špecifikácia OpenAPI sľubuje format: date-time a vytvorenie (POST) poskytuje časovú pečiatku ISO (2026-08-17T09:00:00.000Z). To isté platilo pre deleted_at/updated_at pri soft-delete, ako aj pre cesty úpravy/vymazania API kľúčov, organizácií, workspacov, členov, komentárov a webhookov, a navyše pre last_used_at API kľúčov a last_triggered_at webhookov. Všetky zapisovacie cesty teraz ukladajú čas podľa ISO 8601 (UTC, T a Z).
  • Dopad: Klienti, ktorí parsujú updated_at pomocou new Date(...) (SDKs, CLI, Dashboard), čítali formát s medzerou ako miestny čas — CLI zobrazovalo pri raz upravených kódoch čas posunutý o lokálny offset (Viedeň: −2 h). Toto je opravené. Okrem toho migrácia dát normalizuje už uložené hodnoty v starom formáte na ISO, aby triedenie a porovnávanie v zmiešaných záznamoch fungovalo správne. Žiadna zmena v názvoch polí ani v štruktúre odpovede.
  • Pozadie: Rovnaká trieda chýb ako pri dvoch opravách nižšie (expirácia API kľúča, cutoff re-scanu): funkcia datetime('now') v SQLite zapisuje YYYY-MM-DD HH:MM:SS, zatiaľ čo všetci ostatní zapisovatelia používajú ISO 8601. Test v zdrojovom kóde (guard test) v budúcnosti zabráni novému výskytu tejto chyby.

2026-08 · Stránkovanie zoznamov už nestráca batch kódy

  • Oprava: GET /v1/codes a GET /v1/dpp stránkovali iba na základe created_at. Kódy z POST /v1/codes/batch, POST /v1/dpp/batch a CSV/XLSX importu však zdieľajú jednu časovú pečiatku — akonáhle bol batch väčší ako limit (predvolene 20), druhá stránka už nevrátila zostávajúce riadky s rovnakou časovou pečiatkou. Kódy existovali a boli dostupné cez GET /v1/codes/:id, ale v zozname (Dashboard, CLI qr3 list, SDKs, MCP) sa nikdy neobjavili. Kurzor je teraz keyset nad (created_at, id).
  • Zmena API: meta.pagination.next_cursor je odteraz nepriehľadná hodnota (base64url) namiesto čistej časovej pečiatky. Tí, ktorí vracajú kurzor nezmenený ako ?cursor= — tak ako to robí Dashboard, CLI, všetky SDKs a MCP server — nemusia nič meniť. Staré kurzory s časovou pečiatkou budú prechodne naďalej akceptované; nečitateľné kurzory teraz vrátia 400 namiesto tichého vrátenia prvej stránky.
  • Dopad: Ak ste po batch importe videli v zozname menej kódov, než ich bolo vytvorených: Kódy sa nikdy nestratili — zoznam ich odteraz zobrazuje kompletne. Nie je potrebná žiadna migrácia.

2026-08 · Bezpečnostné re-scany opäť bežia v 24-hodinovom cykle

  • Oprava: Periodické opätovné skenovanie cieľových URL a odkazov na vstupnej stránke (Google Web Risk) vynechávalo kódy, ktorých posledný sken bol v rovnaký kalendárny deň ako 24-hodinový cutoff — v závislosti od času sa opätovný sken oneskoril až o ďalší deň. Cutoff sa teraz počíta v rovnakom ISO formáte, v akom sú uložené časové pečiatky skenov.
  • Dopad: Cieľová URL, ktorá je po poslednom skene vyhodnotená ako nebezpečná, opäť vedie k automatickému pozastaveniu kódu v rámci zdokumentovaného 24-hodinového okna. Žiadna zmena API alebo formátu odpovede.

2026-08 · API kľúče vypršia presne v čase expirácie

  • Oprava: API kľúč, ktorého expires_at bol v rovnaký deň, bol akceptovaný až do polnoci UTC. Expirácia sa teraz porovnáva ako časová pečiatka namiesto reťazca — expirovaný kľúč okamžite vráti 401.
  • Pozadie: expires_at sa ukladá ako ISO časová pečiatka (2026-08-14T09:00:00Z), porovnávacia strana poskytovala formát s medzerou (2026-08-14 09:00:00). Porovnanie surových reťazcov preto fungovalo správne iba vtedy, ak sa líšil už samotný dátum.
  • Dopad: Nie je potrebná žiadna migrácia, formát odpovede z GET /v1/api-keys zostáva nezmenený. Nečitateľné hodnoty expirácie sa teraz považujú za expirované namiesto platných.

2026-08 · API referencia: Správa tenantov zdokumentovaná

  • OpenAPI: Špecifikácia — a tým pádom aj interaktívna referencia — teraz dokumentuje organizácie (vrátane GET /v1/organizations/usage), workspacy, členov & roly a auditovacie logy.
  • Billing: Prehľad programov (GET /v1/billing/plans) je verejný; checkout (POST /v1/billing/checkout) a zákaznícky portál Stripe (GET /v1/billing/portal) sú označené ako endpointy pre administrátorov organizácie.
  • Export skenov: Štatistiky skenov (GET /v1/codes/{id}/scans) a export surových dát (…/scans.csv, …/scans.xlsx) sú plne zdokumentované — vrátane upozornenia týkajúceho sa GDPR: ip_hash nie je nikdy súčasťou exportu.
  • Spracovanie chýb: Novo zdokumentovaná je aj odpoveď 400 pri validácii požiadavky: telo (body) obsahuje surovú chybu Zod, nie dokument problému podľa RFC-7807 — napriek tomu je však odosielaný s Content-Type application/problem+json.

2026-08 · Kopírovanie verejných odkazov na súbory

  • Dashboard: Verejné súbory na stránke s podrobnosťami o kóde majú teraz tlačidlo, ktoré skopíruje ich verejný odkaz do schránky – dá sa použiť priamo ako cieľová URL adresa QR kódu, ak má naskenovanie okamžite otvoriť konkrétny dokument namiesto landing page so zoznamom súborov.
  • API: Súborové endpointy (/v1/files) navyše vracajú public_url. Toto pole je nastavené len pre súbory s visibility: public – súkromné súbory nedostanú verejnú adresu.
  • Správanie: Odkaz nevyžaduje prihlásenie a otvorí súbor priamo v prehliadači. Nahradenie súboru ho ponechá nezmenený, takže kód vytlačený na ňom zostáva platný. Podrobnosti: Súbory & dátové hárky.

2026-07 · Tímové roly: Editor bez možnosti mazania & Admin fakturácia

  • Novinka: Rola člena Editor (bez mazania) — vytvára a upravuje QR kódy, súbory a Digital Product Passports, ale nemôže nič mazať ani vytvárať API kľúče. Všetky deštruktívne endpointy overujú rolu na strane servera (403).
  • Fakturácia: Upgrady programov a zákaznícky portál Stripe (POST /v1/billing/checkout, GET /v1/billing/portal) sú teraz vyhradené pre administrátorov organizácie — všetky ostatné roly vidia prehľad programov len na čítanie.
  • Dashboard: Akcie, ktoré vlastná rola neumožňuje, sú skryté: Čitateľ napríklad nevidí tlačidlá na vytváranie, úpravu alebo mazanie; zoznamy, sťahovania a štatistiky zostávajú viditeľné. Podrobnosti: Tím & roly.

2026-06 · Externé odkazy na landing page kódu

  • Landing page: Landing page kódu hostovaná na qr3 môže teraz zobrazovať externé, vlastné hostované odkazy ({ label, url }) – navyše k nahraným súborom alebo namiesto nich, napríklad pre dátové hárky na vašom vlastnom webe.
  • API: POST/PATCH /v1/codes akceptujú pole links (0–20 položiek, http(s), ≤ 2048 znakov). Každá URL adresa je kontrolovaná pomocou Google Web Risk; nebezpečná URL vráti 422. Prázdne pole vymaže všetky odkazy.
  • Dashboard: Pridávanie, triedenie a odstraňovanie odkazov na stránke s podrobnosťami o kóde.
  • Bezpečnosť: Vykreslené odkazy zostávajú zabezpečené proti XSS (escaped, iba http(s)) a stránka si zachováva hlavičku noindex.

2026-04 · Analytika pre jednotlivé QR kódy v Dashboarde

  • Dashboard: Tlačidlo analytiky v zozname QR kódov teraz otvára stránku so štatistikami príslušného QR kódu na adrese /dashboard/codes/{id}.
  • Routing: Alias /dashboard/codes naďalej presmerováva na /dashboard, ale už nezachytáva detailné cesty ako /dashboard/codes/{id}.
  • API: Stránka s podrobnosťami načítava QR kód priamo cez GET /v1/codes/:id; vďaka tomu už nezávisí od limitov stránkovania zoznamu.
  • Testy: Regresné testy pokrývajú presmerovanie aliasu a priame načítanie kódu.

2026-04 · Dialógové okno na mazanie QR kódov v Dashboarde

  • Dashboard: Ikona koša v zozname QR kódov teraz otvára vlastný React dialóg namiesto natívneho vyskakovacieho okna prehliadača.
  • Spätná väzba: Po vymazaní sa zobrazí toast správa o úspechu alebo chybe.
  • Testy: packages/dashboard/tests/dashboard.test.ts zabraňuje regresiám pre confirm() v procese mazania QR kódu.

2026-04 · Testovanie skrátených odkazov pre dynamické QR kódy v Dashboarde

  • Dashboard: Shortcodes v zozname QR kódov sú teraz priamo klikateľné ako externé presmerovacie odkazy. Ikona externého odkazu vedľa napr. wu3qaa otvorí https://qr3.app/{shortCode} na novej karte.
  • i18n: Doplnené texty tooltipov pre nemčinu a angličtinu.
  • Testy: packages/dashboard/tests/dashboard.test.ts chráni href odkazu, správanie novej karty, noopener noreferrer a ikonu pred regresiami.

2026-04 · Smerovanie Redirect-Workera pre dynamické QR kódy

  • Oprava: Dynamické QR kódy na https://qr3.app/{shortCode} sú opäť spracovávané Redirect-Workerom. Produkčná cesta teraz využíva qr3.app/*, pretože Cloudflare Worker cesty nepodporujú parametre cesty :code.
  • Zabezpečenie: Nezhodujúce sa cesty sa prepúšťajú na pôvodnú landing origin adresu, aby bežné stránky ako /de/pricing neboli blokované Redirect-Workerom.
  • Testy: packages/redirect/tests/unit/redirect.test.ts overuje wildcard cestu, spracovanie shortcode a prepúšťanie na origin.

2026-04 · Prehľad skenovania DPP vo workspace (Q3.4.2)

  • Novinka: GET /v1/workspace/stats/dpp?days=30 — agreguje všetky dpp_scans pre workspace daného API kľúča (active_dpps, scans_by_day, top_dpps s názvom produktu/kategóriou).
  • Dashboard: Karta na domovskej stránke (/dashboard) s 30-dňovým stĺpcovým grafom + top zoznamami — paralelne ku kartám QR kódov.
  • Verejné: Marketingový skrátený odkaz GET /dpp/dpp_<id> (jeden segment) pre live ukážky, paralelne k /dpp/{gtin}/{serial}.

2026-04 · Analytika skenovania DPP (Q3.4.1)

  • Novinka: GET /v1/dpp/:id/stats?days=30 — agregované skeny verejného GS1 resolvera pre jedno DPP. Polia: total_scans, period_scans, scans_by_day, top_countries, top_devices, top_representations.
  • Novinka: Tabuľka dpp_scans (migrácia 0011) — oddelená od scans (Redirect-Worker). IP adresy sú hashované pomocou denne rotujúcej soli (salt), surové IP adresy sa nikdy nedostanú do D1.
  • Dashboard: Mini grafová karta (SVG, bez knižnice na grafy) na /dashboard/dpp/:dppId s 30-dňovými stĺpcami + top 3 prehľadmi. Prázdny stav (empty state), akonáhle je DPP aktívny, ale ešte nemal žiadne skeny.

2026-04 · Simulátor súladu s predpismi EÚ v reálnom čase (Q3.3.7)

  • Novinka: POST /v1/dpp/:id/validate-update — simuluje čiastočné aktualizácie bezstavovo (stateless) (status, zoznam trhov, …) bez perzistencie. Odpoveď obsahuje eu_compliance + preview.changed_fields.
  • Dashboard: Karta simulátora v detaile DPP (/dashboard/dpp/:dppId) — čipy pre DE/AT/FR/IT/ES/NL + vlastné, rozbaľovací zoznam stavov, Preview EU impact / Save changes / Reset. Neblokujúce cez Remix useFetcher.
  • Zabezpečenie: Vyčlenené pomocné funkcie simulátora (readUpdatePatchFromForm, marketCountriesKey) + 18 nových unit testov; oprava chyby: osamotený ne-ISO vstup už nevymaže zoznam trhov.

2026-04 · Náhľad súladu s predpismi EÚ v reálnom čase vo formulári na vytvorenie (Q3.3.6)

  • Zmena: POST /v1/dpp/validate navyše vracia eu_compliance — rovnaký validátor ako GET /v1/dpp/:id/eu-compliance, bezstavovo pred uložením.
  • Dashboard: Náhľad pod existujúcim validačným panelom + nový Save-Guard banner pred odosielacími tlačidlami, ak sú otvorené chyby/varovania (i18n pluralizácia DE/EN).

EU validátor + textilné UI (Q3.3.4 + Q3.3.5)

  • Novinka: Validátor súladu s predpismi EÚ s 5 textilnými pravidlami (TEXTILE_AGEC_REQUIRED, TEXTILE_MICROPLASTICS_CONSISTENCY, TEXTILE_SVHC_THRESHOLD, TEXTILE_GREENWASHING, TEXTILE_ESPR_READY).
  • Novinka: GET /v1/dpp/:id/eu-compliance s compliant / espr_ready / issues[] / summary.
  • Dashboard: Sekcia súladu s predpismi EÚ v detaile DPP (súhrnné dlaždice, zoskupené karty problémov, odznak ESPR-Ready v hlavičke).

Textil-DPP-Schema (Q3.3.1–Q3.3.3)

  • Novinka: Kategória textile s povinným reťazcom AGEC (tkanie/pletenie → farbenie/potlač → konfekcia), pre každé vlákno origin_country + recycled_pct, svhc_substances[], ESPR-Opt-in (PEF, životnosť, Recyclability).
  • Novinka: Základné pole market_countries: string[] (ISO 3166-1 alpha-2) vo všetkých kategóriách DPP — riadi špecifické francúzske pravidlá AGEC a povinné francúzske upozornenie pre spotrebiteľov.
  • Novinka: Spotrebiteľská HTML šablóna s varovným boxom AGEC pre mikroplasty, 3-stupňovým reťazcom pôvodu (vlajkové pilulky), zoznamom SVHC, sekciou Durability a Recyclability.
  • Migrácia: 0010_dpp_market_countries (D1).

DPP-Bulk-Import (Q3.2.1–Q3.2.5)

  • Novinka: POST /v1/dpp/import akceptuje CSV a XLSX (kompatibilné s Workerom cez SheetJS xlsx, ~283 KB gzip balík).
  • Škálovanie: limit na základe programu (Free 100 → Enterprise 10k) + dávkovanie db.batch() po 100 + 5 MB limit pre body.
  • Novinka: Chybový report ako CSV v poli errors_csv v odpovedi 201; GET /v1/dpp/import/templates/:category?format=csv|xlsx poskytuje hotové šablóny pre batérie a textil.
  • Dashboard: Nahrávanie pretiahnutím (Drag-and-Drop) na /dashboard/dpp/import s proxy šablónou a priamym stiahnutím CSV.

Spätne kompatibilné zmeny (Non-Breaking) — rozšírenia LTS

Všetky vyššie uvedené zmeny sú aditívne:

  • Existujúci klienti POST /v1/dpp/validate ignorujú nové pole eu_compliance bez akýchkoľvek zmien.
  • Existujúce procesy pre battery zostávajú nezmenené.
  • market_countries je voliteľné a predvolene nastavené na [].

Pozrite si Verziovanie API pre pravidlá pre spätne nekompatibilné zmeny (Breaking-Change-Policy).