A scale set on one sheet can now go to any other sheets in the project, picked from the outline's folders with a page preview. Right-click with a tool armed puts it down the way Escape does. Text in a Text Box, Callout, Note, Cloud+ or Dimension takes a font, bold, italic, alignment and spacing, and words you select on a drawing or spec can be highlighted, underlined or struck through, as Revu does. Addenda get their own upload lane and outline bucket. Customers see a short What's new popup after each release from now on. Advanced AI processing is in this release for staff only.
Set Scale has a new row under the page scale: Apply to other pages… It is dimmed until the sheet has a scale. It opens a floating picker titled with the scale (Apply 1" = 50'-0" to). Search, then pick from the outline's drawing folders and their sheets; a folder tick takes the whole folder and each column has Select all. A slider at the foot runs from 1 to 4 pages per row: at 1 you see the focused sheet large with its current scale, at 2–4 a grid of thumbnails with ticks. A sheet that already holds a different scale shows it in amber, and the footer counts them ("63 pages · 2 already have a scale"). Applying asks Cancel, Skip or Replace for those, then confirms "Scale applied · 63 sheets", and the card row reads "✓ Applied to 63 pages". What travels is the page scale: X, a separate Y when there is one (swapped on a sheet turned a quarter), how it was entered, and the precision. A sheet open in another pane takes the scale at once; another sheet refits its markups' lengths the next time it opens. The server writes only the scale keys, under compare-and-swap, so a tab with that sheet open re-reads instead of saving the old scale over it. (#867, ENG-374)
With any tool armed other than Pan, Select or Select Text, a right-click that does not drag is one Escape press. Mid-draft, it throws the draft away and the tool stays armed; with nothing in flight, it clears the selection and puts the tool down to Pan or Select, whichever you used last. No menu opens while a tool is armed, even over a markup. With Pan or Select armed, right-click opens the sheet and markup menus as before, and right-drag still draws a selection box. Text editors, Select Text, Note pop-ups and Snapshot or Cut frames keep their own right-click. Escape and right-click now share one set of rules. (#865, ENG-370)
The Style chip replaces Text size on every markup that holds words: Text Box, Callout, Note (Subject and Content), Cloud+'s box, and a Dimension's caption. It shows the font name with the size typed beside it. Its card has 8 fonts (Hanken Grotesk, Helvetica, Arial, Calibri, Times New Roman, Cambria, Georgia, Courier New), size, bold, italic, underline, strikethrough, superscript and subscript, left/centre/right and top/middle/bottom alignment, line spacing, and one margin for all four sides, as Revu has. With the box selected, a style applies to the whole box; while typing, to the selected words (⌘B, ⌘I, ⌘U and the rest). The Color chip's Text part colours the selected words. Paste keeps bold, italic, underline, strikethrough and super/subscript. With Text, Callout or Note armed, a click on a box's words puts the caret there. Export writes Revu's /DS and /RC and import reads them back, so styled text round-trips with Bluebeam; flatten draws it too. Markups made before this release draw exactly as they did. Line and Arrow no longer take a new label; a label imported from Revu still draws. (#850, ENG-359)
Select Text now works on drawings as well as specs, in both viewers. Right-click a selection for Highlight, Underline, Squiggly, Strikethrough, Copy and Copy link. Each is its own markup ("Highlight 1", "Strikethrough 2"), covers a multi-line selection as one markup, and has Color and Opacity in the bar. It behaves as Revu's does: pinned to its words, with no handles, no dragging, no nudging and no copy (a mixed selection still copies its other markups, and a selection of only these says why it cannot be copied). Double-click, or Open pop-up note from the menu, edits its comment, which starts as the marked words. A Style option switches Underline and Squiggly. The last colour and opacity you give each kind become its default. Ctrl+Shift+A selects all the text on the page while Select Text is on. They export as Revu's native /Highlight, /Underline, /Squiggly and /StrikeOut and import back as the same types. A Revu text highlight now imports as one text highlight instead of one freehand stroke per line. (#851, #855, ENG-362)
Copy link on selected text copies a link to those words on that page. Paste it over words in a Note's Content and they become a link, or use Link (⌘K / Ctrl+K) in the note pop-up, which takes a pasted link or the page open beside you. Following a link opens the page in the secondary viewer with the words highlighted; the main viewer does not move. The link rides the words, so the text stays plain in Revu, and a Layr export re-imports with its links even after Revu re-saves it. (#851, ENG-362)
New project and Add documents have an Addenda · optional lane beside Front-end docs. An addendum is stored as a spec book, so it gets a spec book's words, section starts and viewer, and every one of its pages also gets the sheet read a plan set's pages get, because an addendum mixes reissued sheets, revised spec sections and front-end pages. The read sets the sheet number and title, keeping a number only on a page it sees as a sheet; a section start stays the text's, and when the read fails the text's label stands. The outline has a top-level Addenda bucket: each addendum, then its pages by sheet number and title, spec section, or printed heading. A page opens in the spec viewer, search filters the bucket, and addenda no longer count toward Specifications. This is a stopgap until the Addenda module. (#866, ENG-371)
The first signed-in page after a release shows that release's What's new lines, if it has any. Someone who skipped releases sees each unseen release's lines, up to three releases; someone who has never had the popup sees only the newest. The seen version is saved on the account, so it follows the person to another browser. What's new in the account menu reopens it, and /whats-new, linked from the projects home header and from the popup's "See all updates", lists every release's lines, newest first. Past releases' lines were written and approved for the log. This release is the first one production users will see it for. (#852, ENG-360)
Behind ui:advancedAiProcessing (review: staff only). The project menu's Advanced AI processing opens a processing page in place of the old AI enrichment run: a Process dialog with an estimate and a spending cap, the legend, vocabulary and pages steps, progress, and cancel. A page's detail shows the sheet with its references and their targets and the trace log. Its first feature on the canvas is same-sheet references behind "Show detected marks": hover shows the target's text, and a click pans to the target and flashes it. A run reads every sheet's legends once per project and reuses them; each page then gets its own read. Model answers are cached, so a retry after a crash does not pay twice. Estimates are about $1.50 a page (from $0.60 to $3.00) and 6–25 minutes. Traces now save after the work they record, as one contact sheet per legend area instead of a picture per sample, so a run no longer stalls on uploads. The eval-only v3 symbol detection it is built on also landed. (#833, #856, #862, ENG-331)
114_ai_processing.sql adds four tables for Advanced AI processing: ai_processing_runs, ai_processing_project_state (the legend and vocabulary stage a project's runs reuse), ai_processing_page_runs and page_references. RLS is on and only the service role is granted. It adds the SECURITY DEFINER functions start_ai_processing_run, publish_ai_page_run, finish_ai_page_run and report_ai_spend, executable by the service role only, and a private Storage bucket, ai-processing, for traces. layrbuild.dev applied this file in the prepare job of deploy 39671722957 (the deploy for #856, commit 4d5f9a55).115_ai_processing_trace_status.sql adds a nullable trace_status (saving, saved or failed) to ai_processing_runs and ai_processing_page_runs. layrbuild.dev applied this file in the prepare job of deploy 39684162476 (the deploy for #862, commit 06315dbe).116_addendum_documents.sql adds source_documents.is_addendum (boolean, default false) and a check constraint that an addendum is a spec book. Existing documents are unchanged. layrbuild.dev applied this file in the prepare job of deploy 39895019271 (the deploy for #866, commit 7e8b1373).deploy.yml, before the new code. Do not apply them by hand, and do not edit them.ui:advancedAiProcessing, status review (on for staff, dev and local; off for customers). With it off, the start route and the overview answer 404. No other flag changed. The four text markups ride the released ui:selectText; text style and the Addenda lane have no flag and ship on.process_ai_run and process_ai_page and a Volume, layr-ai-processing-cache, created on first deploy. They use the existing OPEN_ROUTER_API_KEY in the pipeline secret. No new secret or environment variable is required: the V3_* variables the pipeline reads are optional overrides with defaults, and AI_PROCESSING_CACHE_DIR is for the local pipeline host only. The extract and vision Modal images now pin PyMuPDF 1.28.2, as the pipeline image already did; 2.0 breaks table reading. (#856, #861, #864)package-lock.json was rewritten in npm 11's form (six dev flags; no versions). (#861)POST /api/projects/[id]/page-scale (Apply scale, project write members only), the Advanced AI processing routes under /api/projects/[id]/ai-processing and /api/pages/[pageId]/ai-references, the /whats-new page, and two synced account preferences: whats-new and the text markups' tool defaults (ann-text-*).LAYR_ISOLATED for single-tenant hosts, and a media bucket for ./layr pr attach (#857, #858, #859); and the PyMuPDF pin in every install path (#861, #864)../layr bluebeam receipts will warn until a full --update run on a Revu machine. PDF flatten measures Calibri and Hanken Grotesk with Helvetica's widths.