A measuring tool on an unscaled sheet now asks for a scale first, then hands the tool back ready to draw. Set Scale is a floating card again. Your tool defaults, styles, colors and belt now live on your account, so they follow you to any browser. Hatched fills show up in exported PDFs, and failed processing posts to Slack.
On a spot with no scale, the first press of a measuring tool opens Set Scale instead of drawing. Nothing lands in PDF points. Set a scale by preset, by typing it, or with Calibrate's two clicks, and the same tool comes back armed with your style edits kept. Close Set Scale without a scale and the next press asks again. This covers Measure, Length, Dimension, Polylength, Perimeter, Diameter, Radius, Area, Volume, Dynamic Fill and the Sketch tools. Angle, Count, cutouts and plain markup don't need a scale. A scale viewport under the press counts as a scale.
Set Scale opens as a floating card in the middle of the viewer, with Page scale on top and Viewports below. The style-bar row is gone. A separate Y scale starts blank on Custom. Save as Preset is a clear action. The viewport menu no longer gets cut off. The corner scale pill shows the scale as you defined it, X over Y, and each row opens its own edit.
Tool defaults, saved styles, the armed and default style, My colors, the tool belt, the toolbar dock and snap lines now save to your account. Open Layr in another browser or on another machine and they are there. The first time you sign in after this release, whatever this browser already has goes up to your account. After that, the account copy wins on sign-in. Edits still apply instantly and sync in the background. If you are offline, the change stays in this browser and syncs next time.
Before, a hatched markup exported as its solid fill only, and a hatch with no fill exported blank. Exported PDFs now draw the hatch, so other PDF viewers and Bluebeam show it. Flattened exports burn it in. This covers rectangles, ellipses, polygons, clouds, areas, volumes, text boxes and callouts. An area's cutouts stay empty.
103_processing_failure_alerts.sql) adds the processing_failure_alerts table and the claim_processing_failure_alert function. layrbuild.dev already applied it. Production applies it when this release merges. It is additive.layr-processing-alerts on the pipeline. It exists in both layr-dev and layr-main. The secret must exist or the pipeline deploy fails. Its keys are optional: with POSTHOG_PROJECT_TOKEN set, each terminal processing failure sends one project_processing_failed event, and a PostHog Slack destination posts it. Without a token, nothing is sent.GET/PUT /api/me/preferences/{key}, backed by the existing user_preferences table. Keys: tool-defaults, style-presets, style-pointers, my-colors, belt, workspace. A PUT with a value the editor would not read is rejected with 400.project_created now carries user_email and project_name.