General PDF viewer - one Bluebeam-style viewer that opens ANY pdf (submittals/contracts/RFIs + drawings); shared renderer-decoupled markup toolkit; takeoff & progress as modes on top¶
| Stage | Building |
|---|---|
| Status | Partial |
| Design status | In progress |
| Estimate | XL |
| Confidence | High |
| Linear | PIN-973 ↗ PIN-1074 ↗ PIN-348 ↗ |
| Linear status | Done · +2 planned |
| Cycle | C14-C15 |
| Design | Design ↗ |
| Linear epic | Drawings, Documents & Takeoff |
| Module | Progress Drawings ↗ |
Priority: High
Scope¶
Universal in-app viewer for PDFs, Word, and Excel — replaces browser-downloads with in-app opening everywhere a document link is clicked — sized to Bluebeam-parity markup quality. Keeps large drawing PDFs uncompressed and vectorized so AI takeoff can still read them, and fixes the multi-page scroll fault found in the takeoff viewer. Performance and markup approach were validated against Procore as the bar. (Source: PIN-973, PIN-348.)
Acceptance criteria¶
- Clicking any PDF/Excel/Word link opens it in-app, not as a Downloads-folder file
- Large drawing PDFs stay uncompressed and vectorized (not rasterized) so AI takeoff can still read them
- The multi-page large-PDF scroll error found in the takeoff viewer is fixed in the universal viewer
- Viewer performance (render time, scroll FPS, memory, markup latency) matches or beats the Procore benchmark
- Markup add/edit latency validated on large real-world drawing sets
- iPad touch gestures — pinch-zoom + markup pen — work smoothly
- Viewer is a distinct, universal layer available to every user, separate from the takeoff/progress-drawing tools built on top of it
Conor's comments¶
Per 2026-08-18 ruling. One PDF spine + one decoupled overlay toolkit + takeoff/progress as producer→consumer modes + freeform annotation (private-by-default + publish) vs progress markup (official) as two subsystems. Bluebeam = approved toolset at quality, NOT full breadth.
Notes¶
Ruling: 2026-08-18-viewer-architecture-general-pdf-and-bluebeam-scope.md; Marko PDF-viewer thread 8/18. Build order: annotation set → rail+tabs → split-screen. Offline = later workstream, not launch.