Products
Data Framer

Release notes

What each version of Data Framer deploys. The version in the page footer links to its entry here, so what is running and what it changed are one click apart.

1.47.0

2026-10-31ReleaseThis build

Added

  • A practice passport. On the Publish tab of an approved version, the manufacturer's designated signatory can switch it on. The product's approved declaration, identifiers, operator, plant and passport content then appear at a public address, with a QR code to print on the product or its label. Anyone who scans the code can read it without an account, and a machine-readable version sits beside it. Every page and response says plainly that it is a practice passport and not the construction digital product passport Regulation (EU) 2024/3110 will require, whose rules the Commission has not yet adopted. It is built from the package issued at approval, so a correction in progress never changes it, and it never shows source documents, review decisions or anything of an unapproved version. Only the designated signatory switches it on; an Owner can switch it off, and archiving the product takes it down. Switched off, the address shows nothing; switched on again, the address is the same, so a printed code stays valid.
  • For a product whose family is under Regulation (EU) 2024/3110, the declaration details offer assessment and verification system 3+, the system that regulation adds for environmental sustainability, and call the field "Assessment and verification system". Under Regulation (EU) No 305/2011 the field stays "AVCP system" with its five systems, and 3+ is refused there with the systems named.
  • The regulatory calendar lists Commission Delegated Regulation (EU) 2026/1310, in force since 17 September 2026, which sets the assessment and verification system for each product family, category and essential characteristic declared under the 2024 regulation.

Fixed

  • Readiness cites the law as it reads. Each DPP content element names its item of Article 76(2)(a). The passport system's delegated act is cited as Article 75(1), the information on substances of concern as Article 15(6), and notified bodies as Chapter VI of Regulation (EU) 2024/3110. Until now readiness cited Article 76(3), Annex I point 7 and Chapter VIII, which do not say what they were cited for. No count changed.
  • The DPP content card on the product page says the regulation lists seven items, held as nine elements because the record keeps the product, operator and facility identifiers apart. It used to credit nine elements to the Commission and CEN/TC 442, which no publication supports.
  • The data carrier preparation says that the EU registry takes the unique product identifier as a web address that resolves to the passport, and that the construction delegated act may set other rules. The notified body's row now names a validation report among the documents to take the body's number from.

1.46.2

2026-10-19Hotfix

Fixed

  • An AI call that finished after its product had been deleted, or after a reset had cleared its document, is now recorded for the organisation like any other billed call, with the deleted version or document left empty. It used to be lost from the usage report.
  • Reading a document that was deleted with its product, or cleared by a reset, now simply stops, instead of failing and being tried twice more for nothing.

1.46.1

2026-10-19Hotfix

Fixed

  • Deleting or resetting a product while one of its documents was being read could fail with an error partway through, leaving the product with the values read from that document while the document itself no longer appeared among its sources. A delete or reset now waits for a reading that is writing its result, then removes what it wrote along with everything else, and a reading that has not got that far writes nothing. Either way the product's data goes entirely or not at all.
  • A version approved at the moment it was deleted or reset stays approved: the delete or reset is refused as it is for any approved version, and nothing is removed.

1.46.0

2026-10-18Release

Added

  • Send feedback, in the account menu on every screen: a short message about the application reaches the people who build it, with the page it was sent from.
  • Each approval records how many declared values it covered, how many of them carry inspectable evidence, and how many review decisions the version took, so provenance coverage and review effort can be followed release over release. Review effort is counted in decisions, never timed per person.
  • For the operator: a monthly KPI report (time to first upload, time from upload to a framed record, provenance coverage, review effort) and a list of the month's feedback.
  • A protocol for the usability evaluation, in docs/usability-evaluation.md.

Changed

  • Approval also checks that every accepted value carries a person's decision, and refuses with the values named if one does not. No path in the application should leave such a value; the check makes sure none is ever issued.

1.45.0

2026-10-18Release

Changed

  • Approval now requires every requirement owed now to be held, or waived with a reason. Until this version readiness was advisory, and only the exceptions had to be resolved. The Publish page lists each requirement owed now that the version does not hold, and the Approve & issue button waits until each one is held or waived.

Added

  • A requirement owed now can be waived on the Publish page by someone who may approve, with a reason of at least ten characters. A waiver can be withdrawn while the version is a draft, and is frozen with it on approval. A correction (version n+1) starts with none, so each is given again on purpose.
  • The issued package prints each waived requirement with its reason: in the JSON package, now schema 2.6, and on its own Readiness waivers sheet in the spreadsheet. Giving and withdrawing a waiver are recorded in the activity log.

1.44.5

2026-10-18Hotfix

Fixed

  • Where the malware scanner is set to sleep when idle (the development environment only), an upload waits for it to wake instead of failing. The scan still refuses an upload if the scanner is not up in time; production does not wait and is unchanged.

1.44.4

2026-10-17Hotfix

Fixed

  • A value printed in scientific notation, as environmental declarations print their tables (2.33E+01), is read as the number it is (23.3). Until now its quote never counted as stating it, and a value whose exponent had been lost (2.33) did.
  • Such a value is stored and compared as a number, so it no longer shows as a conflict with the same value written plainly in another document.
  • Every quote the AI gives is now looked for in the document's own text, and the result is kept with the evidence. Only a quote found there can be accepted in a batch: one that appears nowhere, or one read from an image, which no text can confirm, is decided on its own.
  • An enumerated value that is not one of the property's allowed values is no longer offered for batch acceptance.

Changed

  • Values extracted before this version have no recorded quote location, so they are decided one by one rather than offered in a batch. Uploading a document again records it.

1.44.3

2026-10-17Hotfix

Fixed

  • A conflict or a missing value that a person had resolved can no longer stay open behind the scenes: two checks running at once, for example an upload finishing while a value was being decided, could leave a second, stale copy that readiness counted and an issued package carried. Checks on one product now run one at a time, and the stale copies already recorded are removed on deploy.

1.44.2

2026-10-17Hotfix

Fixed

  • A file between 10 and 25 MB uploads and is read. Until now every upload over 10 MB failed with "Upload failed.", although the stated limit is 25 MB.
  • A file over 25 MB is refused at once, saying so, before it is sent; and if the connection drops during an upload, the form says so instead of showing nothing.
  • An image over 7.5 MB is refused at upload, saying to reduce its resolution, instead of being accepted and then failing at the AI on every attempt.
  • A document the AI service refuses as too large fails once, saying why, instead of being sent three more times.
  • An upload the server cannot read now says so, instead of a bare "Upload failed.".

1.44.1

2026-10-17Hotfix

Fixed

  • One invalid value in the AI's answer no longer throws away the whole document: that value is left out and recorded, and every other value goes to review.
  • An answer the AI cut off, declined to give, or gave in the wrong form now fails its document at once, saying why, instead of being asked for twice more and billed each time.
  • A long document's answer is no longer cut short: one reading can now return about four times as many values as before.
  • When the AI service's spending limit is reached, each document fails at once with a reason saying that reading is paused, instead of failing after three attempts with a general message.
  • A document whose processing was interrupted twice, for example by two deploys during one extraction, is marked failed with its reason instead of waiting indefinitely.
  • An AI call that fails to connect is retried once instead of twice before the queue's own retries.
  • Setting the AI model to one the extraction cannot call now stops the deploy, and the version already running keeps serving, instead of every extraction failing after it.
  • With two service settings in place (docs/deployment.md), a deploy lets the extraction in progress finish before the old instance stops, so its AI call is not made and billed twice.

Added

  • The AI usage report prices calls to Claude Sonnet 5.5 and Claude Haiku 5.5, with Haiku 5.5's higher price for prompts over 100,000 tokens.

1.44.0

2026-09-29Release

Changed

  • No real manufacturer is named anywhere in the application any more. The product the application seeds itself with is a specimen, `Example Insulation Ltd Flat-roof board 140`, with five more beside it, one for each product family. The declared values behind them are unchanged.
  • A branded product this application seeded on an earlier version is renamed to its specimen on deploy, so nothing is left beside it. A product whose declaration has already been approved and issued is left exactly as it is: renaming it would rewrite the manufacturer on a record already issued under the old name.
  • The six product families are named after their harmonised standard and their product family rather than after a manufacturer. That changes what the Family filter puts in the address bar (`?family=rock-mineral-wool-flat-roof-en13162`) and what an issued package carries as its template identifier.
  • The line under each template on New product describes the standard and the family instead of naming a manufacturer's product.
  • A curated template's title, description, technical route and CPR regime are brought up to date on deploy, where before they kept whatever they were first created with until an operator ran a backfill.

Added

  • A brand-free set of three source documents to upload in a demo, in `docs/demo-specimen/`: a declaration of performance, an environmental product declaration and a technical data sheet, each named after what it is. Every declared number is the real one, including the two figures the declaration and the environmental declaration disagree on, and each document states on its own face that the manufacturer is invented and the numbers are real.

1.43.0

2026-09-29Release

Changed

  • Readiness counts each requirement at the horizon the law gives it, so every product's numbers move once. The five points below say what moved.
  • The intended use, the AVCP system and the notified body are owed now: today's declaration of performance already requires them (Delegated Regulation (EU) No 574/2014, Annex III). They were counted with the DoPC, so what was owed now was understated, and fewer products may hold everything owed today.
  • GWP-total counts with the DoPC, beside the other climate indicators of Annex II (a) to (d): today's declaration requires no environmental indicator.
  • The information on substances of concern that REACH requires counts with the DoPC. Only a structured format for it stays a preparation.
  • The plant counts once, as the passport's facility identifier: the DoPC has no plant section.
  • The CCI class is a preparation, outside the requirement total: the regulation does not require a classification.
  • Home's opening sentence and each product's readiness banner compare readiness with the start of the month. Across the recount they show no change, since part of it would be the recount and not your data, and say what moved and why instead, until the month's starting point was counted the same way. The package's readiness block names the catalogue it was counted against, now dpp-readiness/1.1.
  • The manufacturer's address is called the contact address, as the declaration model words it, on the organisation record, in readiness and on the DoPC draft.
  • Annex II (s) is named "Land use related impacts", as Annex II words it.

Fixed

  • Home, the Products list and the Regulation page read every product at once, in a fixed number of database queries, instead of about fifteen queries per product. A portfolio of a few hundred products no longer holds up other requests while these pages load.

1.42.0

2026-09-28Release

Added

  • Settings, AI usage: the tokens AI used reading the organisation's documents, this month against its allowance, month by month for the last six months, and by product. Every member can read it. It counts tokens, never money.
  • A monthly AI allowance per organisation, in tokens, set by the service administrator from the Railway console: `npm run maintenance -- set-ai-allowance --actor <you> --organization <slug> --tokens <number|none>`. None is set until then. Once a month's usage reaches it, an upload is refused with the reason and the day the allowance renews, a document already waiting is not read, and an evaluation is refused.

Changed

  • The console's AI usage report lists each organisation's allowance beside what it used.

1.41.0

2026-09-28Release

Added

  • Every AI call a provider bills is recorded for the organisation it was made for: the tokens it consumed (input, output, and the prompt cache's own) and its cost at the provider's list price, from a price list dated 28 September 2026. A call whose output was rejected is recorded too, since it was billed all the same, and so is one whose document was removed, or whose version was approved, while it ran. Deleting or resetting a product keeps the record. An evaluation an administrator runs is recorded too, apart from the organisation's own work.
  • Each organisation's AI calls, tokens and cost for a month are printed from the Railway console: `npm run maintenance -- ai-usage --actor <you> [--month YYYY-MM] [--organization <slug>]`.

Fixed

  • The cost recorded with each AI suggestion, empty since the field was added, is now filled in.

1.40.0

2026-09-28Release

Changed

  • Products opens with where the organisation stands, in one sentence: how many products, in how many families, how many hold everything owed today, how many hold what the construction passport asks, and how many need you.
  • The list is a table on a wide screen: one row per product, one column per date the regulation sets (now, the construction passport, 2030, 2032 and the DoPC), each cell held of owed at that date, coloured by how much is held, each column framed by how certain its date is. The last column says what the product needs next, in the act's own words, and links to the tab where it is done. On a phone the same row is a card with the five dates side by side.
  • Views over the list: All, Needs you, Not ready today and Published. Needs you holds the products whose next act is yours, closest to issued first; approve and issue counts as yours only when you are the designated signatory and, under four eyes, did not resolve the version.
  • Filters are removable chips (step, family, the date a product is not ready at, the act it needs) with Clear filters and a line saying how many products are shown. The view, the filters and the sort are in the address.

Added

  • A filter for the products not ready at a date. A date tile on Home now opens exactly the products it counts as not ready, and Home's "more product steps" opens the Needs you view.

Fixed

  • On a phone the family filter no longer runs past the right edge of the screen.

1.39.0

2026-09-27Release

Changed

  • Home opens with where the organisation stands, in one sentence: how many products hold everything owed today, how many hold what the construction passport asks, whether any holds the 2030 set, and the change since the month began, counted in products. Five tiles carry the same fractions per date, each framed by its milestone's certainty, and the detail by horizon opens underneath them.
  • Needs you is a task list in three groups: yours, waiting on others, and no act in the tool. Every row starts with a verb, carries a status a person can act on ("Ready", "3 decisions", "No document yet", "Waiting on a Reviewer", "Needs a new version") and says in one line why it matters. A gap nothing in the tool closes is shown greyed with its reason, never hidden.
  • Approve and issue is your task only if you are the designated signatory and, under four eyes, did not resolve the version yourself. Otherwise Home shows it waiting on that person, as the server would answer.
  • What closes the gaps, the families and the pipeline sit beside the task list; the pipeline is one bar with its counts.
  • The first-run introduction names the four steps as the application runs them since 1.36.0, approve and issue as one act.

Added

  • What AI read this week: documents read, values suggested with their page and quote, values accepted by people, and the products where decisions still wait, with the rule beside it that nothing is approved by the tool.

1.38.1

2026-09-27Hotfix

Fixed

  • Home, and the page you land on after signing in, slowed down with every product in the organisation: it built the full review queue of each product, with every candidate and its evidence, only to count its exceptions. It now counts every product's exceptions together in three database queries. The count is the same one approval is refused on, and a test holds the two to each other for every version in the database. With about 340 products, one Home load now makes about 3,400 database queries instead of 4,500, and spends about 18 seconds of database time instead of 52.

1.38.0

2026-09-27Release

Added

  • Batch acceptance on the Review tab: candidates that come from one document, whose quote states the value, that nothing conflicts with and that are in the template's unit are offered as one list. You check the list, take out any you want to decide on their own, and accept the rest in one step. Each value is recorded as your decision, with its own entry in the audit trail, and a value you took out stays in the queue.
  • A value written in another unit is converted into the template's unit, deterministically, from a fixed list of units and their spellings ("W/mK", "N/mm2", "kN/m²", "mm" against "cm" and so on). The unit the document wrote is kept beside the value, and the Review tab shows it under a converted value ("As written: 0.042 MPa").

Changed

  • Values are compared with their unit. 42 kPa and 0.042 MPa are the same value and no longer read as a conflict between two documents; 0.035 W/(m·K) and a bare 0.035, or a value in a unit the list does not know, still do. The same comparison decides whether a value that was not adopted matches the declared one in the published report.
  • A corrected value typed with a decimal comma ("0,035") is read as the number it is.
  • Extraction asks the model to report each value in the unit the document writes it in, without converting it, so the number stored is the one in its quote. The golden-set evaluation scores a value after the same conversion, and now reads a number out of its quote as a number, so "0,0350" carries 0.035 and "142" no longer carries 42.

1.37.0

2026-09-26Release

Added

  • A correction starts a new version: from an approved version's Settings tab, "Start a new version" opens version n+1 copied with every value, resolved decision, document and piece of evidence, so one wrong field is corrected on its own rather than re-deciding the whole record.
  • A superseded version: the moment version n+1 is approved and issued, version n becomes read-only history, marked Superseded, pointing at its successor, with its own approval, audit trail and issued package kept and still downloadable.
  • Archive: a product that has ever been approved is archived rather than deleted. It leaves Home and the Products list while every version stays exactly as it was, and an administrator restores it from Products, Archived. Archiving and restoring are each recorded in the audit trail.

Changed

  • Reset applies to a draft only. On an approved or superseded version it is refused; a correction starts a new version instead.
  • Delete stays for a product that was never approved. Once any version of a product has been approved, its Settings tab offers Archive in its place.

1.36.3

2026-09-26Hotfix

Fixed

  • After a correct sign-in code, the sign-in page could sit for several seconds before moving on, with the button back to its normal label and nothing saying why; under load it sometimes had not moved on five seconds later. The button now keeps saying "Signing in…" until the signed-in page appears, instead of inviting a second click that would find the code already used. A network failure while sending or checking the code now shows a message instead of leaving the button idle with no explanation.

1.36.2

2026-09-26Hotfix

Fixed

  • Accepting an invitation could leave the page on the sign-in code screen after a correct code, with the button back to its normal label and no error shown: the redirect that follows a correct code raced its own follow-up refresh and sometimes lost. The button now keeps saying "Accepting…" until the products page appears, instead of inviting a second click that would find the code already used. A network failure while sending or checking the code also now shows a message instead of leaving the button idle with no explanation.

1.36.1

2026-09-26Hotfix

Fixed

  • A response could intermittently arrive very late or not at all, on any route, for no reason tied to that route or to database load. Next.js's own bundled gzip-compression layer leaked an event listener onto its internal compression stream every time a streamed response paused for backpressure, eventually exhausting that stream's listener budget; a patch (`patches/next+16.3.5.patch`, applied automatically on install) corrects the leak.

1.36.0

2026-09-26Release

Added

  • A designated signatory: an Owner can name which of the organisation's Owners may approve and issue a product version, on the Members settings page.
  • A four eyes setting: an organisation can require that whoever approves and issues a version resolved none of its exceptions themselves. It defaults on the first time a second person genuinely joins the organisation, and stays exactly what an administrator last set from then on, from the Organisation settings page.

Changed

  • Approve and issue are now one act, not two: clicking "Approve & issue" freezes the version and writes every publication format in the same step, so a package can no longer disagree with a policy that changed between an earlier approval and a later, separate publish. The progress tracker's five steps are now four.
  • Re-publishing an already-issued version no longer exists: a correction starts a new version instead.

Deferred

  • A drafted DoP/DoPC form (PB14) is not part of this release: its legal wording needs a decision only the product owner should make.

1.35.0

2026-09-26Release

Added

  • A service administrator creates a manufacturer's own organisation from the console, and invites its first Owner in the same run (`npm run maintenance -- create-organization`).
  • Curated product templates are visible to every organisation, not only the one that first held them: a newly created organisation can start a product from day one.

Changed

  • `invite-administrator` can now target any organisation by its slug (`--organization`), not only the default one.

1.34.2

2026-09-26Hotfix

Fixed

  • A GTIN or GLN read from a document is checked against its check digit, as one typed in by hand always was. One with a wrong digit is shown with the reason and can only be rejected; accepting it, restoring it or designating it the DPP unique product identifier is refused. A valid one printed with spaces is recorded as its digits, so it matches the same GTIN typed in.
  • Removing a document withdraws what was read from it: its values, accepted ones included, and the identifiers no other document carries. Until now they stayed in the record and were published citing a document no longer among the sources. An identifier another document also prints now cites that document instead, and a value a reviewer corrected stays, as entered by hand. Remove now asks first and then says what was withdrawn; a required characteristic left without a value returns to review, and a conflict whose values were all withdrawn is resolved.
  • Reading a document writes its values, identifiers and record of the run together or not at all, so a retry after an interruption can no longer list the same candidates twice. A document removed, or a version approved, while its document was being read receives nothing from that reading.

1.34.1

2026-09-26Hotfix

Fixed

  • After signing in, a person is taken only to a page of this service. The sign-in page reads the page to return to from its own address (`/login?next=...`), and until now it followed that value wherever it pointed, another site included. A value that is not a path on this service now opens Home.
  • A link opened while signed out keeps its query through sign-in. A shared Products list (`/products?sort=family`, `?act=`) or a Readiness tab (`?bucket=FIXED`) now opens as it was sent once the person has signed in, instead of without its filters.

1.34.0

2026-09-25Release

Added

  • Home is the organisation's view, counted in the organisation's units. Products ready by horizon: how many products hold everything owed now, for the DPP, for 2030 and 2032, and for the DoPC, each with the milestone's certainty. What closes the gaps: one row per act across the portfolio, with who does it, how many products it touches and how many gaps it closes; an organisation-level act is one act, a family-level act is per family, and each row links to where the act is done (Settings, Regulation, the one product, or the Products list filtered to the products that need it). Gaps no act in the tool can close are counted apart with the reason. Families with their next milestone, named. Under "Needs you", the three acts of most leverage the person's role can take, and one line saying what waits on others and on whom.
  • The Products list leads every card with held of total, gaps and acts; sorts by most gaps, least held, name, family or step; filters by step, family and act. The filters and the sort are in the address, so a filtered list can be shared or reloaded, and a link to an act no product needs any more says so. A role that cannot create products is told who can.
  • Settings, Activity: the organisation's audit trail in plain words, for every member: approvals and publications, documents, review decisions, identifiers, declaration details, members, invitations and settings, with one person's run of decisions on one product as one line.

Changed

  • Summed requirement counts across products are gone from Home and from the Regulation page (a family now says how many of its products are ready now and how many acts close its gaps). Requirement counts stay on each product's Readiness tab.
  • Readiness offers no act on an approved version, where every change is refused: its gaps say that corrections start a new version. The organisation record is offered only for products the organisation manufactures. The plant of production, recorded when a product is created, is named as such. The banner counts these gaps apart instead of claiming every gap has an act.
  • "Closes n gaps" counts gaps only; the preparations for content not yet defined are counted as preparations.
  • On the Readiness tab, "What is missing" sits directly under the banner, where a tile's "See n gaps" now lands; "Designate" and "Record the product-type code" scroll to the identifiers. The ladder and the list read chronologically: in force, 2027, 2030, 2032, then no date yet, then undefined. A tile keeps its size; its definition opens as a bubble on hover or focus. Clearing a tile's filter keeps the reader at the list.
  • Recent activity left Home for Settings, Activity.
  • The running release is at the foot of the sidebar on a wide screen, and above the bottom bar on a phone, where it had been hidden since 1.32.0.

1.33.0

2026-09-25Release

Added

  • DPP readiness against a requirement set, per horizon. The product's Readiness tab leads with a banner: how many of the requirements the regulation names through 2032 are held ("24 of 49"), one bar split into the three groups by certainty (now, fixed dates, expected), four tiles with one word each, a fraction, a change since the month began and a link to the gaps of that group, and the actions that close every gap with the signed-in person's share. Below it, a ladder with one row per horizon (owed now; the DoPC when the family's specification is mandatory; the construction DPP expected 2027; the indicator sets fixed in law for 2030 and 2032; what the regulation names but has not defined, counted as preparations), each opening the requirements behind its count. Then "What is missing": every gap once, sorted by when it is owed and grouped by who can fix it, each with why it matters, what resolves it, and the place the fix is made. Every number is a count against a list the person can open; there is no percentage and no composite score.
  • The predetermined environmental essential characteristics of Regulation (EU) 2024/3110, Annex II (a) to (s), as properties of every product family, each carrying the milestone from which it is owed (with the DoPC, 9 January 2030, 9 January 2032), with their EN 15804+A2 codes and units and their bSDD LCA dictionary identity. Added to families already seeded, on deploy, with no operator step. They are extracted from a document with the environmental-declaration role (an EPD), not from a DoP or a data sheet.
  • Declaration details on the product: intended use, AVCP system and notified body, recorded by an Editor and carried into the DoPC draft's readiness, which closes three of the sections the draft could not hold.
  • Home leads with the same banner summed across the portfolio and lists each product as held of total with its gaps and actions; the Regulation page says per family how many requirements are held across its products.
  • The exported package carries the readiness counts per horizon (schema 2.5).

Changed

  • Certainty is drawn as a second visual channel everywhere readiness appears: solid frames for fixed in law or in force, dashed for expected, dotted for content not yet defined, always with the word beside it; colour keeps meaning held, partially held and missing only.
  • The DoPC draft names the intended use, the AVCP system and the notified body once recorded.

1.32.0

2026-09-24Release

Added

  • One navigation on every signed-in screen. On a desktop, a sidebar with Home, Products, Regulation and Settings, the organisation's Organisation, Members and Data sharing screens, and the signed-in person at the foot. On a phone, a top bar naming the organisation and a bottom bar with the same four places. The account menu holds the profile, sign out, and the organisations the person belongs to.
  • A Home screen: what needs the signed-in person, in their role (approvals and publications waiting for an Owner, decisions for a Reviewer, products without documents for an Editor, open invitations, an incomplete profile); the five steps across every product with how many sit at each; readiness across the portfolio as counts and a bar per product, never a score; the next regulatory milestone for each product family; and who did what lately.
  • Switching organisation, for a person who belongs to several: one tap in the account menu, audited.
  • The product is read in tabs: Overview (progress, the step due now, identifiers, the readiness headline), Review, Readiness (every characteristic, the nine DPP content elements, the regulatory calendar), Publish (with the declaration draft), and a Settings tab for reset, delete and private that only an Owner sees.
  • A Regulation page: the frameworks and the milestone calendar for every product family the organisation can use, each milestone with its certainty in words.
  • A Settings menu page, and a print or save-as-PDF action on the declaration draft.

Changed

  • A control appears only for a role that carries its action, and a screen whose purpose is an action the role lacks says who takes it, so nobody meets a refusal after a click.
  • The Products list shows the step each product is at and a readiness bar, filters by step, says "Published" only when a package exists, and asks a product without documents for one instead of counting its missing values as decisions.
  • Statuses read in words ("In review", not IN_REVIEW). The review screen leads to approval once every decision is made. The empty portfolio names how many templates are ready. The example manufacturer in the new-product form is no longer a real one.

1.31.0

2026-09-24Release

Added

  • The publish screen says who approved a version, with their job title and company: "Approved by Anna Kowalska, Quality Manager at Acme Boards, on ...".
  • The DoPC-ready draft has a "Signed for and on behalf of the manufacturer by" section naming the approver and their function, with the date of issue. A missing name or function reads "Not stated", and the place of issue and the signature itself are left to the manufacturer.
  • The published draft (`dopc-draft.json`, schema `annex-v-draft/1.3`) carries the same signatory: name, function and company, never an email or phone number.
  • Before approving, the publish screen reminds you to add your name and job title to your profile if either is missing, since the draft names whoever approves.

Changed

  • An approval keeps the approver's name, job title and company as they were when they approved, so a later profile change never rewrites who signed an approved version, or as what. Approvals made before this release show the approver's current profile.

1.30.0

2026-09-24Release

Added

  • A Profile screen (open it from your name at the top of the Products page) where each member keeps their own full name, job title, company, phone number and time zone. Every field is optional, and the page says who sees what.
  • The members list shows each person's name, job title and company. A phone number is shown only to Owners and to the member themselves.
  • Dates on the members screen appear in your own time zone once you set one (UTC until then).
  • An invitation names the sender's job title and company beside their name.
  • An optional, unticked box to receive TylkoAdvisors news about Data Framer. Each choice is kept with its date and the wording shown, and can be withdrawn at any time. It is separate from the sign-in and invitation emails.

Changed

  • The header shows your name, where you have given one, instead of your email address.

1.29.2

2026-09-24Hotfix

Changed

  • The sign-in code and invitation emails are now designed emails in the Data Framer style: a branded header, the code shown large in two groups of four, an Accept invitation button with the link written out beneath it, the role explained in a sentence, the expiry date written in full, and a footer saying who operates the service and why the email arrived.
  • The emails are sent under the name "Data Framer by TylkoAdvisors" rather than a bare address, and an invitation's subject names who sent it ("Piotr Pyszkowski invited you to ..."). Replying to an invitation reaches the person who sent it.
  • A sign-in code pasted with the space from the email ("1234 5678") is accepted.

1.29.1

2026-09-24Hotfix

Fixed

  • An invitation link could point at the server's internal address (`https://localhost:8080/...`) instead of the service's public one when `APP_URL` was not set. Without `APP_URL`, the link now uses the public domain Railway gives the service. An invitation already sent with a wrong link still works: open the same link on the public address, or withdraw it and invite again.

1.29.0

2026-09-23Release

Added

  • A Members screen (linked beside Organisation on the Products page) lists who belongs to the organisation, with each person's role and status, and the invitations still open. Every member can see it; only an Owner sees the controls.
  • An Owner invites a person by email and chooses their role. The person receives a link that works once and expires after seven days; opening it and entering a sign-in code sent to the same address makes them a member with that role. A forwarded link signs nobody else in.
  • An Owner changes a member's role, deactivates or reactivates a member, and withdraws an open invitation. Inviting the same address again withdraws the earlier link. A change takes effect on the member's next request, and each one is recorded with who made it.
  • An organisation always keeps at least one active Owner, and nobody can change their own membership.
  • If the invitation email cannot be sent, the Owner is shown the link to pass on another way.

Changed

  • A sign-in code is sent only to an active member, or to an invited address opening its invitation. The `INVITE_ALLOWED_EMAILS` setting is retired: adding or removing a person no longer needs a configuration change or a deploy.
  • Signing in for the first time no longer makes a person an Owner. Everyone who is already a member keeps their membership and role; an address that was on the old list but never signed in needs an invitation.
  • On an organisation with no Owner, the first one is invited from the Railway console: `npm run maintenance -- invite-administrator --actor <you> --email <them>`.

1.28.0

2026-09-23Release

Added

  • A product data template now holds its properties in groups, as ISO 23387 describes a data template: the product characteristics under the family's harmonised standard, and the environmental indicators under EN 15804. Each property states the standard it is declared according to.
  • A template can carry several classifications at once, each with its system, code and dictionary release, and a property can carry several dictionary identities at once. Every class and property link that existed before is kept as the first of its kind.
  • The published package (schema `dataframer.product-package/2.4`) lists the template's classifications and groups, and for each declared value its group, its reference document and every dictionary identity of its property. The fields packages already carried keep their meaning; packages already published keep the version they were built under.

Changed

  • On the fibre-cement cladding template, the cradle-to-grave global warming potential now carries its dictionary identity (the same indicator as the product-stage value, for a wider module scope), so it counts as semantically bound in the readiness summary.

1.27.2

2026-09-23Hotfix

Added

  • The regulatory timeline on a product's page now shows that the EU digital product passport registry went live on 20 July 2026 (Commission Implementing Regulation (EU) 2026/1778), as an in-force milestone under the ESPR framework. The registry holds identifiers, not product data, and this is not a construction DPP obligation date; the timeline says so.

Changed

  • The data-use policy the application records for each AI provider now carries a retention period and a region verified against the providers' own current terms on 23 September 2026: neither Anthropic nor OpenAI trains on API customer content, and both keep inputs for up to 30 days for abuse monitoring. Nothing changes in what is sent or refused; every new suggestion names the new policy version.

1.27.1

2026-09-22Hotfix

Added

  • Your role now shows next to your email at the top of the products page: a small colored circle with a letter (O for Owner, E for Editor, R for Reviewer, V for Viewer). Hover it to see the full role name.

1.27.0

2026-09-22Release

Added

  • A product can now be marked private from its own page: an administrator can toggle it on to keep that product out of every shared dataset entirely, whatever data-sharing tier the organisation has chosen. Marking a product public again lifts the exclusion.
  • Choosing the model-improvement data-sharing tier now shows a plain warning before you pick it: once a training run has used a record under this tier, that run cannot be undone; choosing a narrower tier later only stops future runs, not ones already trained.

Changed

  • What can end up in a shared dataset is now decided per value, not only per organisation: a declared value or a quoted line from a public document can qualify once the record is approved, the product isn't marked private, and the organisation's tier allows it; a rejected finding, a source document itself, personal data or another party's data never can, at any tier.
  • Every AI provider this application can call is checked against its own data-use policy before a document is sent to it; a provider whose policy permits training on customer content is refused rather than used.

1.26.0

2026-09-22Release

Added

  • What a member can do now depends on their role. Only an Owner can approve or publish a version, change the organisation record, or change the data-sharing choice; an Editor can upload and edit but not approve, publish or administer; a Reviewer can work the review queue and edit but not approve, publish or administer; a Viewer can see everything but change nothing, and cannot download a source document (a published package is still open to them). Every refusal is recorded, with who was refused and what they tried.
  • Someone can now be granted a service-administrator designation: broad, audited access across every organisation, held only by named individuals and granted only from the Railway console, never a screen in the application.

Changed

  • Every account in this beta is currently an Owner, so nothing about what you can do changes today; this is the mechanism the next release's member-role screen will assign roles through.
  • Changing the data-sharing choice now requires the Owner role. It briefly required this once before, in 1.22.1, and was reverted the same release because the role system didn't exist yet to enforce it correctly; it does now.

1.25.0

2026-09-22Release

Added

  • Signing in now sends a one-time code to your email instead of asking for a shared passphrase: enter your address, then the eight-digit code that arrives, and you're in. The code works once and expires after ten minutes.
  • Signing out now signs you out everywhere, not just this browser: every session you had open, on any device, is refused on its next request.

Changed

  • Who can sign in has not changed: an address still has to be on the invite list first, the same as before. What changed is how you prove it's you once you're on it.
  • The old passphrase field is gone. If you had it saved somewhere, you can forget it; it no longer does anything.

1.24.0

2026-09-22Release

Added

  • The foundation for real organisation membership: a person's account and their standing in one organisation are now separate records, so the same person can belong to more than one organisation, each with its own role. Nothing changes for today's single organisation or its members.
  • A member whose organisation access is deactivated is refused on their very next request, not just once their session naturally expires. There is no screen yet to deactivate anyone; this is the mechanism the next release's administration screen will use.

Changed

  • Every existing account keeps its history (approvals, the data-sharing decision, the audit trail) exactly as before. Signing in once after this release re-establishes membership automatically; nothing else is required.
  • Everyone signed in when this release deploys, not only members who are later deactivated, is signed out on their very next request and needs to sign in again once: this release itself has no deactivated members yet, but its own migration leaves no one with an established membership until they do.

1.23.0

2026-09-21Release

Added

  • An organisation record screen (Products, then Organisation): the manufacturer's name, VAT number, EORI number, GLN and registered address, each change recorded with who made it. A product whose manufacturer is the organisation carries these as its economic operator in the declaration draft and the published package; a product prepared for a different manufacturer carries that manufacturer's name and no identifiers, never the organisation's.
  • The plant of production can be recorded with its identifier, the scheme of that identifier and its country when a product is created, and the declaration draft names them.
  • One accepted identifier can be designated as the DPP unique product identifier, the identifier the construction digital system will know the product type by. The declaration draft states it, or states that none is designated.
  • Every product shows its construction DPP content coverage: for each of the nine content elements, whether the record holds it, partially holds it, does not hold it, or does not yet owe it because the family's obligation is not active. The published package carries the same coverage.

Changed

  • The published package's schema moves to `dataframer.product-package/2.3` for the coverage, the identifier designation and the operator identifiers, and the declaration draft's to `annex-v-draft/1.2`. Packages already published keep the version they were built under.

1.22.5

2026-09-21Hotfix

Security

  • Four maintenance operations that rewrite the curated templates and the regulatory baseline for every organisation at once (seeding, dictionary-URI backfill, template resynchronisation, regulatory resynchronisation) were reachable by any signed-in member as web endpoints. They are no longer served at all; an operator runs them from the Railway console, naming themselves, and every run is recorded in the audit trail.

1.22.4

2026-09-21Hotfix

Fixed

  • A signed-in session lasted 30 days regardless of activity. Now lasts 7.
  • Signing in and out was not recorded anywhere. Both are now audited, same as every other consequential action.
  • The evaluation tool, which spends real provider budget per run, had no limit on how often it could be called and left no record of who ran it. Both are now in place.

1.22.3

2026-09-20Hotfix

Fixed

  • The published package and the draft declaration named this account, Tylko Advisors' own workspace, as the manufacturer's economic operator on every product published since operator identifiers shipped. A declaration now states the product's own manufacturer there and shows the operator's identifiers and address as not yet recorded, rather than a value that was never the manufacturer's to begin with.
  • Signing in accepted an unlimited number of passphrase guesses. Repeated failures from one source are now refused for a time.
  • Resetting a product's data, which is the intended way to correct a mistake on an approved, published record before real version succession exists, left no record of who did it or that it had happened. It is now an audited action, like every other change to a product.
  • A page that omitted which product to inspect was answered with a different organisation's demo product and its extracted values, evidence quotes and source file names. It now asks for one.
  • Added baseline security headers (clickjacking, MIME-sniffing, referrer and transport protections) to every response; none were set before.

Security

  • See "Signing in accepted an unlimited number of passphrase guesses" and "Added baseline security headers" above.

1.22.2

2026-09-19Hotfix

Fixed

  • 1.22.1 restricted changing the data-sharing choice to an account owner. Reverted: role-based access is BR-023, and BR-023 is not built anywhere in this codebase, its own design column specifies a role set (Owner/Admin/Editor/Reviewer/Viewer/API) the schema's actual roles don't match, and nothing else in the application enforces a role today. Gating one route ahead of a real BR-023 implementation, with a role list that doesn't match what BR-023 itself asks for, was inconsistent with what this project actually has built. Any signed-in member of the organisation can change the choice again, the same as every other setting.

1.22.1

2026-09-19Hotfix

Fixed

  • Recording a data-sharing choice was three separate, unguarded database writes. Under two overlapping changes, the audit trail could log the wrong prior policy, and a failure in the last write could report a save as failed after the policy change had already committed, inviting a retry that duplicated the record. Now one transaction.
  • Reading the current choice was three independent, unsynchronized queries that could each observe a different moment, so the "Current" badge and the "Chosen by" line beside it could name two different decisions. Now one query.
  • The settings form kept its own copy of the selected policy in local state, seeded once on mount, so if the organisation's choice changed from elsewhere while the page stayed open, the checked option could silently disagree with the "Current" badge next to it.
  • Only an owner can change how the organisation's data may be used. Every other setting in this single-tenant beta is open to any signed-in member; this is the one BR-024 itself calls the gate on processing any real customer data.
  • The link to the data-sharing settings screen did not render at all below the mobile breakpoint, leaving no way to reach it on a phone.
  • The note on a data-sharing choice had no length limit anywhere in the stack. Capped at 500 characters.
  • A comment on the published package claimed its data-sharing eligibility fields are always false, which stopped being true the moment this same release shipped the settings screen that can flip them.

1.22.0

2026-09-19Release

Added

  • A data-sharing choice, explicit and attributable (BR-024, TR-013, TR-003). Under Data sharing in the header, an organisation picks private only, aggregate learning permitted, or model improvement permitted, with an optional note; every choice is recorded with who made it and when, kept as history rather than overwritten. No aggregate-learning or model-improvement job exists yet to act on a broader choice, and the screen says so rather than implying otherwise: choosing one only records consent for when a pipeline exists to use it.
  • The published JSON package states the data-sharing policy in force when it was built, and whether that policy made it eligible for aggregate learning or for model improvement. A package already published keeps the policy it was built under even if the choice changes later, the same guarantee 1.20.3 established for the schema version itself. The CSV and XLSX exports carry declared values only, the same as every other envelope field (the operator, the plant, the technical route) added since 1.20.0.

Changed

  • The published package's schema moves to `dataframer.product-package/2.2` for the added consent fields. Packages already published keep the version they were built under.

1.21.2

2026-09-19Hotfix

Fixed

  • The golden-set evaluation flagged four correct translations as unsourced. A real document states "la norme est remplie", French for "the standard is met", and the model correctly read it as "pass"; no English word for "pass" can ever appear in a French sentence, so the substring check flagged a right answer. A curated expectation can now record the exact phrase a person read and confirmed carries the value, and only that recorded phrase is accepted, so the check still requires a real quote and a real, named reason to trust it rather than a blanket loosening.

1.21.1

2026-09-19Hotfix

Fixed

  • The golden-set evaluation reported a value as unsourced when the model had appended a unit to it, such as a thickness range of "60-160 mm" quoted from a row reading "Thickness range (mm) 60-160". The number is in the quote and the unit came from the column heading, which is formatting rather than an unsourced claim. A trailing unit is now allowed, and nothing more: a range stitched together from two unrelated numbers in a list is still caught.
  • A groundedness flag on a property the case says nothing about did not carry the quote it was flagged for, so the finding could not be judged without re-running it. Every flagged row carries its quote now.

1.21.0

2026-09-19Release

Added

  • A golden-set evaluation that measures whether extraction is correct (TR-042). The end-to-end suite runs the pipeline against a deterministic fake provider, so it proves the plumbing and says nothing about the answers. This runs the real manufacturer documents already in the repository through the same request the pipeline builds, against a real provider, and scores the result against expectations written from the documents themselves. Nothing is written to the database. Run it with `npm run eval -- <case> <url>`, and every run leaves a report behind so a prompt change can be judged against the run before it.
  • The first case covers the DDP-X declaration of performance and its technical data sheet, thirteen properties each read from the document rather than from what the product is known to be.

Fixed

  • Both AI providers built their client when the module was imported, and the software development kit throws when it is built without a key. A deployment holding one provider's key could not load the other provider's module at all, which turned a missing optional key into a module that cannot be imported. Both now construct on first use.

1.20.5

2026-09-19Hotfix

Fixed

  • Documents removed from an approved version before 1.20.1 stopped that being possible can be put back. Those versions kept their values, their evidence and their published package while the document list went empty, so the record could not show what it was approved against. The repair restores a document to Processed where it produced evidence and to Safe where it was stored and produced none, and leaves alone anything removed from a draft, which was removed deliberately.

1.20.4

2026-09-19Hotfix

Fixed

  • An approved and published version could show "Upload documents, now" and "Extract values, later" beside its own package, with an "Upload a document" button that leads to a page saying the version accepts no documents. The progress rail decided each step by counting what is on the record at that moment, and only the last two steps looked at whether the version was approved. Approval is the end of the line: the three steps before it are now settled by the version's status, so a frozen record reads as finished whatever the counts say.
  • An empty document list on a frozen version said "No source documents yet", inviting an upload the version cannot accept. It says that no documents remain on the version.

1.20.3

2026-09-19Hotfix

Fixed

  • The published package and the draft declaration gained fields in 1.20.0 without their schema version moving, so two different shapes answered to one version string: a package downloaded before that release carries none of the source documents, the operator or the declaration form, and said the same schema as one downloaded after it. New publications are `dataframer.product-package/2.1` and `annex-v-draft/1.1`. Packages already published keep the version they were published under, which is what they are.

1.20.2

2026-09-19Hotfix

Fixed

  • The draft declaration was headed "Declaration of Performance (DoP) (Draft)", two parentheticals in a row where only the second matters. It reads "Declaration of Performance (Draft)" again, and "Declaration of Performance and Conformity (Draft)" for a family whose specification is under CPR 2024/3110.

1.20.1

2026-09-19Hotfix

Fixed

  • A document could still be removed, or have its role changed, from an approved version through the API, which rewrote the list of sources in a package that had already been signed off. Both are now refused on a frozen version, like every other change to one.
  • Document roles guessed from the file name ignored underscores, so the names manufacturers actually use, such as `DoP_Product_2026.pdf` or `EPD_Range.pdf`, all arrived as "Other". A safety data sheet was read as a technical data sheet, and any file with "doc" in its name as documentation under other Union law.
  • The published package and the DoPC draft listed quarantined files, and files that failed before they were stored, among the documents behind the record. A file nobody can open is not a source.
  • Two products created at the same moment naming the same plant of production could each create their own copy of it. One plant of a given name per organisation is now a database constraint.
  • The DoPC draft page showed only the performance table. It now states the declaration form the product family's CPR regime implies (a Declaration of Performance, or of Performance and Conformity), the technical route, the operator identifiers and registered address, the plant of production, and the source documents with their roles. It titled itself a Declaration of Performance whatever the regime said.

1.20.0

2026-09-19Release

Added

  • Every uploaded document carries its role in the construction-DPP content bundle: declaration, technical data sheet, environmental declaration, certificate or assessment, instructions for use and safety information, technical documentation, documentation under other Union law, label, or other. The role is guessed from the file name, confirmed at upload, shown in the document list, and correctable there until the version is approved.
  • A product can record its plant of production when it is created, and the product page names it.
  • ETA numbers and DoPC references are accepted as identifiers, by hand and from the documents.
  • The regulatory column states the product family's technical route (harmonised standard, or European Assessment Document with an ETA), the CPR regulation its specification is under, and therefore whether the declaration is a DoP or a DoPC.

Changed

  • The published package and the DoPC draft carry the source documents with their roles, the plant of production, the manufacturer's operator identifiers and registered address where recorded, and the technical route and declaration form.
  • The organisation record holds operator identifiers (VAT, EORI, GLN), a registered address, and a data-sharing policy that defaults to private-only. None has a screen yet; the fields exist so the DoPC draft can show what is missing and so nothing later needs a rewrite.

1.19.0

2026-09-18Release

Fixed

  • Legacy Word (.doc) and Excel (.xls) files are refused at upload, and the message names the accepted formats. They used to be accepted with no parser behind them, so the file scanned clean, was stored, and sat at "Safe" for ever while extraction failed silently.
  • A document that cannot be read is marked "Could not be read" with a reason written for the person who uploaded it: a damaged or password-protected file, or a scanned PDF with no text layer, which now says so and suggests uploading it as an image. Such a document is not retried, since it would not read better on the third attempt.
  • A failure in the model provider or in storage is still retried; if the last attempt fails too, the document is marked with a reason rather than left looking fine.
  • Failed documents appear in the document list with their reason, and the step tracker counts them, so nothing that was uploaded can disappear from view.
  • Downloading a source document whose name contains characters outside Latin-1 (Polish letters, for example) returned an error. The file name is now sent in the RFC 5987 form with an ASCII fallback.

Changed

  • Removing a document is its own state, shown as "Removed", rather than sharing the "Failed" state. Documents that were in the old shared state before this release are treated as removed, so none resurfaces without a reason to show.
  • The upload form lists the accepted formats: PDF, Word (.docx), Excel (.xlsx), CSV, text or image.
  • A stored document that failed extraction can still be downloaded, since the first question is what was uploaded.

Added

  • This release notes page at /releases, linked from the version badge in the footer. Every version bump must carry an entry here; the build refuses one that does not.

1.18.2

2026-09-18Hotfix

Fixed

  • The template picker on New product described every family as a "Tokyo demo template". Each now reads "Product data template for ..." with the family and standard it covers. The template backfill carries the wording to templates that were seeded before this fix.

1.18.1

2026-09-18Hotfix

Changed

  • The Node runtime is pinned to 22.x for every environment, and the malware-scan image used by the test suite is pinned to a fixed version. Nothing visible changed; both had been matching by coincidence rather than by configuration.

1.18.0

2026-09-17Release

Changed

  • The product page follows the business process from top to bottom: where the product is in its five steps, the step that belongs on this page, the result of that step, how good the data is, and the destructive actions last. An approved version no longer shows an upload control the server would refuse.
  • The dashboard's product cards gained a search box, a status filter and a next-action line, and each product family carries its own glyph.
  • The page header carries the product family; the page heading carries the product name. They used to both carry the product name.

Versions before 1.18.0 predate these notes; their content is in the repository's commit history.