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.
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.
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.
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.
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.
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.
| Area | What to know |
|---|---|
| Migration 068 | Adds 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 069 | Adds 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 070 | Adds 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–072 | Add 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 environments | The 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 authorization | Hosted 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 analytics | Unfinished 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. |
| Dependencies | The app adds pdfjs-dist for browser PDF rendering, polygon-clipping for real shape cutouts and posthog-js for optional analytics and session replay. |
/admin; it is not yet restricted to an administrator role.