Changelog
Changelog
Vybrané novinky z posledních vydání. Pro úplné verze API a zásady změn narušujících zpětnou kompatibilitu (Breaking-Change-Policy) viz Verzování API & LTS zásady.
Podrobné změny u jednotlivých koncových bodů (endpoints): Specifikace OpenAPI a interaktivní API reference.
2026-10 · Barvy v Dashboardu
- Novinka: stránka s podrobnostmi kódu má kartu Barvy: popředí a pozadí jako hex hodnota, průhledné pozadí, náhled přes skutečnou cestu k obrázku. Kontrola je stejná jako u
PATCH /v1/codes/{id}: kritické dvojice vyžadují potvrzení, dvojice pod 1,5:1 nelze uložit. - Obnovení černé na bílé vrací ve všech čtyřech formátech opět stejné bajty jako bez barev. Kódy bez barev se nemění.
- Průhledné kódy se ve všech náhledech Dashboardu zobrazují na šachovnici. Podrobnosti: Barvy v Dashboardu.
2026-10 · Barvy v PDF a EPS
- Novinka:
qr.pdfaqr.epsvykreslujífgabg, jako parametry i jako uložené barvy. Černá a jakýkoli odstín šedi se zapisují jako stupně šedi (pouze černý plát), jakákoli jiná barva jako CMYK v celých procentech, například1F4E79jako C74 M36 Y0 K53. - Pozadí jako u SVG: Jakmile je vybrána barva, za kódem a jeho ochrannou zónou se nachází krycí plocha, bílá nebo
bg.bg=transparentnevykresluje žádnou. Název zůstává černý, podkladová deska loga bílá. - Žádná změna bez barev: Bez
fg/bga bez uložených barev poskytují oba formáty stejné bajty jako dříve. PDF produktového pasu zůstává nebarevné. - Omezení: žádný ICC profil, žádné PDF/X. Podrobnosti: Barvy při tisku.
2026-09 · Statické kódy bez mezipaměti přesměrování, souběžné mazání
- Změněno: Statické kódy již nejsou uloženy v mezipaměti přesměrování. Volání jejich krátkého odkazu (
redirect_url) vždy načte aktuální stav. PoDELETE /v1/accountproto statický kód při dalším volání již nepřesměruje, dříve to bylo až po dobu 24 hodin. Také změna tarifu se u statických kódů projeví okamžitě. Dynamické kódy jsou při smazání účtu odstraněny jako doposud. Vytištěné statické kódy obsahují svůj cíl přímo a nejsou ovlivněny. - Opraveno: Dvě souběžná volání
DELETE /v1/codes/:idna stejný kód vrátí jednou200a jednou404. Webhookqr.deletedje odeslán přesně jednou, dříve dvakrát. - Novinka:
POSTaDELETE /v1/codes/:id/logoodpovídají s409(errors/conflict), pokud jiný požadavek souběžně změnil logo stejného kódu, a v takovém případě nic nezmění. Dříve mohlo nahrané logo zůstat uloženo bez využití. Dvě souběžná voláníDELETE /v1/codes/:id/logovrátí obě200. Podrobnosti: Logo.
2026-09 · TypeScript-SDK 1.2.0
- Novinky v
@qr3/sdk1.2.0:client.codes.update()přijímáappearancea vrací výsledky kontroly kontrastu jakoissuesve výsledku; bez nálezu toto pole chybí.client.codes.imageUrl()přijímáfg,bgaecc. Každý kód, který API vrací (get,list,create,update,batchCreate), obsahujetitleaappearance. - Aktualizace:
npm install @qr3/sdk@latest. Python, Go a PHP budou následovat. Podrobnosti: SDK a CLI a Uložení barev v kódu.
2026-09 · Změněná doba platnosti se projeví přibližně do jedné minuty
- Opraveno:
PATCHnaexpires_atnyní vymaže cache přesměrování daného kódu. Nová doba platnosti se tak projeví přibližně do jedné minuty namísto až o 24 hodin později. Dříve odstraněná nebo posunutá platnost vracela410ještě po dobu až 24 hodin, a platnost nastavená na aktuální čas nechala přesměrování aktivní až o 24 hodin déle. - Opraveno: Kód vytvořený s
expires_atvyprší včas i tehdy, pokud k vypršení platnosti dojde během prvních 24 hodin. - Opraveno: Pokud je kód smazán během nahrávání nebo odstraňování jeho loga, odpoví
POSTaDELETE /v1/codes/:id/logos404a smazaný kód nezmění, stejně jako již dřívePATCH. - Opraveno: V cache přesměrování se ukládá i statický kód, jehož krátký odkaz (
redirect_url) byl navštíven. Úprava, pozastavení a smazání jej nyní také vymažou, nikoli pouze u dynamických kódů.
2026-09 · Uložení barev u kódu
- Novinka:
PATCH /v1/codes/:idpřijímáappearancesforeground_colorabackground_color(#RRGGBB, pozadí takétransparent).qr.svgaqr.pngvykreslují uložené barvy bez jakýchkoli parametrů; parametr dotazu jako?fg=000000má stále přednost. PDF a EPS budou vykreslovat barvy až v pozdější verzi. - Kontrola kontrastu: Dvojice pod 1,5:1 vrátí
422. Slabší dvojice se uloží a nahlásí vmeta.issuesjakowarningnebocritical; transparentní pozadí je vždycritical, nikdy není zablokováno. - Slučování: Vynechaná pole si ponechají svou uloženou hodnotu,
nullji resetuje. Souběžné změny stejného kódu se již navzájem nepřepisují. - V každé odpovědi kódu:
appearanceje součástí každé odpovědi kódu a webhookůqr.createdaqr.updated.POST, batch a import jej odmítnou s422. - Žádná změna pro stávající kódy: Bez uložených barev poskytuje každý kód stejné bajty jako dříve. Podrobnosti: Uložení barev u kódu.
2026-09 · Barvy a korekce chyb jako parametry tras pro obrázky
- Novinka: Všechny čtyři trasy pro obrázky přijímají
fg(barva popředí),bg(barva pozadí nebotransparent) aecc(korekce chybL,M,Q,H). Formáty SVG a PNG barvy vykreslují; PDF a EPS je přijímají, ale vykreslí je až v pozdějším vydání. Parametreccfunguje ve všech čtyřech formátech, logo nadále vynucujeH. - Průhlednost:
bg=transparentvrací SVG bez pozadí a PNG se skutečným alfa kanálem. Podklad musí být světlý a tichá zóna musí zůstat volná. - Nikdy nedojde k chybě: Neplatné hodnoty jsou ignorovány; obrázek je pak doručen přesně tak, jako by byl bez parametrů.
- Mezipaměť: Každý účinný parametr vrací
Cache-Control: public, max-age=300namísto 24 hodin u standardního obrázku. - Žádná změna chování bez parametrů: Jakýkoli stávající kód vrací ve všech čtyřech formátech stejné bajty jako dříve.
- K dispozici v každém tarifu. Podrobnosti: Barvy a korekce chyb.
2026-09 · PDF a EPS nyní také vkládají logo
- Rozšíření:
qr.pdfaqr.epsnyní vkládají nastavené logo stejně jakoqr.svgaqr.png(viz níže) — jako vložený obrázek (PDF přesImage XObject, EPS přes obrázkový slovník v PostScriptu, tam pouze s%%LanguageLevel: 3), vycentrovaný na stejné ploše, se stejným zvýšením korekce chyb naH. Oba formáty dosud logo neposkytovaly; to je nyní opraveno. - Mezipaměť: S nastaveným logem nyní i
qr.pdfaqr.epsvracejíCache-Control: public, max-age=300namísto obvyklých 24 hodin — přesně jako SVG/PNG. - Záložní řešení: Pokud nelze samotný obrázek loga zpracovat (například
poškozený uložený objekt), korekce chyb zůstává na
H, ale vyhrazená plocha zůstane prázdná namísto obrázku — nikdy nedojde k chybě serveru. - Žádná změna chování bez loga: Kódy bez loga nadále poskytují
qr.pdf/qr.epsbajtově identické, s nezměněnou 24hodinovou mezipamětí. - Podrobnosti a tiskové pokyny: Logo v QR kódu.
2026-09 · Logo v QR kódu — Dashboard a API
- Novinka: Kód nyní může mít logo uprostřed. V Dashboardu se na stránce s podrobnostmi o kódu vytvoří samostatná karta loga: Vybrat logo, při prvním přidání nebo při odstranění potvrdit varování se zaškrtávacím políčkem (obojí mění vzor bodů), poté Nahrát logo/Odstranit logo. Nahrazení nevyžaduje potvrzení — změní se pouze obrázek, nikoli vzor. Role
viewervidí stav a náhled, ale žádnou z těchto tří akcí. - API:
POST /v1/codes/{id}/logo(multipart polefile; PNG, JPEG nebo WebP, maximálně 1 MB, SVG je odmítnuto) vytvoří nebo nahradí logo;DELETE /v1/codes/{id}/logojej opět odstraní a je idempotentní. Příliš velký obrázek vrátí413, nepodporovaný formát422, roleviewer403. - Vykreslování:
qr.svgaqr.pngvloží logo jako skutečné pixely (512 × 512, normalizované) a zvýší kvůli tomu úroveň opravy chyb naH. Přidání a odstranění tak mění vzor bodů (M↔H), nahrazení nikoli.qr.pdfaqr.epslogo nevkládají a zůstávají beze změny. Již vytištěný kód funguje v každém případě dál, protože kódovaný cíl nezávisí na logu — znovu tisknout musí pouze ten, kdo chce (nový) vzhled s logem vidět i na materiálu, a přitom by neměl míchat staré a nové tiskové soubory. - Mezipaměť: S nastaveným logem vracejí
qr.svgaqr.pnghlavičkuCache-Control: public, max-age=300namísto obvyklých 24 hodin. Podrobnosti, limity a pokyny pro tisk: Logo v QR kódu.
2026-08 · operationId pro všech 75 operací a návod „kdy použít“ pro agenty
- Doplnění: Všech 75 operací v OpenAPI specifikaci nyní obsahuje
operationId—listCodes,createCode,getCodeStats,archiveWorkspacea tak dále. Dosud toto pole zcela chybělo, takže každý generátor musel název metody odvozovat z HTTP metody a cesty (postV1Codes). Takové názvy závisí na cestě a mění se s každou úpravou cesty. Formát názvu je na všech 75 místech stejný:list/get/create/update/replace/delete, jinak sloveso odborné akce (validateDpp,registerGs1Identifier,pingWebhook). Sloveso odpovídá doménové logice, nikoli HTTP metodě —archiveWorkspacejeDELETE,importDppsjePOST. - Dopad na vlastnoručně generované klienty: Pokud generujete své SDK ze specifikace, při příštím spuštění získáte přejmenované metody (
postV1Codes→createCode). To je účelem této změny, ale jedná se o přejmenování v cizím kódu — proto to zde výslovně uvádíme. Cesty, parametry, formáty odpovědí a stavové kódy zůstávají beze změny; oficiální SDK, CLI a MCP servery nejsou ovlivněny. - Vstup pro agenty:
https://qr3.app/llms.txtobsahuje sekci## When to use qr3.app— šest úkolů namísto šesti funkcí, plus větu o tom, pro co qr3.app není tím správným nástrojem. Stejnou informaci nyní poskytuje MCP server při handshake:initializevůčihttps://mcp.qr3.app/mcpodpovídá s poleminstructions(předtím: jedenáct nástrojů bez jakéhokoli zařazení). Zahrnuto je také to, které volání vyžadují API klíč —initializeatools/listnikoli, každétools/callano. - Opravy v
llms.txt: Čtyři údaje byly porovnány s produkcí a neobstály: (1) Python SDKqr3appnení publikováno na PyPI — řádek spip installbyl bez náhrady odstraněn; (2)Accept: text/markdownplatí pro úvodní stránku a blog, nikoli pro každou serverově renderovanou stránku; (3) kontaktní adresa je[email protected], a to i v JSON-LD úvodní stránky; (4)/de/security/je přesměrování na kotvu, nikoli samostatná stránka. Nově odkazováno:docs.qr3.app/de/skills/. - Zajištění: Tři kontroly v
openapi-spec.test.ts— úplnost, jednoznačnost,lowerCamelCase—, každá ověřená pomocí mutace. Devět dalších testů fixuje čtyři opravené údaje, aby se nevrátily. - Známé omezení: Dvě ze 75 operací jsou ve specifikaci popsány, ale odpovídají kódem
404(GET /v1/codes/{id}/statsaGET /v1/account). Zde získaly název a opět o něj přijdou, jakmile se rozhodne, zda budou implementovány, nebo odstraněny.
2026-08 · Snížení tarifů a zrušení předplatného nyní ovlivňují i limity
- Oprava: Webhook služby Stripe zapisoval při změně tarifu a zrušení předplatného pouze název tarifu, nikoli čtyři sloupce limitů organizace (
max_workspaces,max_members,max_dynamic_codes,max_scans_per_month). Vzhledem k tomu, že vynucování limitů bere maximum z uložené hodnoty a výchozí hodnoty (baseline) tarifu, ponechala si organizace se sníženým nebo zrušeným tarifem své staré, vyšší limity — snížení tarifu (downgrade) tak bylo neúčinné. Webhook nyní při každé skutečné změně tarifu nastaví tyto sloupce na výchozí hodnotu (baseline) nového tarifu a při zrušení na výchozí hodnotu bezplatného tarifu (Free-baseline) — přesně tak, jak to již dělá administrátorská správa. - Chování: Běžné aktualizace předplatného (prodloužení, platební metoda, poměrná částka/prorace) se limitů i nadále nedotýkají; individuálně udělené vyšší limity přečkají tyto změny beze změny. Teprve skutečná změna tarifu je nastaví na výchozí hodnotu (baseline) nového tarifu.
- Dopad: Žádná změna API ani formátu odpovědi. Organizace, u nichž ke snížení tarifu došlo před touto opravou, si ponechají staré hodnoty, dokud neproběhne další změna tarifu nebo je neupraví podpora.
2026-08 · Keyset-kurzor nyní na všech seznamových koncových bodech
- Oprava: Oprava kurzoru pro
GET /v1/codesaGET /v1/dpp(viz níže) je nyní nasazena na všechny ostatní seznamy s kurzorovým stránkováním:GET /v1/qr-codes/:id/comments,/v1/workspaces,/v1/gs1/identifiers,/v1/members,/v1/audit-logs,/v1/admin/orgs,/v1/admin/usersa/v1/webhooks/:id/deliveries. Všechny listovaly pouze podlecreated_at; řádky se stejným časovým razítkem (záznamy auditu z dávkové operace, opakované pokusy webhooků, importy členů) se mohly na následující stránce ztratit. Třídicí klíč je nyní všude n-tice(created_at, id). - Změna API: V těchto seznamech je
meta.pagination.next_cursorod nynějška rovněž opakní hodnota (base64url) namísto prostého časového razítka; nečitelné kurzory vracejí400, staré kurzory s časovým razítkem jsou přechodně nadále akceptovány. VýjimkaGET /v1/webhooks/:id/deliveries: tam zůstávánext_cursorID posledního doručení (neznámé ID → první stránka). Klienti, kteří vracejínext_cursorbeze změny — Nástěnka, CLI, SDKs, MCP —, nemusí nic měnit. - Dopad: Není nutná žádná migrace. Pokud vám v některém z těchto seznamů (např. auditní log nebo log doručení v Nástěnce) při listování chyběly položky: Nikdy nezmizely — seznamy je od nynějška zobrazují kompletně.
2026-08 · Časová razítka po úpravě a smazání opět v souladu s OpenAPI
- Oprava: Po
PATCH /v1/codes/{id}seupdated_atvracelo ve formátu SQLite bez časového pásma (2026-08-17 09:00:00), přestože specifikace OpenAPI vyžadujeformat: date-timea vytvoření (POST) poskytuje ISO časové razítko (2026-08-17T09:00:00.000Z). Totéž platilo prodeleted_at/updated_atpři soft-delete a také pro cesty pro úpravu/smazání u API klíčů, organizací, workspaců, členů, komentářů a webhooků, a dále prolast_used_atu API klíčů alast_triggered_atu webhooků. Všechny zapisovací cesty nyní používají formát ISO 8601 (UTC,TaZ). - Dopad: Klienti, kteří parsují
updated_atpomocínew Date(...)(SDKs, CLI, Nástěnka), četli formát s mezerou jako místní čas — CLI u jednou upravených kódů zobrazovalo čas posunutý o místní časový posun (Vídeň: −2 h). To je nyní opraveno. Migrace dat navíc normalizuje již uložené hodnoty ve starém formátu na ISO, aby řazení a porovnávání ve smíšených datech fungovalo správně. Žádné změny v názvech polí nebo struktuře odpovědi. - Pozadí: Stejná třída chyb jako u dvou oprav níže (vypršení platnosti API klíče, cutoff pro re-scan): SQLite
datetime('now')zapisujeYYYY-MM-DD HH:MM:SS, zatímco všechny ostatní zápisy používají ISO 8601. Guard test ve zdrojovém kódu do budoucna zabrání novému výskytu této chyby.
2026-08 · Stránkování seznamů již neztrácí dávkové kódy
- Oprava:
GET /v1/codesaGET /v1/dppstránkovaly pouze podlecreated_at. Kódy zPOST /v1/codes/batch,POST /v1/dpp/batcha CSV/XLSX importu však sdílejí jedno časové razítko — jakmile byla dávka větší nežlimit(výchozí hodnota 20), druhá stránka již nevracela zbývající řádky se stejným časovým razítkem. Kódy existovaly a byly dostupné přesGET /v1/codes/:id, ale v seznamu (Nástěnka, CLIqr3 list, SDKs, MCP) se nikdy neobjevily. Kurzor je nyní keyset nad(created_at, id). - Změna API:
meta.pagination.next_cursorje od nynějška opakní hodnota (base64url) namísto prostého časového razítka. Ti, kteří vracejí kurzor beze změny jako?cursor=— tak jak to dělá Nástěnka, CLI, všechna SDKs a MCP server — nemusí nic měnit. Staré kurzory s časovým razítkem budou v přechodném období nadále akceptovány; nečitelné kurzory nyní vracejí400namísto tichého vrácení první stránky. - Dopad: Pokud jste po dávkovém importu viděli v seznamu méně kódů, než kolik jich bylo vytvořeno: Kódy se nikdy neztratily — seznam je od nynějška zobrazuje kompletně. Není nutná žádná migrace.
2026-08 · Bezpečnostní re-scany opět probíhají ve 24hodinovém intervalu
- Oprava: Periodické re-scany cílových URL a odkazů na landing page (Google Web Risk) přeskakovaly kódy, jejichž poslední sken proběhl ve stejný kalendářní den jako 24hodinový cutoff — v závislosti na čase se re-scan zpozdil až o další den. Cutoff se nyní počítá ve stejném formátu ISO, v jakém jsou uložena časová razítka skenů.
- Dopad: Cílová URL, která je po posledním skenu vyhodnocena jako nebezpečná, vede opět v rámci zdokumentovaného 24hodinového okna k automatickému pozastavení kódu. Žádná změna API ani formátu odpovědi.
2026-08 · API klíče vyprší v okamžiku vypršení platnosti
- Oprava: API klíč, jehož
expires_atpřipadal na stejný den, byl dříve akceptován až do půlnoci UTC. Vypršení platnosti se nyní porovnává jako časové razítko namísto řetězce — expirovaný klíč okamžitě vrátí401. - Pozadí:
expires_atse ukládá jako ISO časové razítko (2026-08-14T09:00:00Z), porovnávaná strana však poskytovala formát s mezerou (2026-08-14 09:00:00). Porovnání surových řetězců proto fungovalo správně pouze tehdy, pokud se lišilo již samotné datum. - Dopad: Není nutná žádná migrace, formát odpovědi z
GET /v1/api-keyszůstává nezměněn. Nečitelné hodnoty vypršení platnosti jsou nyní považovány za expirované namísto platných.
2026-08 · API reference: Správa tenantů dokumentována
- OpenAPI: Specifikace — a tím pádem i interaktivní referenční příručka — nyní dokumentuje organizace (včetně
GET /v1/organizations/usage), Workspaces, členy a role a auditní logy. - Billing: Přehled tarifů (
GET /v1/billing/plans) je veřejný; checkout (POST /v1/billing/checkout) a zákaznický portál Stripe (GET /v1/billing/portal) jsou označeny jako koncové body pro administrátory organizace. - Export skenů: Statistiky skenování (
GET /v1/codes/{id}/scans) a export surových dat (…/scans.csv,…/scans.xlsx) jsou plně dokumentovány — včetně upozornění ohledně GDPR:ip_hashnení nikdy součástí exportu. - Chování při chybách: Nově je dokumentována také odpověď
400při validaci požadavku: Tělo odpovědi je surová chyba Zod, nikoli dokument o problému podle RFC-7807 — přesto je však odesíláno s Content-Typeapplication/problem+json.
2026-08 · Kopírování veřejných odkazů na soubory
- Dashboard: Veřejné soubory na stránce s podrobnostmi o kódu mají nyní tlačítko, které zkopíruje jejich veřejný odkaz do schránky – ten lze použít přímo jako cílovou URL QR kódu, pokud má naskenování okamžitě otevřít konkrétní dokument namísto vstupní stránky (landing page) se seznamem souborů.
- API: Koncové body pro soubory (
/v1/files) navíc vracejípublic_url. Toto pole je nastaveno pouze u souborů svisibility: public– soukromé soubory veřejnou adresu nedostanou. - Chování: Odkaz nevyžaduje přihlášení a otevře soubor přímo v prohlížeči. Nahrazení souboru ponechá odkaz beze změny, takže na něm vytištěný kód zůstává platný. Podrobnosti: Soubory & datové listy.
2026-07 · Týmové role: Editor bez možnosti mazání & fakturace administrátora
- Novinka: Členská role Editor (bez mazání) — vytváří a upravuje QR kódy, soubory a Digital Product Passports, ale nemůže nic mazat ani vytvářet API klíče. Všechny destruktivní koncové body kontrolují roli na straně serveru (
403). - Fakturace: Upgrady tarifů a zákaznický portál Stripe (
POST /v1/billing/checkout,GET /v1/billing/portal) jsou nyní vyhrazeny administrátorům organizace — všechny ostatní role vidí přehled tarifů pouze pro čtení. - Dashboard: Akce, které vlastní role neumožňuje, jsou skryty: Prohlížitel (Viewer) například nevidí tlačítka pro vytváření, úpravu nebo mazání; seznamy, stahování a statistiky zůstávají viditelné. Podrobnosti: Tým & role.
2026-06 · Externí odkazy na vstupní stránce kódu
- Vstupní stránka: Vstupní stránka kódu hostovaná na qr3 nyní může zobrazovat externí, vlastnoručně hostované odkazy (
{ label, url }) – navíc k nahraným souborům nebo namísto nich, například pro datové listy na vašem vlastním webu. - API:
POST/PATCH /v1/codespřijímají polelinks(0–20 položek,http(s), ≤ 2048 znaků). Každá URL je kontrolována pomocí Google Web Risk; nebezpečná URL vrátí422. Prázdné pole smaže všechny odkazy. - Dashboard: Přidávání, řazení a odebírání odkazů na stránce s podrobnostmi o kódu.
- Bezpečnost: Vykreslené odkazy zůstávají zabezpečené proti XSS (escapované, pouze
http(s)) a stránka si zachovává hlavičkunoindex.
2026-04 · Analytika pro jednotlivé QR kódy v Dashboardu
- Dashboard: Tlačítko analytiky v seznamu QR kódů nyní otevírá stránku se statistikami příslušného QR kódu na adrese
/dashboard/codes/{id}. - Směrování (Routing): Alias
/dashboard/codesnadále přesměrovává na/dashboard, ale již nezachytává detailní trasy jako/dashboard/codes/{id}. - API: Stránka s podrobnostmi načítá QR kód přímo pomocí
GET /v1/codes/:id; díky tomu již nezávisí na limitech stránkování seznamu. - Testy: Regresní testy pokrývají přesměrování aliasu a přímé načtení kódu.
2026-04 · Dialog pro smazání QR kódu v Dashboardu
- Dashboard: Ikona koše v seznamu QR kódů nyní otevírá vlastní React dialog namísto nativního vyskakovacího okna prohlížeče.
- Zpětná vazba: Po smazání se zobrazí oznámení (toast) o úspěchu nebo chybě.
- Testy:
packages/dashboard/tests/dashboard.test.tszabraňuje regresím uconfirm()v procesu mazání QR kódu.
2026-04 · Testování krátkých odkazů pro dynamické QR kódy v Dashboardu
- Dashboard: Zkrácené kódy (shortcodes) v seznamu QR kódů jsou nyní přímo klikatelné jako externí přesměrovávací odkazy. Ikona externího odkazu vedle např.
wu3qaaotevřehttps://qr3.app/{shortCode}na nové kartě. - i18n: Doplněny texty tooltipů pro němčinu a angličtinu.
- Testy:
packages/dashboard/tests/dashboard.test.tschrání href odkazu, chování na nové kartě,noopener noreferrera ikonu před regresí.
2026-04 · Trasa Redirect-Workeru pro dynamické QR kódy
- Oprava: Dynamické QR kódy na adrese
https://qr3.app/{shortCode}jsou opět zpracovávány Redirect-Workerem. Produkční trasa nyní používáqr3.app/*, protože trasy Cloudflare Workers nepodporují parametry cesty:code. - Zabezpečení (Hardening): Neodpovídající cesty jsou předávány na původní cílovou adresu (landing origin), aby běžné stránky jako
/de/pricingnebyly blokovány Redirect-Workerem. - Testy:
packages/redirect/tests/unit/redirect.test.tsověřuje wildcard trasu, zpracování zkrácených kódů a předávání na origin.
2026-04 · Přehled skenů DPP v pracovním prostoru (Q3.4.2)
- Novinka:
GET /v1/workspace/stats/dpp?days=30— agreguje všechnydpp_scansdaného pracovního prostoru API klíče (active_dpps,scans_by_day,top_dppss názvem produktu/kategorií). - Dashboard: Karta na úvodní stránce (
/dashboard) s 30denním sloupcovým grafem + žebříčky nejlepších — paralelně ke kartám QR kódů. - Veřejné: Marketingový krátký odkaz
GET /dpp/dpp_<id>(jeden segment) pro živá dema, paralelně k/dpp/{gtin}/{serial}.
2026-04 · Analytika skenů DPP (Q3.4.1)
- Novinka:
GET /v1/dpp/:id/stats?days=30— agregované skeny veřejného GS1 resolveru pro jedno DPP. Pole:total_scans,period_scans,scans_by_day,top_countries,top_devices,top_representations. - Novinka: Tabulka
dpp_scans(migrace0011) — oddělená odscans(Redirect-Worker). IP adresy jsou hashovány pomocí denně rotující soli (salt), surové IP adresy se do D1 nikdy nedostanou. - Dashboard: Miniaturní karta s grafem (SVG, bez knihovny pro grafy) na
/dashboard/dpp/:dppIds 30denními sloupci + rozborem top 3. Prázdný stav (empty state), jakmile je DPP aktivní, ale ještě nemá žádné skeny.
2026-04 · Simulátor shody s předpisy EU v reálném čase (Q3.3.7)
- Novinka:
POST /v1/dpp/:id/validate-update— simuluje částečné aktualizace bezstavově (stateless) (status, seznam trhů, …) bez perzistence. Odpověď obsahujeeu_compliance+preview.changed_fields. - Dashboard: Karta simulátoru v detailu DPP (
/dashboard/dpp/:dppId) — štítky (chips) proDE/AT/FR/IT/ES/NL+ vlastní, rozbalovací nabídka stavu, Preview EU impact / Save changes / Reset. Neblokující přes RemixuseFetcher. - Zabezpečení (Hardening): Vyčlenění pomocných funkcí simulátoru (
readUpdatePatchFromForm,marketCountriesKey) + 18 nových unit testů; oprava chyby: osamocený ne-ISO vstup již nemaže seznam trhů.
2026-04 · Náhled shody s předpisy EU v reálném čase ve formuláři pro vytvoření (Q3.3.6)
- Změněno:
POST /v1/dpp/validatenavíc vracíeu_compliance— stejný validátor jakoGET /v1/dpp/:id/eu-compliance, bezstavově před uložením. - Dashboard: Náhled pod stávajícím validačním panelem + nový Save-Guard banner před odesílacími tlačítky, pokud jsou přítomny chyby/varování (i18n pluralizace DE/EN).
2026-04 · EU validátor + textilní UI (Q3.3.4 + Q3.3.5)
- Novinka: Validátor shody s předpisy EU s 5 textilními pravidly (
TEXTILE_AGEC_REQUIRED,TEXTILE_MICROPLASTICS_CONSISTENCY,TEXTILE_SVHC_THRESHOLD,TEXTILE_GREENWASHING,TEXTILE_ESPR_READY). - Novinka:
GET /v1/dpp/:id/eu-compliancescompliant/espr_ready/issues[]/summary. - Dashboard: Sekce shody s předpisy EU v detailu DPP (souhrnné dlaždice, seskupené karty problémů, štítek ESPR-Ready v hlavičce).
2026-04 · Schéma textilního DPP (Q3.3.1–Q3.3.3)
- Novinka: Kategorie
textiles povinným řetězcem AGEC (tkaní/pletení → barvení/potisk → konfekce), pro každé vláknoorigin_country+recycled_pct,svhc_substances[], ESPR-Opt-in (PEF, životnost, recyklovatelnost). - Novinka: Základní pole
market_countries: string[](ISO 3166-1 alpha-2) u všech kategorií DPP — řídí specifická pravidla AGEC pro Francii a povinné francouzské upozornění pro spotřebitele. - Novinka: HTML šablona pro spotřebitele s varovným boxem AGEC na mikroplasty, 3stupňovým řetězcem původu (štítky s vlajkami), seznamem SVHC a sekcemi pro odolnost (durability) a recyklovatelnost (recyclability).
- Migrace:
0010_dpp_market_countries(D1).
2026-04 · Hromadný import DPP (Q3.2.1–Q3.2.5)
- Novinka:
POST /v1/dpp/importpřijímá CSV a XLSX (kompatibilní s Workers díky SheetJSxlsx, ~283 KB gzip balíček). - Škálování: limit podle tarifu (Free 100 → Enterprise 10k) + dávkování
db.batch()po 100 + limit velikosti požadavku (body limit) 5 MB. - Novinka: Chybový report jako CSV v poli
errors_csvodpovědi 201;GET /v1/dpp/import/templates/:category?format=csv|xlsxposkytuje hotové šablony pro baterie a textil. - Dashboard: Nahrávání přetažením (drag-and-drop) na
/dashboard/dpp/imports proxy šablon a přímým stahováním CSV.
Změny bez dopadu na zpětnou kompatibilitu (Non-Breaking) — rozšíření LTS
Všechny výše uvedené změny jsou aditivní (doplňující):
- Stávající klienti
POST /v1/dpp/validateignorují nové poleeu_compliancebez nutnosti úprav. - Stávající procesy pro
battery(baterie) zůstávají nezměněny. - Pole
market_countriesje volitelné a jeho výchozí hodnota je[].
Viz Verzování API pro zásady zpětné kompatibility (Breaking-Change-Policy).