Skip to content

Changelog

Changelog

Odabrani naglasci iz nedavnih izdanja. Za potpune verzije API-ja i pravila o prekinutim promjenama pogledajte Verzioniranje API-ja i LTS pravila.

Detaljne promjene na pojedinačnim krajnjim točkama: OpenAPI specifikacija i interaktivna API referenca.


2026-10 · Boje na Nadzornoj ploči

  • Novo: stranica s pojedinostima koda ima karticu Boje: prednji plan i pozadina kao hex vrijednost, prozirna pozadina, pregled putem stvarne rute slike. Provjera je ista kao kod PATCH /v1/codes/{id}: kritični parovi traže potvrdu, parovi ispod 1,5:1 ne mogu se spremiti.
  • Vraćanje na crno na bijelom u sva četiri formata ponovno daje iste bajtove kao bez boja. Kodovi bez boja se ne mijenjaju.
  • Prozirni kodovi prikazuju se na šahovskoj podlozi u svim pregledima na Nadzornoj ploči. Pojedinosti: Boje na Nadzornoj ploči.

2026-10 · Boje u PDF-u i EPS-u

  • Novo: qr.pdf i qr.eps iscrtavaju fg i bg, kao parametre i kao spremljene boje. Crna i svaka siva boja zapisuju se kao sivi ton (samo crna ploča), svaka druga boja kao CMYK u cijelim postocima, primjerice 1F4E79 kao C74 M36 Y0 K53.
  • Pozadina kao kod SVG-a: Čim se odabere boja, iza koda i njegove tihe zone nalazi se neprozirna površina, bijela ili bg. bg=transparent ne iscrtava ništa. Naslov ostaje crn, a ploča s logotipom bijela.
  • Bez promjena bez boja: Bez fg/bg i bez spremljenih boja, oba formata isporučuju iste bajtove kao i prije. PDF putovnice proizvoda ostaje neobojan.
  • Ograničenja: bez ICC profila, bez PDF/X. Pojedinosti: Boje u tisku.

2026-09 · Statični kodovi bez predmemorije preusmjeravanja, istovremeno brisanje

  • Izmijenjeno: Statični kodovi više se ne nalaze u predmemoriji preusmjeravanja. Poziv njihove kratke poveznice (redirect_url) uvijek čita trenutačno stanje. Nakon DELETE /v1/account statični kod stoga pri sljedećem pozivu više ne preusmjerava, dok je prije to trajalo do 24 sata. Također, promjena tarife odmah utječe na statične kodove. Brisanje računa uklanja dinamične kodove kao i do sada. Tiskani statični kodovi izravno sadrže svoje odredište i na njih ovo ne utječe.
  • Ispravljeno: Dva istovremena zahtjeva DELETE /v1/codes/:id za isti kod vraćaju jednom 200 i jednom 404. Webhook qr.deleted šalje se točno jednom, dok se prije slao dvaput.
  • Novo: POST i DELETE /v1/codes/:id/logo odgovaraju s 409 (errors/conflict) ako je drugi zahtjev istovremeno promijenio logotip istog koda, te tada ne mijenjaju ništa. Prije je preneseni logotip mogao ostati spremljen a da se ne koristi. Dva istovremena zahtjeva DELETE /v1/codes/:id/logo oba vraćaju 200. Detalji: Logo.

2026-09 · TypeScript-SDK 1.2.0

  • Novo u @qr3/sdk 1.2.0: client.codes.update() prihvaća appearance i vraća nalaze provjere kontrasta kao issues u rezultatu; bez nalaza ovo polje nedostaje. client.codes.imageUrl() prihvaća fg, bg i ecc. Svaki kod koji API vraća (get, list, create, update, batchCreate) sadrži title i appearance.
  • Ažuriranje: npm install @qr3/sdk@latest. Python, Go i PHP slijede. Detalji: SDKs & CLI i Spremanje boja na kodu.

2026-09 · Izmijenjeno vrijeme isteka primjenjuje se unutar otprilike jedne minute

  • Ispravljeno: PATCH na expires_at sada prazni predmemoriju preusmjeravanja koda. Novo vrijeme isteka time se primjenjuje unutar otprilike jedne minute umjesto tek do 24 sata kasnije. Prethodno je uklonjeno ili odgođeno vrijeme isteka i dalje vraćalo 410 do 24 sata, a istek postavljen na trenutno vrijeme omogućavao je preusmjeravanju da nastavi raditi do 24 sata.
  • Ispravljeno: Kod kreiran s expires_at istječe točno na vrijeme čak i ako je vrijeme isteka unutar prva 24 sata.
  • Ispravljeno: Ako se kod obriše dok se njegov logotip učitava ili uklanja, POST i DELETE /v1/codes/:id/logo odgovaraju s 404 i ne mijenjaju obrisani kod, baš kao i PATCH.
  • Ispravljeno: Čak i statički kod čija je kratka poveznica (redirect_url) bila pozvana nalazi se u predmemoriji preusmjeravanja. Izmjena, pauziranje i brisanje sada ga također čiste iz predmemorije, a ne samo kod dinamičkih kodova.

2026-09 · Spremanje boja na kodu

  • Novo: PATCH /v1/codes/:id prihvaća appearance s foreground_color i background_color (#RRGGBB, pozadina također transparent). qr.svg i qr.png iscrtavaju spremljene boje bez parametara; parametar upita kao što je ?fg=000000 i dalje ima prednost. PDF i EPS iscrtavaju boje tek u kasnijem izdanju.
  • Provjera kontrasta: Par ispod 1,5:1 rezultira s 422. Slabiji parovi se spremaju i prijavljuju u meta.issues kao warning ili critical; transparentna pozadina je uvijek critical, nikada blokirana.
  • Spajanje: Izostavljena polja zadržavaju svoju spremljenu vrijednost, null resetira vrijednost. Istovremene promjene na istom kodu više se međusobno ne prepisuju.
  • U svakom odgovoru koda: appearance se nalazi u svakom odgovoru koda i u webhookovima qr.created i qr.updated. POST, batch i uvoz odbijaju ga s 422.
  • Bez promjena za postojeće kodove: Bez spremljenih boja, svaki kod isporučuje iste bajtove kao i prije. Pojedinosti: Spremanje boja na kodu.

2026-09 · Boje i ispravak pogrešaka kao parametri ruta slika

  • Novo: Sve četiri rute slika prihvaćaju fg (boja prednjeg plana), bg (boja pozadine ili transparent) i ecc (ispravak pogrešaka L, M, Q, H). SVG i PNG iscrtavaju boje; PDF i EPS ih prihvaćaju, ali će ih iscrtavati tek u kasnijem izdanju. ecc djeluje u sva četiri formata, a logotip i dalje nameće H.
  • Prozirno: bg=transparent vraća SVG bez pozadine i PNG sa stvarnim alfa kanalom. Podloga mora biti svijetla i ostaviti tihu zonu slobodnom.
  • Nikada pogreška: Nevaljane vrijednosti se zanemaruju; slika se tada isporučuje točno kao i bez parametara.
  • Predmemorija: Svaki aktivni parametar vraća Cache-Control: public, max-age=300 umjesto 24 sata standardne slike.
  • Nema promjene ponašanja bez parametara: Svaki postojeći kod vraća iste bajtove u sva četiri formata kao i prije.
  • Dostupno u svakoj tarifi. Pojedinosti: Boje i ispravak pogrešaka.

2026-09 · PDF i EPS sada također ugrađuju logotip

  • Proširenje: qr.pdf i qr.eps sada ugrađuju postavljeni logotip na isti način kao i qr.svg i qr.png (vidi dolje) — kao ugrađenu sliku (PDF putem Image XObject, EPS putem rječnika slika u PostScriptu, tamo samo s %%LanguageLevel: 3), centrirano na istoj površini, s istim povećanjem ispravljanja pogrešaka na H. Oba formata prethodno nisu isporučivala logotip; to je sada ispravljeno.
  • Predmemorija: S postavljenim logotipom, qr.pdf i qr.eps sada također isporučuju Cache-Control: public, max-age=300 umjesto inače uobičajenih 24 sata — baš kao i SVG/PNG.
  • Rezervna opcija: Ako se sama slika logotipa ne može obraditi (na primjer, oštećeni spremljeni objekt), ispravljanje pogrešaka ostaje H, ali rezervirana površina ostaje prazna umjesto slike — nikada se ne događa pogreška poslužitelja.
  • Nema promjene ponašanja bez logotipa: Kodovi bez logotipa i dalje isporučuju qr.pdf/qr.eps bajt-identično, s nepromijenjenom predmemorijom od 24 sata.
  • Detalji i upute za ispis: Logo u QR kodu.

2026-09 · Logo u QR kodu — Nadzorna ploča i API

  • Novo: Kod sada može imati logo u sredini. Na Nadzornoj ploči, stranica s pojedinostima koda stvara vlastitu karticu za logo: Odaberi logo, prilikom prvog dodavanja ili uklanjanja potvrdite upozorenje s obveznim kvačicama (oboje mijenja uzorak točaka), zatim Učitaj logo/Ukloni logo. Zamjena ne zahtijeva potvrdu — mijenja se samo slika, ne i uzorak. Uloga viewer vidi status i pregled, ali ne i tri navedene akcije.
  • API: POST /v1/codes/{id}/logo (multipart polje file; PNG, JPEG ili WebP, najviše 1 MB, SVG se odbija) stvara ili zamjenjuje logo; DELETE /v1/codes/{id}/logo ga ponovno uklanja i idempotentno je. Prevelika slika vraća 413, nepodržani format 422, a uloga viewer 403.
  • Renderiranje: qr.svg i qr.png ugrađuju logo kao stvarne piksele (512 × 512, normalizirano) i za to podižu ispravljanje pogrešaka na H. Dodavanje i uklanjanje time mijenjaju uzorak točaka (M ↔ H), dok zamjena ne mijenja. qr.pdf i qr.eps ne ugrađuju logo i ostaju nepromijenjeni. Već ispisani kod u svakom slučaju nastavlja raditi jer kodirano odredište ne ovisi o logotipu — ponovno ispisati moraju samo oni koji žele vidjeti (novi) izgled logotipa i na materijalu, pazeći pritom da ne pomiješaju stare i nove datoteke za ispis.
  • Predmemorija: S postavljenim logotipom qr.svg i qr.png isporučuju Cache-Control: public, max-age=300 umjesto uobičajenih 24 sata. Pojedinosti, granične vrijednosti i savjeti za ispis: Logo u QR kodu.

2026-08 · operationId za svih 75 operacija i upute “kada koristiti” za agente

  • Dodatak: Svih 75 operacija u OpenAPI specifikaciji sada ima operationId — listCodes, createCode, getCodeStats, archiveWorkspace i tako dalje. Dosad je to polje u potpunosti nedostajalo, pa je svaki generator morao izvoditi naziv metode iz HTTP metode i putanje (postV1Codes). Takvi nazivi ovise o putanji i mijenjaju se sa svakom izmjenom putanje. Format naziva isti je na svih 75 mjesta: list/get/create/update/replace/delete, inače glagol poslovne radnje (validateDpp, registerGs1Identifier, pingWebhook). Glagol prati poslovnu logiku, a ne HTTP metodu — archiveWorkspace je DELETE, importDpps je POST.
  • Utjecaj na samostalno generirane klijente: Svatko tko generira svoj SDK iz specifikacije dobit će preimenovane metode (postV1Codes → createCode) pri sljedećem pokretanju. To je svrha ove promjene, ali radi se o preimenovanju u tuđem kodu — stoga se ovdje izričito spominje. Putanje, parametri, formati odgovora i statusni kodovi ostaju nepromijenjeni; službeni SDK-ovi, CLI i MCP poslužitelji nisu pogođeni.
  • Početna točka za agente: https://qr3.app/llms.txt ima odjeljak ## When to use qr3.app — šest zadataka umjesto šest funkcija, plus rečenicu o tome za što qr3.app nije pravi alat. Istu informaciju MCP poslužitelj sada pruža prilikom rukovanja: initialize prema https://mcp.qr3.app/mcp odgovara s poljem instructions (prije: jedanaest alata bez ikakve klasifikacije). Također je navedeno koji pozivi zahtijevaju API ključ — initialize i tools/list ne, dok svaki tools/call zahtijeva.
  • Ispravci u llms.txt: Četiri podatka provjerena su u produkciji i pokazala su se netočnima: (1) Python SDK qr3app nije objavljen na PyPI — redak pip install uklonjen je bez zamjene; (2) Accept: text/markdown vrijedi za početnu stranicu i blog, a ne za svaku stranicu renderiranu na poslužitelju; (3) kontakt adresa je [email protected], uključujući i u JSON-LD-u početne stranice; (4) /de/security/ je preusmjeravanje na sidro, a ne zasebna stranica. Nova poveznica: docs.qr3.app/de/skills/.
  • Osiguranje: Tri tvrdnje u openapi-spec.test.ts — potpunost, jedinstvenost, lowerCamelCase —, svaka provjerena mutacijom. Devet dodatnih testova bilježi četiri ispravljena podatka kako se ne bi ponovno pojavili.
  • Poznato ograničenje: Dvije od 75 operacija opisane su u specifikaciji, ali odgovaraju s 404 (GET /v1/codes/{id}/stats i GET /v1/account). Ovdje su dobile naziv, a izgubit će ga čim se odluči hoće li biti implementirane ili uklonjene.

2026-08 · Smanjenja tarifa i otkazivanja sada utječu i na limite

  • Ispravak: Stripe-webhook je pri promjeni plana i otkazivanju zapisivao samo naziv plana, a ne četiri stupca limita organizacije (max_workspaces, max_members, max_dynamic_codes, max_scans_per_month). Budući da se pri primjeni uzima maksimum između spremljene vrijednosti i osnovne vrijednosti plana (baseline), organizacija koja je smanjila paket ili ga otkazala zadržala bi svoje stare, više limite — smanjenje (downgrade) je bilo bez učinka. Webhook sada postavlja stupce na osnovnu vrijednost (baseline) nove tarife pri svakoj stvarnoj promjeni plana, a pri otkazivanju na besplatnu (Free) osnovnu vrijednost — točno onako kako to već čini administratorsko upravljanje.
  • Ponašanje: Rutinska ažuriranja pretplate (produljenje, način plaćanja, proračunavanje/proration) i dalje ne utječu na limite; individualno odobreni viši limiti ostaju nepromijenjeni. Tek stvarna promjena plana vraća ih na osnovnu vrijednost (baseline) nove tarife.
  • Utjecaj: Nema promjena u API-ju ili formatu odgovora. Organizacije čije je smanjenje (downgrade) uslijedilo prije ovog ispravka zadržat će stare vrijednosti sve dok ne stupi na snagu sljedeća promjena plana ili dok ih podrška ne prilagodi.

2026-08 · Keyset kursor sada na svim endpointima popisa

  • Ispravak: Ispravak kursora za GET /v1/codes i GET /v1/dpp (vidi dolje) sada je primijenjen na sve preostale popise s paginacijom pomoću kursora: GET /v1/qr-codes/:id/comments, /v1/workspaces, /v1/gs1/identifiers, /v1/members, /v1/audit-logs, /v1/admin/orgs, /v1/admin/users i /v1/webhooks/:id/deliveries. Svi su listali isključivo prema created_at; redovi s identičnim vremenskim oznakama (zapisi revizije skupne operacije, ponovni pokušaji webhooka, uvozi članova) mogli su se izgubiti na sljedećoj stranici. Ključ sortiranja sada je posvuda torka (created_at, id).
  • Promjena API-ja: Na ovim popisima meta.pagination.next_cursor od sada je također neprozirna vrijednost (base64url) umjesto same vremenske oznake; nečitljivi kursori vraćaju 400, a stari kursori s vremenskom oznakom privremeno se i dalje prihvaćaju. Iznimka je GET /v1/webhooks/:id/deliveries: tamo next_cursor ostaje ID zadnje isporuke (nepoznati ID → prva stranica). Klijenti koji vraćaju next_cursor nepromijenjen — nadzorna ploča, CLI, SDK-ovi, MCP — ne moraju ništa mijenjati.
  • Utjecaj: Nije potrebna migracija. Ako su vam u nekom od ovih popisa (npr. zapisnik revizije ili zapisnik isporuka na nadzornoj ploči) nedostajali zapisi prilikom listanja: nikada nisu nestali — popisi ih od sada prikazuju u cijelosti.

2026-08 · Vremenske oznake nakon uređivanja i brisanja ponovno usklađene s OpenAPI

  • Ispravak: Nakon PATCH /v1/codes/{id}, updated_at se vraćao u SQLite formatu bez vremenske zone (2026-08-17 09:00:00), iako OpenAPI specifikacija obećava format: date-time, a kreiranje (POST) isporučuje ISO vremensku oznaku (2026-08-17T09:00:00.000Z). Isto je vrijedilo za deleted_at/updated_at kod soft-deletea, kao i za putanje uređivanja/brisanja za API ključeve, organizacije, radne prostore, članove, komentare i webhookove, te dodatno za last_used_at API ključeva i last_triggered_at webhookova. Sve putanje pisanja sada zapisuju ISO 8601 (UTC, T i Z).
  • Utjecaj: Klijenti koji analiziraju updated_at pomoću new Date(...) (SDK-ovi, CLI, nadzorna ploča) čitali su format s razmakom kao lokalno vrijeme — CLI je za jednom uređene kodove prikazivao vrijeme pomaknuto za lokalno odstupanje (Beč: −2 h). To je ispravljeno. Dodatno, migracija podataka normalizira već pohranjene vrijednosti u starom formatu na ISO, kako bi sortiranje i usporedbe u mješovitim podacima bili ispravni. Nema promjena u nazivima polja ili strukturi odgovora.
  • Pozadina: Ista klasa pogreške kao i dva ispravka u nastavku (istek API ključa, granica ponovnog skeniranja): SQLite-ov datetime('now') zapisuje YYYY-MM-DD HH:MM:SS, dok svi ostali zapisivači koriste ISO 8601. Guard test izvornog koda spriječit će buduće pojave.

2026-08 · Paginacija popisa više ne gubi batch kodove

  • Ispravak: GET /v1/codes i GET /v1/dpp koristili su paginaciju isključivo putem created_at. Međutim, kodovi iz POST /v1/codes/batch, POST /v1/dpp/batch i CSV/XLSX uvoza dijele jednu vremensku oznaku — čim je batch bio veći od limit (zadano 20), druga stranica više nije vraćala preostale retke s istom vremenskom oznakom. Kodovi su postojali i bili su dostupni putem GET /v1/codes/:id, ali se nikada nisu pojavljivali na popisu (nadzorna ploča, CLI qr3 list, SDK-ovi, MCP). Kursor je sada skup ključeva (keyset) preko (created_at, id).
  • Promjena API-ja: meta.pagination.next_cursor od sada je neprozirna vrijednost (base64url) umjesto obične vremenske oznake. Svatko tko vraća kursor nepromijenjen kao ?cursor= — kao što to čine nadzorna ploča, CLI, svi SDK-ovi i MCP poslužitelj — ne mora ništa mijenjati. Stari kursori s vremenskom oznakom i dalje će se privremeno prihvaćati; nečitljivi kursori sada vraćaju 400 umjesto prešutnog vraćanja prve stranice.
  • Utjecaj: Ako ste nakon batch uvoza na popisu vidjeli manje kodova nego što ih je stvoreno: kodovi nikada nisu nestali — popis ih od sada prikazuje u cijelosti. Nije potrebna migracija.

2026-08 · Sigurnosna ponovna skeniranja ponovno se izvode u 24-satnom ciklusu

  • Ispravak: Periodičko ponovno skeniranje ciljnih URL-ova i poveznica landing stranica (Google Web Risk) preskakalo je kodove čije je posljednje skeniranje bilo na isti kalendarski dan kao i 24-satna granica — ovisno o dobu dana, ponovno skeniranje odgađalo se za još najviše jedan dan. Granica se sada izračunava u istom ISO formatu u kojem su pohranjene vremenske oznake skeniranja.
  • Utjecaj: Ciljni URL koji se nakon posljednjeg skeniranja klasificira kao nesiguran ponovno dovodi do automatskog pauziranja koda unutar dokumentiranog 24-satnog prozora. Nema promjena u API-ju ili formatu odgovora.

2026-08 · API ključevi istječu u trenutku isteka

  • Ispravak: API ključ čiji je expires_at bio na isti dan nastavio se prihvaćati do ponoći UTC. Istek se sada uspoređuje kao vremenska oznaka umjesto kao tekstualni niz — istekli ključ odmah vraća 401.
  • Pozadina: expires_at se pohranjuje kao ISO vremenska oznaka (2026-08-14T09:00:00Z), dok je strana za usporedbu isporučivala format s razmakom (2026-08-14 09:00:00). Usporedba sirovih tekstualnih nizova stoga je bila točna samo dok se već i sam datum razlikovao.
  • Utjecaj: Nije potrebna migracija, format odgovora za GET /v1/api-keys ostaje nepromijenjen. Nečitljive vrijednosti isteka sada se smatraju isteklima umjesto valjanima.

2026-08 · API referenca: Dokumentirano upravljanje tenantima

  • OpenAPI: Specifikacija — a time i interaktivna referenca — sada dokumentira organizacije (uklj. GET /v1/organizations/usage), radne prostore, članove i uloge i revizijske zapisnike.
  • Billing: Pregled tarifa (GET /v1/billing/plans) je javan; Checkout (POST /v1/billing/checkout) i Stripe korisnički portal (GET /v1/billing/portal) označeni su kao krajnje točke za administratore organizacije.
  • Izvoz skeniranja: Statistika skeniranja (GET /v1/codes/{id}/scans) i izvoz sirovih podataka (…/scans.csv, …/scans.xlsx) potpuno su dokumentirani — uključujući napomenu o GDPR-u: ip_hash nikada nije uključen u izvoz.
  • Ponašanje pri pogreškama: Također je novo dokumentiran 400 odgovor validacije zahtjeva: tijelo (body) je sirova Zod pogreška, a ne RFC-7807 dokument o problemu — ipak se isporučuje pod Content-Type application/problem+json.

2026-08 · Kopiranje javnih poveznica na datoteke

  • Nadzorna ploča: Javne datoteke na stranici s detaljima koda sada imaju gumb koji njihovu javnu poveznicu kopira u međuspremnik – odmah spremnu za upotrebu kao ciljni URL QR koda kada skeniranje treba otvoriti određeni dokument umjesto landing stranice s popisom datoteka.
  • API: Krajnje točke za datoteke (/v1/files) dodatno isporučuju public_url. Polje je postavljeno samo za datoteke s visibility: public – privatne datoteke ne dobivaju javnu adresu.
  • Ponašanje: Poveznica ne zahtijeva prijavu i otvara datoteku izravno u pregledniku. Opcija Zamijeni ne mijenja tu poveznicu, pa tiskani kod ostaje valjan. Pojedinosti: Datoteke i tehnički listovi.

2026-07 · Timske uloge: Suradnik bez brisanja i administratorska naplata

  • Novo: Članska uloga Suradnik (bez brisanja) — stvara i uređuje QR kodove, datoteke i Digital Product Passports, ali ne može ništa brisati niti stvarati API ključeve. Svi destruktivni endpointi provjeravaju ulogu na strani poslužitelja (403).
  • Naplata: Nadogradnje tarifa i Stripe korisnički portal (POST /v1/billing/checkout, GET /v1/billing/portal) sada su rezervirani isključivo za organizacijske Administratore — sve ostale uloge vide pregled tarifa samo za čitanje.
  • Nadzorna ploča: Radnje koje korisnička uloga ne dopušta automatski se skrivaju: Pregledatelj tako ne vidi gumbe za stvaranje, uređivanje ili brisanje, dok popisi, preuzimanja i statistike ostaju vidljivi. Pojedinosti: Tim i uloge.

2026-06 · Vanjske poveznice na landing stranici koda

  • Landing stranica: qr3-hostana landing stranica koda sada može navesti vanjske, samostalno hostane poveznice ({ label, url }) uz prenesene datoteke ili umjesto njih – primjerice za tehničke listove na vašoj vlastitoj stranici.
  • API: POST/PATCH /v1/codes prihvaćaju polje links (0–20 unosa, http(s), ≤ 2048 znakova). Svaki URL provjerava se pomoću Google Web Risk; nesiguran URL vraća 422. Prazno polje briše sve poveznice.
  • Nadzorna ploča: Dodavanje, promjena redoslijeda i uklanjanje poveznica na stranici s detaljima koda.
  • Sigurnost: Prikazane poveznice ostaju sigurne od XSS-a (escapirane, samo http(s)) i stranica zadržava svoje noindex zaglavlje.

2026-04 · Analitika nadzorne ploče po QR kodu

  • Nadzorna ploča: Gumb za analitiku na popisu QR kodova sada otvara stranicu sa statistikama za odgovarajući QR kod na /dashboard/codes/{id}.
  • Usmjeravanje: Alias /dashboard/codes i dalje preusmjerava na /dashboard, ali više ne presreće detaljne rute poput /dashboard/codes/{id}.
  • API: Stranica s detaljima učitava QR kod izravno putem GET /v1/codes/:id; time više ne ovisi o ograničenjima paginacije popisa.
  • Testovi: Regresijski testovi pokrivaju preusmjeravanje aliasa i izravno učitavanje koda.

2026-04 · Dijalog za brisanje QR kodova na nadzornoj ploči

  • Nadzorna ploča: Ikona kante za smeće na popisu QR kodova sada otvara namjenski React dijalog umjesto izvornog skočnog prozora preglednika.
  • Povratna informacija: Nakon brisanja pojavljuje se toast obavijest o uspjehu ili pogrešci.
  • Testovi: packages/dashboard/tests/dashboard.test.ts sprječava regresije na confirm() u tijeku brisanja QR koda.

2026-04 · Test kratkih poveznica na nadzornoj ploči za dinamičke QR kodove

  • Nadzorna ploča: Kratki kodovi (shortcodes) na popisu QR kodova sada se mogu izravno kliknuti kao vanjske poveznice za preusmjeravanje. Ikona vanjske poveznice pokraj npr. wu3qaa otvara https://qr3.app/{shortCode} u novoj kartici.
  • i18n: Dodani tekstovi opisa (tooltips) za njemački i engleski jezik.
  • Testovi: packages/dashboard/tests/dashboard.test.ts štiti href poveznice, ponašanje nove kartice, noopener noreferrer i ikonu od regresija.

2026-04 · Ruta Redirect Workera za dinamičke QR kodove

  • Ispravak: Dinamički QR kodovi na https://qr3.app/{shortCode} ponovno se obrađuju putem Redirect Workera. Produkcijska ruta sada koristi qr3.app/* jer Cloudflare rute Workera ne podržavaju parametre staze :code.
  • Učvršćivanje: Nepodudarne staze prosljeđuju se na izvorište odredišne stranice (landing origin) kako normalne stranice poput /de/pricing ne bi bile blokirane od strane Redirect Workera.
  • Testovi: packages/redirect/tests/unit/redirect.test.ts provjerava zamjensku (wildcard) rutu, obradu kratkog koda i prosljeđivanje izvorištu (origin pass-through).

2026-04 · Pregled DPP skeniranja za radni prostor (Q3.4.2)

  • Novo: GET /v1/workspace/stats/dpp?days=30 — agregira sva dpp_scans skeniranja radnog prostora API ključa (active_dpps, scans_by_day, top_dpps s nazivom proizvoda/kategorijom).
  • Nadzorna ploča: Kartica na početnoj stranici (/dashboard) s 30-dnevnim stupčastim grafikonom + top listama — paralelno s karticama QR kodova.
  • Javno: Marketinška kratka poveznica GET /dpp/dpp_<id> (jedan segment) za demonstracije uživo, paralelno s /dpp/{gtin}/{serial}.

2026-04 · Analitika DPP skeniranja (Q3.4.1)

  • Novo: GET /v1/dpp/:id/stats?days=30 — agregirana skeniranja javnog GS1 resolvera po DPP-u. Polja: total_scans, period_scans, scans_by_day, top_countries, top_devices, top_representations.
  • Novo: Tablica dpp_scans (migracija 0011) — odvojena od scans (Redirect Worker). IP adrese se hashiraju s dnevno rotirajućom soli (salt), sirove IP adrese nikada ne dolaze do D1.
  • Nadzorna ploča: Mini kartica s grafikonom (SVG, bez biblioteke za grafikone) na /dashboard/dpp/:dppId s 30-dnevnim stupcima + top 3 raščlambe. Prikaz praznog stanja (empty-state) čim je DPP aktivan, ali još nema skeniranja.

2026-04 · Simulator usklađenosti s EU propisima uživo (Q3.3.7)

  • Novo: POST /v1/dpp/:id/validate-update — simulira djelomična ažuriranja bez stanja (stateless) (status, popis tržišta, …) bez perzistencije. Odgovor sadrži eu_compliance + preview.changed_fields.
  • Nadzorna ploča: Kartica simulatora u detaljima DPP-a (/dashboard/dpp/:dppId) — oznake (chips) za DE/AT/FR/IT/ES/NL + prilagođeno, padajući izbornik statusa, Preview EU impact / Save changes / Reset. Neblokirajuće putem Remix useFetcher.
  • Učvršćivanje: Izdvojeni pomoćni alati simulatora (readUpdatePatchFromForm, marketCountriesKey) + 18 novih jediničnih testova; ispravak pogreške: samostalni unos koji nije u ISO formatu više ne briše popis tržišta.

2026-04 · Pregled usklađenosti s EU propisima uživo u obrascu za izradu (Q3.3.6)

  • Izmijenjeno: POST /v1/dpp/validate dodatno isporučuje eu_compliance — isti validator kao GET /v1/dpp/:id/eu-compliance, bez stanja (stateless) prije spremanja.
  • Nadzorna ploča: Pregled ispod postojećeg panela za validaciju + novi Save-Guard-Banner ispred gumba za slanje ako postoje otvorene pogreške/upozorenja (i18n pluralizacija DE/EN).

2026-04 · EU validator + tekstilno sučelje (Q3.3.4 + Q3.3.5)

  • Novo: Validator usklađenosti s EU propisima s 5 tekstilnih pravila (TEXTILE_AGEC_REQUIRED, TEXTILE_MICROPLASTICS_CONSISTENCY, TEXTILE_SVHC_THRESHOLD, TEXTILE_GREENWASHING, TEXTILE_ESPR_READY).
  • Novo: GET /v1/dpp/:id/eu-compliance s compliant / espr_ready / issues[] / summary.
  • Nadzorna ploča: Odjeljak za usklađenost s EU propisima u detaljima DPP-a (sažeti prikazi, grupirane kartice problema, ESPR-Ready značka u zaglavlju).

2026-04 · Shema tekstilnog DPP-a (Q3.3.1–Q3.3.3)

  • Novo: Kategorija textile s obveznim AGEC lancem (tkanje/pleenje → bojenje/tisak → konfekcija), po vlaknu origin_country + recycled_pct, svhc_substances[], ESPR-Opt-in (PEF, životni vijek, mogućnost recikliranja).
  • Novo: Osnovno polje market_countries: string[] (ISO 3166-1 alpha-2) na svim DPP kategorijama — upravlja specifičnim francuskim AGEC pravilima i obveznom napomenom za francuske potrošače.
  • Novo: HTML predložak za potrošače s AGEC okvirom upozorenja za mikroplastiku, trostupanjskim lancem podrijetla (oznake sa zastavicama), SVHC popisom te odjeljcima za trajnost i mogućnost recikliranja.
  • Migracija: 0010_dpp_market_countries (D1).

2026-04 · Skupni uvoz DPP-a (Q3.2.1–Q3.2.5)

  • Novo: POST /v1/dpp/import prihvaća CSV i XLSX (kompatibilno s Workerima putem SheetJS xlsx, ~283 KB gzip paket).
  • Skalirano: ograničenje temeljeno na pretplati (Free 100 → Enterprise 10k) + podijeljeni db.batch() u serijama od 100 + ograničenje tijela zahtjeva od 5 MB.
  • Novo: Izvješće o pogreškama kao CSV u polju errors_csv odgovora 201; GET /v1/dpp/import/templates/:category?format=csv|xlsx pruža gotove predloške za baterije i tekstil.
  • Nadzorna ploča: Drag-and-drop prijenos na /dashboard/dpp/import s proxyjem predloška i ugrađenim preuzimanjem CSV-a.

Bez prekidanja kompatibilnosti — LTS proširenja

Sve gore navedene promjene su aditivne:

  • Postojeći klijenti koji koriste POST /v1/dpp/validate zanemaruju novo polje eu_compliance bez potrebe za izmjenama.
  • Postojeći battery tijekovi ostaju nepromijenjeni.
  • market_countries je opcionalno polje i zadano je postavljeno na [].

Pogledajte Verzioniranje API-ja za pravila o prekinutim promjenama.