layr. ← All releases
Release notes

PDF-first editing and durable project processing0.9.0

Layr now paints the source PDF beneath live markups, keeps large project imports moving outside the browser request, and makes processing status, page search and measurement editing more direct.

2026-08-21Minor93 changesMigrations 068–072

Highlights

The editor paints the real PDF first Improved

Sheets render from their page PDF while extracted vectors remain available for selection, snapping and measurement. Page switches keep a full-sheet preview under the incoming PDF, preserve the camera deliberately and avoid showing the previous sheet as if it were the next one.

Project imports continue as durable background work Foundation

Creating a project records its document manifest, returns without waiting for extraction and lets workers resume bounded page ranges safely. Project cards show useful status, and a dedicated Documents & processing screen exposes each document, page-stage progress, failures, retries and deliberate reprocessing.

Search results land on the words that matched New

Page text now retains word positions, so choosing a result can open the correct sheet, frame the matching region and highlight it on the PDF canvas. Results without stored geometry still navigate to the right page instead of inventing a location.

Measurements and markups are easier to shape and read Improved

Measurement labels share clear value pills and per-markup display units, volume captures depth when committed, and diameter, radius, perimeter, area and polylength show the geometry that produced the quantity. Shapes gain proportional group scaling, side handles, honest cutouts and fills, draggable callout width and editable polygon vertices.

Authentication and project access now have one hosted path Security

Hosted requests use verified Supabase sessions, and project membership checks no longer depend on a rollout environment flag. The retired shared-key login route and local bypass are gone, while project-scoped import, processing, PDF and search APIs enforce the same access model as the rest of the editor.

Fixes worth naming

Upgrade notes

AreaWhat to know
Migration 068Adds durable project_imports, document-run and range state, links source documents to an import manifest, and installs service-role RPCs for resumable initialization, batching, completion and failure. Existing project creation data is preserved.
Migration 069Adds JSON word boxes to page_text and replaces its service-role upsert RPC. Existing rows receive an empty array; reprocess text for older pages when positioned search highlighting is required.
Migration 070Adds immutable page-stage outputs and desired/active version pointers, makes processing jobs unique by page, stage and version, and moves newly published vector artifacts to versioned keys. Failed reprocessing leaves the previous active output available.
Migrations 071–072Add bulk retry/reprocess for vector and text stages, then backfill desired versions from existing jobs and outputs so previously processed pages advance rather than silently reusing a completed job.
Hosted environmentsThe development deployment applies migrations 068–072 before this release is offered for production. Production still needs all five; CI applies them in order when the release PR is merged. Do not apply them by hand as part of promotion.
Authentication and authorizationHosted deployments must have Supabase Auth configured. APP_SECRET_KEY and PROJECT_ACL_ENABLED are retired: shared-key login is removed and project membership enforcement is always on. Confirm every intended user has the required project membership before production promotion.
Flags and analyticsUnfinished Takeoff/QTO entry points now default off and can be changed instance-wide at /admin by a signed-in user. PostHog session recording is optional; set both NEXT_PUBLIC_POSTHOG_PROJECT_TOKEN and NEXT_PUBLIC_POSTHOG_HOST only where recording is intended.
DependenciesThe app adds pdfjs-dist for browser PDF rendering, polygon-clipping for real shape cutouts and posthog-js for optional analytics and session replay.

Known limits