Skip to content

Dnevnik sprememb

Dnevnik sprememb

Izbrani poudarki zadnjih izdaj. Za celotne različice API-ja in pravilnik o prelomnih spremembah si oglejte Različice API-ja in pravilnik LTS.

Podrobne spremembe posameznih končnih točk: Specifikacija OpenAPI in interaktivno referenco API.


2026-10 · Barve na nadzorni plošči

  • Novo: stran s podrobnostmi kode ima kartico Barve: ospredje in ozadje kot šestnajstiška vrednost, prosojno ozadje, predogled prek resnične poti slike. Preverjanje je enako kot pri PATCH /v1/codes/{id}: kritični pari zahtevajo potrditev, parov pod 1,5:1 ni mogoče shraniti.
  • Ponastavitev na črno na belem v vseh štirih formatih spet vrne enake bajte kot brez barv. Kode brez barv se ne spremenijo.
  • Prosojne kode so v vseh predogledih na nadzorni plošči prikazane na šahovnici. Podrobnosti: Barve na nadzorni plošči.

2026-10 · Barve v PDF in EPS

  • Novo: qr.pdf in qr.eps izrisujeta fg in bg kot parametra in kot shranjene barve. Črna in vsaka siva se zapišeta kot sivine (samo črna plošča), vsaka druga barva pa kot CMYK v celih odstotkih, na primer 1F4E79 kot C74 M36 Y0 K53.
  • Ozadje kot pri SVG: Takoj ko je izbrana barva, se za kodo in njenim tihim območjem nahaja prekrivna površina, bela ali bg. bg=transparent ne izriše nobene. Naslov ostane črn, plošča z logotipom pa bela.
  • Brez sprememb brez barv: Brez fg/bg in brez shranjenih barv oba formata vrneta enake bajte kot prej. PDF potnega lista izdelka ostane neobarvan.
  • Omejitve: brez profila ICC, brez PDF/X. Podrobnosti: Barve v tisku.

2026-09 · Statične kode brez predpomnilnika preusmeritev, sočasno brisanje

  • Spremenjeno: Statične kode niso več v predpomnilniku preusmeritev. Klic njihove kratke povezave (redirect_url) vedno prebere trenutno stanje. Po DELETE /v1/account statična koda ob naslednjem klicu zato ne preusmerja več, prej pa se je to lahko dogajalo do 24 ur. Tudi sprememba naročniškega paketa pri statičnih kodah začne veljati takoj. Izbris računa počisti dinamične kode kot do sedaj. Natisnjene statične kode neposredno vsebujejo svoj cilj in to nanje ne vpliva.
  • Odpravljeno: Dve sočasni zahtevi DELETE /v1/codes/:id za isto kodo vrneta enkrat 200 in enkrat 404. Webhook qr.deleted se pošlje natanko enkrat, prej dvakrat.
  • Novo: POST in DELETE /v1/codes/:id/logo odgovorita s 409 (errors/conflict), če je druga zahteva sočasno spremenila logotip iste kode, in nato ne spremenita ničesar. Prej je naložen logotip lahko ostal shranjen, ne da bi bil uporabljen. Dve sočasni zahtevi DELETE /v1/codes/:id/logo obe vrneta 200. Podrobnosti: Logotip.

2026-09 · TypeScript-SDK 1.2.0

  • Novo v @qr3/sdk 1.2.0: client.codes.update() sprejme appearance in vrne ugotovitve preverjanja kontrasta kot issues v rezultatu; brez ugotovitev to polje manjka. client.codes.imageUrl() sprejme fg, bg in ecc. Vsaka koda, ki jo vrne API (get, list, create, update, batchCreate), vsebuje title in appearance.
  • Posodobitev: npm install @qr3/sdk@latest. Sledijo Python, Go in PHP. Podrobnosti: SDK-ji in CLI in Shranjevanje barv na kodi.

2026-09 · Spremenjen čas poteka velja v približno eni minuti

  • Odpravljeno: PATCH na expires_at zdaj počisti predpomnilnik preusmeritev kode. Nov čas poteka tako začne veljati v približno eni minuti namesto šele do 24 ur pozneje. Prej je odstranjen ali prestavljen potek še do 24 ur vračal 410, potek, nastavljen na trenutni čas, pa je preusmeritev pustil delovati še do 24 ur.
  • Odpravljeno: Koda, ustvarjena z expires_at, poteče pravočasno tudi takrat, ko je potek v prvih 24 urah.
  • Odpravljeno: Če je koda izbrisana med nalaganjem ali odstranjevanjem njenega logotipa, POST in DELETE /v1/codes/:id/logo odgovorita s 404 in ne spremenita izbrisane kode, enako kot že PATCH.
  • Odpravljeno: Tudi statična koda, katere kratka povezava (redirect_url) je bila obiskana, se nahaja v predpomnilniku preusmeritev. Spreminjanje, zaustavitev in brisanje jo zdaj prav tako počistijo, ne le pri dinamičnih kodah.

2026-09 · Shranjevanje barv na kodi

  • Novo: PATCH /v1/codes/:id sprejema appearance s foreground_color in background_color (#RRGGBB, ozadje tudi transparent). qr.svg in qr.png izrišeta shranjene barve brez parametrov; parameter poizvedbe, kot je ?fg=000000, ima še vedno prednost. PDF in EPS bosta barve izrisovala šele v kasnejši različici.
  • Preverjanje kontrasta: Par pod 1,5:1 vrne 422. Šibkejši pari se shranijo in v meta.issues javijo kot warning ali critical; prozorno ozadje je vedno critical, nikoli blokirano.
  • Združevanje: Izpuščena polja ohranijo svojo shranjeno vrednost, null jo ponastavi. Hkratne spremembe na isti kodi se ne prepisujejo več med seboj.
  • V vsakem odgovoru kode: appearance je prisoten v vsakem odgovoru kode in v spletnih kavljih (webhooks) qr.created in qr.updated. POST, batch in uvoz ga zavrnejo z 422.
  • Brez sprememb za obstoječe kode: Brez shranjenih barv vsaka koda vrne enake bajte kot prej. Podrobnosti: Shranjevanje barv na kodi.

2026-09 · Barve in odpravljanje napak kot parametri slikovnih poti

  • Novo: Vse štiri slikovne poti sprejemajo fg (barva ospredja), bg (barva ozadja ali transparent) in ecc (odpravljanje napak L, M, Q, H). SVG in PNG izrišeta barve; PDF in EPS jih sprejmeta, vendar jih bosta izrisala šele v kasnejši izdaji. ecc deluje v vseh štirih formatih, logotip pa še naprej zahteva H.
  • Prosojno: bg=transparent vrne SVG brez ozadja in PNG s pravim alfa kanalom. Podlaga mora biti svetla in puščati mirno območje prosto.
  • Nikoli napaka: Neveljavne vrednosti so prezrte; slika se nato vrne natanko tako kot brez parametrov.
  • Predpomnilnik: Vsak dejansko uporabljen parameter vrne Cache-Control: public, max-age=300 namesto 24 ur privzete slike.
  • Brez spremembe delovanja brez parametrov: Vsaka obstoječa koda v vseh štirih formatih vrne enake bajte kot prej.
  • Na voljo v vseh paketih. Podrobnosti: Barve in odpravljanje napak.

2026-09 · PDF in EPS zdaj prav tako vgrajujeta logotip

  • Razširitev: qr.pdf in qr.eps zdaj vgrajujeta nastavljeni logotip natanko tako kot qr.svg in qr.png (glejte spodaj) — kot vgrajeno sliko (PDF prek Image XObject, EPS prek slikovnega slovarja v PostScript, tam samo z %%LanguageLevel: 3), centrirano na isti površini, z enakim dvigom popravljanja napak na H. Obe obliki zapisa prej nista vključevali logotipa; to je zdaj odpravljeno.
  • Predpomnilnik: Z nastavljenim logotipom zdaj tudi qr.pdf in qr.eps vračata Cache-Control: public, max-age=300 namesto običajnih 24 ur — natanko tako kot SVG/PNG.
  • Varnostna možnost: Če same slike logotipa ni mogoče pripraviti (na primer poškodovan shranjen objekt), popravljanje napak ostane na H, vendar rezervirano območje ostane prazno namesto slike — nikoli ne pride do napake strežnika.
  • Brez spremembe delovanja brez logotipa: Kode brez logotipa še naprej vračajo bajtno identična qr.pdf/ qr.eps, z nespremenjenim 24-urnim predpomnilnikom.
  • Podrobnosti in navodila za tiskanje: Logotip v kodi QR.

2026-09 · Logotip v kodi QR — Nadzorna plošča in API

  • Novo: Koda ima lahko zdaj logotip na sredini. V Nadzorni plošči stran s podrobnostmi kode ustvari lastno kartico za logotip: Izberi logotip, ob prvem dodajanju ali odstranjevanju potrdite opozorilo z obvezno kljukico (oboje spremeni vzorec pik), nato Naloži logotip/Odstrani logotip. Zamenjava ne zahteva potrditve — spremeni se le slika, ne pa tudi vzorec. Vloga viewer vidi stanje in predogled, ne pa tudi treh dejanj.
  • API: POST /v1/codes/{id}/logo (večdelno polje file; PNG, JPEG ali WebP, največ 1 MB, SVG je zavrnjen) ustvari ali zamenja logotip; DELETE /v1/codes/{id}/logo ga ponovno odstrani in je idempotenten. Prevelika slika vrne 413, nepodprt format 422, vloga viewer pa 403.
  • Upodabljanje: qr.svg in qr.png vdelata logotip kot dejanske slikovne pike (512 × 512, normalizirano) in za to zvišata raven popravljanja napak na H. Dodajanje in odstranjevanje s tem spremenita vzorec pik (M ↔ H), zamenjava pa ne. qr.pdf in qr.eps ne vdelujeta logotipa in ostaneta nespremenjena. Že natisnjena koda v vsakem primeru deluje naprej, saj kodirani cilj ni odvisen od logotipa — ponovno natisniti mora le tisti, ki želi (nov) videz logotipa videti tudi na materialu, in pri tem ne mešati starih in novih datotek za tisk.
  • Predpomnilnik: Z nastavljenim logotipom qr.svg in qr.png vrneta Cache-Control: public, max-age=300 namesto običajnih 24 ur. Podrobnosti, omejitve in navodila za tisk: Logotip v kodi QR.

2026-08 · operationId za vseh 75 operacij in navodila “kdaj uporabiti” za agente

  • Dopolnitev: Vseh 75 operacij v specifikaciji OpenAPI zdaj vsebuje operationId — listCodes, createCode, getCodeStats, archiveWorkspace in tako naprej. Prej je to polje povsod manjkalo, zato je moral vsak generator ime metode izpeljati iz metode HTTP in poti (postV1Codes). Takšna imena so odvisna od poti in se spremenijo z vsako spremembo poti. Oblika imena je na vseh 75 mestih enaka: list/get/create/update/replace/delete, sicer pa glagol poslovnega dejanja (validateDpp, registerGs1Identifier, pingWebhook). Glagol sledi poslovni logiki in ne metodi HTTP — archiveWorkspace je DELETE, importDpps pa POST.
  • Vpliv na samodejno generirane odjemalce: Tisti, ki svoj SDK generirajo iz specifikacije, bodo ob naslednjem zagonu prejeli preimenovane metode (postV1Codes → createCode). To je namen te spremembe, vendar gre za preimenovanje v tuji kodi — zato je to tukaj izrecno omenjeno. Poti, parametri, oblike odgovorov in statusne kode ostajajo nespremenjeni; uradni SDK-ji, CLI in MCP-strežniki niso prizadeti.
  • Vstopna točka za agente: https://qr3.app/llms.txt vsebuje razdelek ## When to use qr3.app — šest nalog namesto petih ali šestih funkcij, plus stavek o tem, za kaj qr3.app ni pravo orodje. Enako informacijo zdaj posreduje MCP-strežnik ob rokovanju: initialize na https://mcp.qr3.app/mcp odgovori s poljem instructions (prej: enajst orodij brez kakršne koli razvrstitve). Vključeno je tudi, kateri klici potrebujejo ključ API — initialize in tools/list ne, vsak tools/call pa da.
  • Popravki v llms.txt: Štirje podatki so bili preverjeni v produkciji in niso držali: (1) SDK za Python qr3app ni objavljen na PyPI — vrstica pip install je odstranjena brez nadomestila; (2) Accept: text/markdown velja za domačo stran in blog, ne pa za vsako na strežniku upodobljeno stran; (3) kontaktni naslov je [email protected], tudi v JSON-LD domače strani; (4) /de/security/ je preusmeritev na sidro, ne pa samostojna stran. Novo povezano: docs.qr3.app/de/skills/.
  • Zaščita: Tri trditve v openapi-spec.test.ts — popolnost, edinstvenost, lowerCamelCase —, vsaka navzkrižno preverjena z mutacijo. Devet dodatnih testov fiksira štiri popravljene podatke, da se ne bi ponovili.
  • Znana omejitev: Dve od 75 operacij sta opisani v specifikaciji, vendar odgovarjata s 404 (GET /v1/codes/{id}/stats in GET /v1/account). Tukaj sta prejeli ime in ga bosta znova izgubili, ko bo odločeno, ali bosta zgrajeni ali opuščeni.

2026-08 · Znižanja paketov in preklici zdaj vplivajo tudi na omejitve

  • Popravek: Stripeov webhook je ob spremembi paketa in preklicu zapisal le ime paketa, ne pa tudi štirih stolpcev z omejitvami organizacije (max_workspaces, max_members, max_dynamic_codes, max_scans_per_month). Ker uveljavljanje upošteva maksimum med shranjeno vrednostjo in izhodiščem paketa, je organizacija, ki je prešla na nižji paket ali ga preklicala, obdržala svoje stare, višje omejitve — znižanje paketa je bilo brez učinka. Webhook zdaj ob vsaki dejanski spremembi paketa nastavi stolpce na izhodišče novega paketa, ob preklicu pa na izhodišče brezplačnega paketa — natanko tako, kot to že počne skrbniško upravljanje.
  • Vedenje: Rutinske posodobitve naročnine (podaljšanje, plačilno sredstvo, sorazmerno zaračunavanje) še naprej ne vplivajo na omejitve; individualno odobrene višje omejitve ostanejo nespremenjene. Šele dejanska sprememba paketa jih ponastavi na izhodišče novega paketa.
  • Vpliv: Brez sprememb API-ja ali formata odgovora. Organizacije, katerih znižanje paketa se je zgodilo pred tem popravkom, obdržijo stare vrednosti, dokler ne začne veljati naslednja sprememba paketa ali jih ne prilagodi podpora.

2026-08 · Keyset kazalec zdaj na vseh seznamskih končnih točkah

  • Popravek: Popravek kazalca za GET /v1/codes in GET /v1/dpp (glejte spodaj) je zdaj uveden za vse preostale seznamske končne točke s paginacijo na podlagi kazalca: GET /v1/qr-codes/:id/comments, /v1/workspaces, /v1/gs1/identifiers, /v1/members, /v1/audit-logs, /v1/admin/orgs, /v1/admin/users in /v1/webhooks/:id/deliveries. Vsi so prej listali izključno po created_at; vrstice z enakim časovnim žigom (revizijski zapisi paketne operacije, ponovni poskusi webhookov, uvozi članov) so se lahko na naslednji strani izgubile. Sortirni ključ je zdaj povsod nabor (created_at, id).
  • Sprememba API-ja: V teh seznamih je meta.pagination.next_cursor od zdaj naprej prav tako neprozorna vrednost (base64url) namesto samega časovnega žiga; nečitljivi kazalci vrnejo 400, stari kazalci s časovnim žigom pa se začasno še naprej sprejemajo. Izjema je GET /v1/webhooks/:id/deliveries: tam next_cursor ostaja ID zadnje dostave (neznan ID → prva stran). Odjemalcem, ki next_cursor vračajo nespremenjen — Nadzorna plošča, CLI, SDK-ji, MCP —, ni treba ničesar spreminjati.
  • Vpliv: Migracija ni potrebna. Če ste v katerem od teh seznamov (npr. revizijski dnevnik ali dnevnik dostav v Nadzorni plošči) pri listanju pogrešali zapise: nikoli niso izginili — seznami jih od zdaj naprej prikazujejo v celoti.

2026-08 · Časovni žigi po urejanju in brisanju ponovno skladni z OpenAPI

  • Popravek: Po PATCH /v1/codes/{id} se je updated_at vrnil v formatu SQLite brez časovnega pasu (2026-08-17 09:00:00), čeprav specifikacija OpenAPI določa format: date-time in ustvarjanje (POST) vrne časovni žig ISO (2026-08-17T09:00:00.000Z). Enako je veljalo za deleted_at/updated_at pri mehkem brisanju (soft-delete) ter za poti urejanja/brisanja API-ključev, organizacij, delovnih prostorov, članov, komentarjev in webhookov, poleg tega pa tudi za last_used_at API-ključev in last_triggered_at webhookov. Vse poti za pisanje zdaj zapisujejo časovni žig v formatu ISO 8601 (UTC, T in Z).
  • Vpliv: Odjemalci, ki razčlenjujejo updated_at z new Date(...) (SDK-ji, CLI, Nadzorna plošča), so format s presledkom prebrali kot lokalni čas — CLI je pri enkrat urejenih kodah prikazal čas, zamaknjen za lokalni odmik (Dunaj: −2 h). To je odpravljeno. Poleg tega migracija podatkov normalizira že shranjene vrednosti v starem formatu na ISO, da bosta razvrščanje in primerjava v mešanih podatkih pravilna. Brez sprememb imen polj ali strukture odgovora.
  • Ozadje: Isti razred napake kot pri spodnjih dveh popravkih (potek veljavnosti API-ključa, meja za ponovni pregled): SQLite-ova funkcija datetime('now') zapisuje YYYY-MM-DD HH:MM:SS, vsi ostali zapisovalci pa ISO 8601. Zaščitni test v izvorni kodi bo v prihodnje preprečil nove pojavitve te napake.

2026-08 · Paginacija seznamov ne izgublja več paketno ustvarjenih kod

  • Popravek: GET /v1/codes in GET /v1/dpp sta uporabljala paginacijo samo prek created_at. Vendar pa si kode iz POST /v1/codes/batch, POST /v1/dpp/batch in uvoza CSV/XLSX delijo en časovni žig — takoj ko je bil batch večji od limit (privzeto 20), druga stran ni več vrnila preostalih vrstic istega časovnega žiga. Kode so obstajale in so bile dosegljive prek GET /v1/codes/:id, vendar se niso nikoli pojavile v seznamu (Nadzorna plošča, CLI qr3 list, SDK-ji, MCP). Kazalec je zdaj nabor ključev (keyset) prek (created_at, id).
  • Sprememba API-ja: meta.pagination.next_cursor je od zdaj naprej neprozorna vrednost (base64url) namesto golega časovnega žiga. Tistim, ki kazalec vračajo nespremenjen kot ?cursor= — kot to počnejo Nadzorna plošča, CLI, vsi SDK-ji in strežnik MCP —, ni treba ničesar spreminjati. Stari kazalci s časovnim žigom bodo prehodno še naprej sprejeti; nečitljivi kazalci zdaj vrnejo 400 namesto tihega prikaza prve strani.
  • Vpliv: Če ste po uvozu batcha v seznamu videli manj kod, kot jih je bilo ustvarjenih: kode niso nikoli izginile — seznam jih od zdaj naprej prikazuje v celoti. Migracija ni potrebna.

2026-08 · Varnostni ponovni pregledi ponovno potekajo v 24-urnem intervalu

  • Popravek: Periodično ponovno skeniranje ciljnih URL-jev in povezav na pristajalnih straneh (Google Web Risk) je preskočilo kode, katerih zadnji pregled je bil na isti koledarski dan kot 24-urna časovna meja — glede na čas se je ponovni pregled zakasnil za do en dodaten dan. Časovna meja se zdaj izračunava v enakem formatu ISO, v katerem so shranjeni časovni žigi pregledov.
  • Vpliv: Ciljni URL, ki je po zadnjem pregledu označen kot nevaren, ponovno v dokumentiranem 24-urnem oknu vodi do samodejne zaustavitve kode. Brez sprememb API-ja ali formata odgovora.

2026-08 · API-ključi potečejo ob točnem času poteka

  • Popravek: API-ključ, katerega expires_at je bil na isti dan, je bil še naprej sprejet do polnoči UTC. Potek se zdaj primerja kot časovni žig namesto kot niz znakov — potekel ključ takoj vrne 401.
  • Ozadje: expires_at se shrani kot časovni žig ISO (2026-08-14T09:00:00Z), primerjalna stran pa je vrnila format s presledkom (2026-08-14 09:00:00). Surova primerjava nizov znakov je bila zato pravilna le, dokler se je razlikoval že sam datum.
  • Vpliv: Migracija ni potrebna, format odgovora GET /v1/api-keys ostaja nespremenjen. Nečitljive vrednosti poteka zdaj veljajo za potekle namesto za veljavne.

2026-08 · Referenca API: Dokumentirano upravljanje tenantov

  • OpenAPI: Specifikacija — in s tem interaktivna referenca — zdaj dokumentira organizacije (vklj. GET /v1/organizations/usage), delovne prostore (workspaces), člane in vloge ter revizijske dnevnike (audit logs).
  • Billing: Pregled naročniških paketov (GET /v1/billing/plans) je javen; Checkout (POST /v1/billing/checkout) in Stripe portal za stranke (GET /v1/billing/portal) sta označena kot končni točki za administratorje organizacij.
  • Izvoz skeniranj: Statistika skeniranj (GET /v1/codes/{id}/scans) in izvoz surovih podatkov (…/scans.csv, …/scans.xlsx) sta v celoti dokumentirana — vključno z opozorilom o GDPR: ip_hash ni nikoli vključen v izvoz.
  • Obnašanje ob napakah: Na novo je dokumentiran tudi odgovor 400 pri validaciji zahtev: telo (body) je surova napaka Zod, ne dokument o težavi RFC-7807 — vendar se kljub temu dostavi pod vrsto vsebine application/problem+json.

2026-08 · Kopiranje javnih povezav do datotek

  • Nadzorna plošča: Javne datoteke na strani s podrobnostmi kode imajo zdaj gumb, ki njihovo javno povezavo kopira v odložišče – ta je neposredno uporabna kot ciljni URL QR-kode, kadar naj skeniranje namesto pristajalne strani s seznamom datotek takoj odpre določen dokument.
  • API: Končne točke za datoteke (/v1/files) dodatno vračajo public_url. Polje je nastavljeno samo pri datotekah z visibility: public – zasebne datoteke ne dobijo javnega naslova.
  • Vedenje: Povezava ne zahteva prijave in datoteko odpre neposredno v brskalniku. Zamenjava datoteke z gumbom Zamenjaj povezave ne spremeni, zato natisnjena koda ostane veljavna. Podrobnosti: Datoteke in podatkovni listi.

2026-07 · Vloge v ekipi: Sodelavci brez pravice brisanja in administratorsko obračunavanje

  • Novo: Vloga člana Sodelavec (brez brisanja) — ustvarja in ureja QR-kode, datoteke in Digital Product Passports, ne more pa ničesar izbrisati ali ustvarjati API-ključev. Vsi destruktivni endpointi preverjajo vlogo na strežniški strani (403).
  • Obračunavanje: Nadgradnje naročnin in Stripe portal za stranke (POST /v1/billing/checkout, GET /v1/billing/portal) so zdaj omejeni na Administratorje organizacije — vse druge vloge vidijo pregled naročnin samo za branje.
  • Nadzorna plošča: Dejanja, ki jih trenutna vloga ne dovoljuje, so skrita: Gledalec na primer ne vidi gumbov za ustvarjanje, urejanje ali brisanje; seznami, prenosi in statistika ostanejo vidni. Podrobnosti: Ekipa in vloge.

2026-06 · Zunanje povezave na pristajalni strani kode

  • Pristajalna stran: qr3-gostovana pristajalna stran kode lahko zdaj poleg naloženih datotek ali namesto njih navede zunanje, samostojno gostovane povezave ({ label, url }) – na primer za podatkovne liste na vaši lastni strani.
  • API: POST/PATCH /v1/codes sprejemata polje links (0–20 vnosov, http(s), ≤ 2048 znakov). Vsak URL se preveri z Google Web Risk; nevaren URL vrne 422. Prazno polje izbriše vse povezave.
  • Nadzorna plošča: Dodajanje, prerazporejanje in odstranjevanje povezav na strani s podrobnostmi kode.
  • Varnost: Upodobljene povezave ostanejo varne pred XSS (escapirane, samo http(s)) in stran ohrani svojo glavo noindex.

2026-04 · Analitika nadzorne plošče na posamezno kodo QR

  • Nadzorna plošča: Gumb za analitiko na seznamu kod QR zdaj odpre stran s statistiko posamezne kode QR na naslovu /dashboard/codes/{id}.
  • Usmerjanje: Alias /dashboard/codes še naprej preusmerja na /dashboard, vendar ne prestreza več podrobnih poti, kot je /dashboard/codes/{id}.
  • API: Podrobna stran naloži kodo QR neposredno prek GET /v1/codes/:id; s tem ni več odvisna od omejitev strani na seznamu (pagination).
  • Testi: Regresijski testi pokrivajo preusmeritev aliasa in neposredno nalaganje kode.

2026-04 · Pogovorno okno za brisanje kod QR na nadzorni plošči

  • Nadzorna plošča: Ikona smetnjaka na seznamu kod QR zdaj odpre lastno pogovorno okno React namesto izvornega pojavnega okna brskalnika.
  • Povratne informacije: Po brisanju se prikaže pojavno obvestilo (toast) o uspehu ali napaki.
  • Testi: packages/dashboard/tests/dashboard.test.ts preprečuje regresije pri confirm() v poteku brisanja kode QR.

2026-04 · Test kratkih povezav na nadzorni plošči za dinamične kode QR

  • Nadzorna plošča: Kratke kode na seznamu kod QR so zdaj neposredno klikljive kot zunanje preusmeritvene povezave. Ikona za zunanjo povezavo poleg npr. wu3qaa odpre https://qr3.app/{shortCode} v novem zavihku.
  • i18n: Dodana besedila orodnih namigov (tooltip) za nemščino in angleščino.
  • Testi: packages/dashboard/tests/dashboard.test.ts ščiti povezavo href, vedenje novega zavihka, noopener noreferrer in ikono pred regresijami.

2026-04 · Pot preusmeritvenega delavca (Redirect-Worker) za dinamične kode QR

  • Popravek: Dinamične kode QR na https://qr3.app/{shortCode} ponovno obdeluje preusmeritveni delavec (Redirect-Worker). Produkcijska pot zdaj uporablja qr3.app/*, ker poti Cloudflare Workers ne podpirajo parametrov poti :code.
  • Utrjevanje: Neprilagojene poti se posredujejo ciljnemu naslovu pristajalne strani (landing origin), tako da preusmeritveni delavec ne blokira običajnih strani, kot je /de/pricing.
  • Testi: packages/redirect/tests/unit/redirect.test.ts preverja pot z divjo karto (wildcard), obdelavo kratkih kod in prehod do ciljnega naslova (origin pass-through).

2026-04 · Pregled skeniranj DPP v delovnem prostoru (Q3.4.2)

  • Novo: GET /v1/workspace/stats/dpp?days=30 — združuje vsa skeniranja dpp_scans delovnega prostora ključa API (active_dpps, scans_by_day, top_dpps z imenom izdelka/kategorijo).
  • Nadzorna plošča: Kartica na začetni strani (/dashboard) s 30-dnevnim paličnim grafikonom + seznami najboljših — vzporedno s karticami kod QR.
  • Javno: Tržna kratka povezava GET /dpp/dpp_<id> (en segment) za predstavitve v živo, vzporedno z /dpp/{gtin}/{serial}.

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

  • Novo: GET /v1/dpp/:id/stats?days=30 — združena skeniranja javnega razreševalnika GS1 na DPP. Polja: total_scans, period_scans, scans_by_day, top_countries, top_devices, top_representations.
  • Novo: Tabela dpp_scans (migracija 0011) — ločena od scans (preusmeritveni delavec). IP-naslovi so zgoščeni z dnevno rotirajočo soljo (salt), surove IP-naslove pa nikoli ne dosežejo baze D1.
  • Nadzorna plošča: Mini kartica z grafikonom (SVG, brez knjižnice za grafikone) na /dashboard/dpp/:dppId s 30-dnevnimi stolpci + razčlenitvijo najboljših 3. Prazno stanje (empty state), takoj ko je DPP aktiven, vendar še nima skeniranj.

2026-04 · Simulator skladnosti z EU v živo (Q3.3.7)

  • Novo: POST /v1/dpp/:id/validate-update — simulira delne posodobitve brez stanja (stateless) (status, seznam trgov, …) brez obstojnosti. Odgovor vsebuje eu_compliance + preview.changed_fields.
  • Nadzorna plošča: Kartica simulatorja v podrobnostih DPP (/dashboard/dpp/:dppId) — žetoni (chips) za DE/AT/FR/IT/ES/NL + po meri, spustni meni za status, Predogled vpliva na EU / Shrani spremembe / Ponastavi. Neblokirajoče prek Remix useFetcher.
  • Utrjevanje: Zunanji pomočniki simulatorja (readUpdatePatchFromForm, marketCountriesKey) + 18 novih enotskih testov; popravek hrošča: samostojni ne-ISO vnos ne izbriše več seznama trgov.

2026-04 · Predogled skladnosti z EU v živo v obrazcu za ustvarjanje (Q3.3.6)

  • Spremenjeno: POST /v1/dpp/validate dodatno vrne eu_compliance — isti validator kot GET /v1/dpp/:id/eu-compliance, brez stanja (stateless) pred shranjevanjem.
  • Nadzorna plošča: Predogled pod obstoječo ploščo za preverjanje veljavnosti + nova pasica za zaščito pred shranjevanjem (Save-Guard-Banner) pred gumbi za pošiljanje, če so odprte napake/opozorila (i18n množina DE/EN).

2026-04 · Validator EU + uporabniški vmesnik za tekstil (Q3.3.4 + Q3.3.5)

  • Novo: Validator skladnosti z EU s 5 tekstilnimi pravili (TEXTILE_AGEC_REQUIRED, TEXTILE_MICROPLASTICS_CONSISTENCY, TEXTILE_SVHC_THRESHOLD, TEXTILE_GREENWASHING, TEXTILE_ESPR_READY).
  • Novo: GET /v1/dpp/:id/eu-compliance z compliant / espr_ready / issues[] / summary.
  • Nadzorna plošča: Razdelek za skladnost z EU v podrobnostih DPP (povzetki v obliki ploščic, skupinske kartice težav, značka ESPR-Ready v glavi).

2026-04 · Shema DPP za tekstil (Q3.3.1–Q3.3.3)

  • Novo: Kategorija textile z obvezno verigo AGEC (tkanje/pletenje → barvanje/tiskanje → konfekcija), za vsako vlakno origin_country + recycled_pct, svhc_substances[], ESPR-Opt-in (PEF, življenjska doba, možnost recikliranja).
  • Novo: Osnovno polje market_countries: string[] (ISO 3166-1 alpha-2) v vseh kategorijah DPP — upravlja specifična francoska pravila AGEC in obvezno francosko obvestilo za potrošnike.
  • Novo: Potrošniška predloga HTML z opozorilnim poljem AGEC za mikroplastiko, 3-stopenjsko verigo izvora (zastavice), seznamom SVHC ter razdelkom za trajnost (Durability) in možnost recikliranja (Recyclability).
  • Migracija: 0010_dpp_market_countries (D1).

2026-04 · Množični uvoz DPP (Q3.2.1–Q3.2.5)

  • Novo: POST /v1/dpp/import sprejema CSV in XLSX (združljivo z delavci prek SheetJS xlsx, ~283 KB stisnjen paket gzip).
  • Skalirano: omejitev glede na paket (Free 100 → Enterprise 10k) + razdeljen db.batch() po 100 + 5 MB omejitev telesa (body limit).
  • Novo: Poročilo o napakah kot CSV v polju errors_csv odgovora 201; GET /v1/dpp/import/templates/:category?format=csv|xlsx ponuja pripravljene predloge za baterije in tekstil.
  • Nadzorna plošča: Prenos z vlečenjem in spuščanjem (Drag-and-Drop) na /dashboard/dpp/import s posrednikom predlog (template proxy) in neposrednim prenosom CSV.

Neprelomne spremembe — razširitve LTS

Vse zgoraj navedene spremembe so aditivne:

  • Obstoječe stranke POST /v1/dpp/validate prezrejo novo polje eu_compliance brez sprememb.
  • Obstoječi poteki za battery ostajajo nespremenjeni.
  • market_countries je neobvezen in ima privzeto vrednost [].

Glejte Različice API-ja za pravilnik o prelomnih spremembah.