Skip to main content
Support

Browse by category

All categories
Home

Changelog

Every feature, fix, and improvement — grouped by area. Click any category to expand.

PDF Editor 10
changed One consistent editor across PDF and every file viewer

The PDF Editor and all seven file viewers (STL, OBJ, PLY, GLB, 3MF, STEP, DXF) now share a single editor shell, so the layout, toolbars, and mobile behaviour are identical wherever you are.

What changed

  • Unified shell — open the PDF Editor or any 3D/CAD viewer and the chrome is the same: top bar, mode switches, right-rail panels, and command menu sit in the same place every time. Learn one, know them all.
  • Mobile editor bar — phones get a canonical bottom bar and a slide-up Modes sheet instead of a cramped desktop toolbar. Measure and section controls float as top bars so they don't hide behind the app header.
  • Bigger touch targets — sample, splash, and dismiss buttons now meet the 44px minimum for comfortable tapping.

Bug fixes

  • Fixed a hydration error (React #418) that could flash or misrender tool pages on first load.
  • Gerber toolbar collapses to icons on narrower screens instead of overflowing.
  • STL manifold badge no longer overlaps the status pill; closed accordion headers no longer crush on small screens.
fixed STEP engine fixes — units, product names, arc surfacing, crash on every real file

The Rust-side STEP engine got three structural improvements followed by a critical bugfix that surfaced during code review. The first three add real-world file support that was previously broken; the fourth fixes a crash that was hitting every production STEP file with a header section.

  • Imperial and bare-metre units now respected — files declaring INCH (conversion-based) or bare METRE (no SI prefix) were rendering at the wrong scale because the tessellator assumed millimetres. The engine now scans the unit context once per file and scales every vertex to mm. Mixed-unit contexts (e.g. cm for accuracy plus mm for geometry) resolve to the geometry unit.
  • PRODUCT names with NULL descriptions now load — files emitted with a NULL description on the PRODUCT entity (very common — e.g. JDC4_.stp) used to silently drop the whole entity, so assembly tree nodes fell back to generic "Mesh 1, Mesh 2…" names. They now surface the actual product names.
  • Arc parametric data surfaced for 1-click radius — STEP CIRCLE entities are now extracted into a parallel array of centre, normal, and radius, ready to power a 1-click radius measurement on arc edges (instead of the current 3-click flow). Snap targets land in world-space aligned to the visible geometry.
  • Crash on every real file fixed — the unit and arc scanners assumed the first ENDSEC; was the data-section terminator; in practice that's the HEADER terminator, which sat earlier in the byte stream and produced an invalid slice range that crashed the engine. The scanners now search forward from the data section, are wrapped in a panic guard so future regressions surface as clean parse errors, and the tessellation tolerance now scales with the unit factor so sub-cm fillets on METRE-unit files don't trip the mesher.
changed CAD viewer polish session — pan tool, explode, navigation primitives, transitions

Big polish push across the 3D viewers focused on closing day-one usability gaps versus the desktop CAD tools they replace. Every viewer now ships the same nav toolset, the same keyboard shortcuts, and smooth view transitions.

  • Pan tool — chip in every 3D viewer's top toolbar; while active, left-drag pans and right-drag keeps orbit (matches Autodesk and Onshape).
  • Home view — explicit Home button restores the camera to the view that was framed when the file loaded, not a static default. Iso-views and cube-clicks tween for 300 ms instead of hard-snapping.
  • Bookmarks menu — five saveable named camera views with save / restore / rename / clear, plus quick jumps to the seven standard cube views. The storage hook already existed; every viewer now has a UI for it.
  • Tree search — tree-driven panels (assembly tree, 3MF parts, OBJ groups, glTF nodes) get a name-filter input above the list when there are more than five nodes.
  • STEP explode — the explode slider already worked for 3MF; now the STEP viewer has the same chip plus an E shortcut.
  • Per-snap-type glyphs — measurement snap markers now report whether the snap landed on a vertex, an edge midpoint, or a face centroid, instead of always reading "vertex".
  • Polygon picking polish — area mode now shows running area on the cursor coach, a dashed ghost outline of the in-progress polygon, and a pulsing yellow "close-ring" marker over the first vertex when the cursor gets close enough to close the loop.
  • Zoom window — marquee-drag a rectangle on the canvas, release, and the camera tweens to frame that region. Single-use (auto-disables after the zoom), matching Autodesk and Onshape.
  • Display controls — three new runtime presets (background: theme/dark/light/gradient; lighting: studio/outdoor/three-point/soft; render quality: low/auto/high).
  • Face selection + flood-fill — click a face, the viewer flood-fills coplanar triangles into a translucent cyan highlight, then exposes "Fit to selection" in the right-click context menu so you can frame just that face.
  • Right-click context menu — Fit to selection, Home view, Start measure, Clear selection — available on the canvas of every 3D viewer.
  • Reduced-motion respect — when the OS reports prefers-reduced-motion, view transitions snap instead of tweening.
added CAD viewers: walk-through mode, markup overlay, Autodesk-grade measure

The 3D viewers (STEP, STL, 3MF, OBJ, PLY, GLB) picked up a wave of features that close the gap with Autodesk Viewer and Onshape. You can now walk through a 3D model first-person, annotate it on top of the canvas, and measure with four tools instead of two — across every supported format.

  • First-person walk mode — toggle "Walk (WASD)" from the command palette in any 3D viewer. Move with WASD, look around by holding the mouse, descend or rise with Q/E. Walk speed automatically scales with model size so a warehouse and a tiny part both feel natural.
  • Markup overlay everywhere — every 3D viewer now has the rectangle, sticky-note, and arrow annotation tools that previously only existed on the STEP viewer. Annotations are remembered per file.
  • Measure UX rebuild — a new top toolbar (in place of the old right-rail accordion) carries four measurement modes: distance, angle, radius, and area. Distance and area gain an along-surface mode that follows curved geometry instead of cutting in straight lines. Each measurement gets a floating leader-line label on the canvas that tracks the camera as you orbit; click the label to delete the entry.
  • Undo, retry, escape — Cmd/Ctrl+Z undoes the last measurement, Backspace pops the last pick mid-polygon (so a misclick during a 5-point area no longer means restarting), and Esc cancels the in-flight pick buffer without losing committed entries.
  • Section box fix — the dotted "stippling" pattern that appeared on section-box faces at default slider extremes is gone. Clip planes now skip extreme bounds entirely and are nudged slightly off the surface on partial crops.
fixed Theme toggle on every editor page

Editor pages (PDF Editor, Gerber Viewer, Compare PDF) were missing the light/dark toggle in the editor header. You had to leave the editor and go back to a regular page to flip themes. The toggle now lives in the editor header alongside the Support button, persists your choice across navigations, and uses a smooth cross-fade transition.

added PDF Editor — real in-place text editing, finally

The PDF editor's edit-text mode is no longer a polite lie. Until this week, clicking a word and typing a replacement drew a white rectangle over the original glyphs and stamped new ones on top — the same trick most online "PDF editors" use. Saved files preserved the original byte stream underneath, the new text didn't match the original font, and anything wider than the original word overflowed adjacent text. Same problem Adobe charges $20/month to solve.

This week's wave swaps that cover-and-overlay hack out for a real text-edit engine built on pdfium-wasm — the same C++ library that powers Chromium's PDF viewer, compiled to run in your browser. Edits rewrite the underlying content stream. The original font, color, position, and matrix are preserved. Adjacent text shifts to make room. Long edits wrap at the right margin and push following paragraphs down. The 600 KB engine loads lazily on the first edit, never on page load.

What changed for users

  • Click a word, type, save. That's it. The click lands a caret where you pressed — no more drag-rectangle picker that didn't quite know which characters you meant.
  • Font, color, and position survive the edit. Edit "John Doe" → "Jane Smith" on a contract, the rendered text stays in the same Helvetica / Times / Calibri / Roboto / whatever, same color, same baseline. No more black text appearing where the original was navy.
  • Adjacent text on the same line gets out of the way. Type a longer word into the middle of a line and the rest of the line shifts right. Same model as Acrobat Pro on a single-line edit. (Full paragraph reflow — wrap to next line + push following paragraphs down when an edit makes a paragraph taller — landed in the engine but doesn't reliably trigger on real-world PDFs yet. Tracked for v1.3.)
  • CJK, Cyrillic, Greek, smart quotes now work. Old engine threw on any glyph the original font's subset didn't ship. New engine swaps in NotoSans (Latin / Cyrillic / Greek / Vietnamese superset) when the original font can't render your new characters. Sans-serif edits stay sans-serif; serif stays serif; bold stays bold; italic stays italic.
  • Toast warning when reflow clips off the page. Acrobat clips silently. We tell you.

Editor UX polish

  • Click-to-edit replaces drag-to-select in the edit-text mode. Single click on a text run picks that run; caret lands at the click position. Mirrors Acrobat exactly.
  • Subtle dashed cyan underline appears under text you're editing in the preview. The preview can't load the PDF's actual embedded font into the browser without significant glue, so font family + metrics are an approximation — the underline marks the preview as "approximate". The saved file uses the real font.
  • Preview now reads pdfjs's font family hint — a serif source PDF previews in serif, sans-serif in sans-serif, instead of always falling back to Helvetica.
  • Cover-rect cleanup: the white box that hides the original glyphs is now sized to whichever is wider (original glyph extent vs new text), with descender padding so the dots from g/p/y/; don't peek past the edge.

Engineering notes (skip if you don't care)

  • pdfium-wasm (@embedpdf/pdfium, MIT, ~2 MB gz) runs in a dedicated Web Worker, loaded via the project's existing wasm-cache (IndexedDB blob cache with SHA-256 verification). First edit pays the load; subsequent edits in the same session are instant.
  • Same-line shift uses FPDFPageObj_Transform translates on every text object whose pre-mutation top-Y matched the edited line.
  • Wrap detection: when a shifted sibling's new right edge crosses pageWidth − 36 pt (half-inch margin heuristic), it wraps to (leftMargin, baselineY − lineHeight). Line-height is detected from the nearest line below, falling back to fontHeight × 1.2.
  • Font fallback chain: PDF base-14 fonts first (Helvetica / Times / Courier with bold + italic variants), NotoSans for everything else. Bytes lazy-fetched from public/fonts/ only when an edit actually introduces glyphs the original subset can't ship.
  • Bypassed @embedpdf/engines and called the raw FPDF* / PDFiumExt_* symbols directly. The high-level wrapper hides the raw doc pointer behind a private cache, which we need exposed for FPDFText_SetText (per-object op). Direct calls also drop ~2 MB of unused engine surface (annotations, render, redact, image convert).

Known limits (tracked for v1.3)

  • Paragraph reflow doesn't trigger reliably on real-world PDFs yet. The wrap-to-next-line + push-paragraphs-down logic ships and works on synthetic fixtures, but real PDFs hit edge cases in line detection that suppress the trigger. Single-line shift works in practice; multi-line reflow needs a rebuild against a real-PDF corpus.
  • Edit-text font picker still only exposes Helvetica / Times / Courier in the toolbar. The save path embeds full NotoSans bold + italic variants when needed, but the picker doesn't let you choose them at edit time.
  • Bundle hit: pdfium adds ~2 MB gz. Only loaded on the first edit, never on page load — sessions that just view PDFs pay nothing. Acceptable per the editor's role as the flagship tool.
  • Calibri / Roboto / Open Sans fall back to NotoSans (Regular / Bold / Italic / BoldItalic, picked from the original font's weight + italic angle). Visually close for body copy, not pixel-perfect for headings.
  • Mid-word break on overflow: only whole sibling text objects wrap. A single text object that spans the right margin still overflows. Workaround: edit it in two pieces.
  • No cross-page overflow: content pushed past the page bottom clips. Toast warns; user fixes manually. Acrobat clips silently in the same scenario.

Files don't leave the device. The editor still runs entirely in-browser; pdfium adds no network calls except the one-time WASM + font fetches (same-origin, cached forever after).

changed Editor splash and Gerber Viewer progress polished

A small polish pass on the PDF Editor and Gerber Viewer loading flow:

  • The Gerber Viewer progress bar now reflects real parse progress instead of sitting at the slice midpoint and jumping at the end. The in-card splash and the canvas overlay also now use the same progress copy, so the wording can't drift between the two surfaces.
  • Drag-and-drop highlight on the PDF Editor splash no longer flickers at 60Hz while the cursor hovers — cleaner visual feedback when staging a file to open.
added PDF Editor v1.1 — Watermark, Bates, Markdown, true redaction & more

A second wave landed on the in-browser PDF editor — eight new doc-scope tools, two new export formats, true legal-grade redaction, an Adobe-style Move tool, and a heavy interaction-polish round on top of the v1 ship.

New tools

  • Watermark mode: text or image stamp with live preview on the active page. Position grid, opacity, rotation, tile pattern, font + size + color picker. Apply commits and bakes into every page on save.
  • Bates numbering: legal-discovery sequence stamps. Configurable prefix / suffix / start number / digit count / corner / margin / font + size + color.
  • Header & Footer: per-page tokens ({page}, {pages}, {date}), independent left / center / right alignment for header and footer, optional odd / even split for double-sided print docs.
  • Crop pages: numeric-precision crop with mm / inch / pt unit picker, link-all-sides toggle, dashed-cyan preview overlay so users see exactly what stays before saving.
  • Bookmarks editor: read existing /Outlines via pdfjs, write back via pdf-lib's low-level dict + array refs. Add, rename, indent, delete, point at any page.
  • Metadata editor: title, author, subject, keywords, creator, producer, creation + modification dates. Pre-fills with current values; Apply rewrites the /Info dict.

New export formats

  • PDF → Excel (.xlsx): detects tables on every page via the existing pdf-table-detect heuristic, writes one sheet per detected table. Empty fallback so the user always gets a file.
  • PDF → Markdown (.md): heading detection by font-size delta, list detection by bullet glyph + indent, tables reuse the same engine as Excel and render as pipe tables. Built for AI / RAG / docs-as-code workflows that Adobe doesn't ship at all.

Legal-grade redaction

  • True byte-level redact: every page that has a redact-rect op is rasterised at 200 DPI on save and the page's content stream is replaced with a single full-page image draw. The original text is gone in the saved bytes — not just a black overlay on top. Pages without redaction stay vector.
  • PII auto-detect: regex catalog with validators (Luhn for credit cards, mod-97 for IBAN, plus SSN / email / phone). Click Auto-detect in Redact mode, review matches grouped by kind with checkboxes, apply. Coords project through vp.convertToViewportPoint so the redact rect lines up on cropped or rotated pages.

Editor UX

  • Move tool (Adobe Hand): toolbar mode for click-and-drag panning with a dedicated grab cursor. Space-hold + middle-mouse remain as momentary overrides. Pan now suppresses the page-jumper dispatch so a small drag doesn't yank multiple pages.
  • Zoom range bumped to 8× so blueprints and floor plans can be inspected pixel-by-pixel. Page edges are now reachable via horizontal scroll at high zoom (align-items: safe center flips the stage to start-align when content is wider than the viewport).
  • Edit-text drag-select: drag a rect over text to select only the characters under the rect (Acrobat / Sejda pattern). Tap fallback still picks a whole word for quick edits.
  • Bigger BB corner handles: 12 px squares with 14 px hit tolerance, easier to grab on touchpads.
  • Right pane redesign: single-active accordion with Bates / Header & Footer / Crop / Bookmarks / Metadata / File info sections. Open section claims the remaining height and scrolls internally so long forms never get clipped. History pinned at the bottom at fixed height.
  • Status bar tip: Ctrl+scroll = zoom · Move tool / Space = drag always visible.
  • More shapes (annotate): ellipse and line tools added next to rectangle / freehand / arrow.

Search + edit-text precision

  • Search highlight projects through vp.convertToViewportPoint so coords align on cropped, rotated, or non-zero-MediaBox pages. Centers on each next / prev match instead of stopping at page top. New scrollbar marker column shows every match in the doc — click any tick to jump.
  • Underline / strike / highlight snap is per-character now, not per-text-item — dragging over a single word inside a long line snaps to the word, not the line.

Loft Tools site

  • Updated changelog + roadmap pages with categorised entries and Google-Keep-style task cards. Click a roadmap card to expand its full task list.

The editor lives at /tools/pdf-tools/pdf-editor. Files never leave your device.

added PDF Editor — Adobe-grade editing in your browser

Loft's first epic app. Full PDF editor with eight modes wired end-to-end. Files never leave your device — every byte of the edit, the OCR, the redaction runs locally.

  • Edit existing text: click a word on any page, replacement input opens below the original with the source highlighted in cyan, type the new text, Enter commits. White cover + new glyphs land at save time.
  • Add text: click anywhere on a page to drop a text box. Adobe-style font-size stepper (−/+/editable readout) and a Sans / Serif / Mono picker that maps to pdf-lib's StandardFonts (zero shipped font bytes).
  • Sign: capture once via type or upload, click anywhere on any page to stamp. Each placement auto-selects so you can immediately drag-position or resize.
  • Annotate: highlight, underline, strikethrough, rectangle, freehand, arrow. Black / red / blue defaults, per-tool color swatches, stroke width control.
  • Select: click any annotation, drag to move, drag a corner to resize, Delete to remove. Photoshop-style History timeline panel on the right lets you jump to any prior state.
  • Redact: drag-to-redact draws a black opaque box; save bakes a white-then-black cover into the byte stream (Adobe-canonical look).
  • Fill forms: AcroForm fields highlighted in Firefox-yellow auto-fill style. Click + type, save flattens values into the document. Empty-state banner when the PDF has no fillable fields.
  • OCR: one-click language picker → engine runs locally (Tesseract or PP-OCRv5 via ONNX Runtime Web) → result replaces the active doc as a searchable PDF with an invisible text layer.
  • Export: PNG, JPG, or TXT. Single page direct-download, multi-page → ZIP via JSZip.
  • Continuous scroll: virtualized stack with a ±1 render buffer plus IntersectionObserver, page dims pre-resolved at doc-open so the page jumper lands accurately on long / mixed-size docs.
  • Find (⌘F): whole-document text search, prev / next cycles individual matches, yellow rect highlights wrap each matched substring (not the whole line).
  • Save: File System Access API on Chromium → in-place overwrite after first prompt. Safari / Firefox fall back to download.
  • Undo / redo: every edit becomes an event-sourced op, materialised into the rendered state at save time. Drag-move and delete-annotation flow through the same undo stack.

The editor lives at /tools/pdf-tools/pdf-editor. It replaces nothing — the standalone PDF tools (compress, merge, split, sign-pdf, redact-pdf, annotate-pdf, ocr-pdf, etc.) all stay shipped as the fast-path for single-action use cases.

added PDF Editor v1.1 — Watermark, Bates, true redaction, more formats

Six new document-scope tools, two new export formats, legal-grade redaction, and an Adobe-style Move tool landed on the PDF editor the same week as v1.

New tools

  • Watermark mode: text or image stamp with live preview on the active page. Position grid, opacity, rotation, tile pattern, font / size / colour. Bakes into every page on save.
  • Bates numbering: legal-discovery sequence stamps with configurable prefix, suffix, start number, digit count, corner, margin, font, size, colour.
  • Header & Footer: per-page {page}, {pages}, {date} tokens; independent left / center / right alignment; optional odd / even split for double-sided print.
  • Crop pages: numeric-precision crop with mm / inch / pt picker, link-all-sides toggle, dashed-cyan preview of what stays.
  • Bookmarks editor: read existing outlines, add, rename, indent, delete, point at any page.
  • Metadata editor: title, author, subject, keywords, creator, producer, dates — pre-filled with current values.

New export formats

  • PDF → Excel (.xlsx): detects tables per page, writes one sheet per table.
  • PDF → Markdown (.md): heading detection by font-size delta, list and table detection; built for AI / RAG / docs-as-code workflows that Adobe doesn't ship at all.

Legal-grade redaction

  • True byte-level redact: every page with a redact rect is rasterised at 200 DPI on save and its content stream is replaced. The original text is gone from the saved bytes.
  • PII auto-detect: regex catalogue with validators (Luhn for credit cards, mod-97 for IBAN, plus SSN / email / phone). Scan the doc, review matches grouped by kind, apply.

Editor UX

  • Move tool (Adobe Hand) — click-and-drag panning, dedicated grab cursor, Space-hold and middle-mouse as momentary overrides.
  • Zoom bumped to 8× for blueprints and floor plans; page edges are now reachable at high zoom.
  • Edit-text drag-select: drag a rect to select only the characters under it (Acrobat pattern); tap still picks a whole word.
  • Bigger BB corner handles (12 px squares, 14 px hit tolerance) — easier to grab on touchpads.
  • Right pane redesign: single-active accordion plus pinned History timeline at the bottom.
  • Search precision: highlights project correctly through cropped and rotated pages; underline / strike / highlight snap is per-character, not per-line.
PDF tools 13
added Compare PDF — AEC / Blueprint mode + hang-proof compare

Compare PDF now has a document-type selector again, with a dedicated AEC / Blueprint mode tuned for drawings, schematics, and technical sheets — plus a layer of guards so a heavy file can never freeze the comparison. Files still never leave your device.

What's new

  • Document-type selector: choose Document (contracts, statements, reports — text + pixel), AEC / Blueprint (drawings, schematics — pixel-first with a text overlay), or Image-Scan (pure pixel). The picker shows on the drop screen and is remembered.
  • AEC / Blueprint mode — a hybrid pass built for drawings: a word-level text pass handles dimensions, callouts, and title-block edits while a masked pixel pass catches geometry (lines, circles, symbols). A one-character title revision no longer flags the whole row, and a relocated symbol is recognized as Moved rather than delete-plus-insert.
  • Change locations — every change in AEC mode is tagged with its sheet region (title block, top-left, center…) and its X/Y position, so you can jump straight to it on a large sheet.

Improvements

  • In-place revisions read as edits: a dimension or revision mark that changed in place (Ø8 → Ø10, rev A → B) now shows as one Modified entry with the exact glyphs that changed — not a separate Removed + Added pair.
  • Fonts panel now lists the fonts in each file; Form Fields shows a clear empty state when a PDF has none.
  • Per-document rulers — the on-canvas ruler is now independent per panel (px / in / mm), instead of one ruler spanning both documents.
  • Export the marked-up comparison as a PDF from the toolbar.
  • Scroll to zoom directly (no modifier key); single-page comparisons hide the page-paging controls.

Bug fixes

  • No more frozen "Comparing…": every PDF-render and text-extraction step now has a bounded timeout. If the browser is under heavy load or a file is pathological, the compare aborts with a clear "Compare timed out — try again, or use a smaller / flattened PDF" message and a fresh retry, instead of hanging forever. A page that times out is flagged as incomplete rather than silently shown as "no changes."
  • Fixed the status-bar hint that still said "Ctrl + scroll to zoom" after the gesture became plain scroll.
changed Compare PDF: better noise handling on engineering drawings

Vector engineering drawings — circuit schematics, blueprints, mechanical diagrams — now produce dramatically cleaner pixel diffs.

Live testing on a pair of electrical-panel drawings (Eaton JDC3 vs JDC4 circuit breakers) surfaced three noise sources unique to vector PDFs:

  • Sub-pixel jitter: identical line drawings rendered with tiny positioning differences between the two PDFs, causing every edge to flag as a false change.
  • Whole-drawing yellow blanket: when a drawing genuinely differs (a 3-pole vs 4-pole layout), the diff was merging everything into one giant highlight that hid the actual structural change.
  • Drawing displacement: A and B canvases drawn at slightly different positions made line edges miss each other entirely.

The new pipeline runs RANSAC affine alignment before the pixel comparison. It uses identity-matched text anchors (dimension callouts, part numbers, title-block labels) as registration points to compute a transform that maps the B canvas onto A's frame. Sub-pixel residue is then mopped up with a small pre-blur, and oversize false-positive blanket regions are dropped automatically.

Result: pinpoint structural diffs survive, render jitter is gone, and the text-tier already explains "the whole drawing differs" via dimension and title-text changes.

fixed Compare PDF catches signatures and light pen strokes again

Compare PDF now reliably flags hand-signed signatures, initials, and other light pen strokes that recent noise-reduction work had accidentally hidden.

A live test on a Taipei medical certificate pair (blank vs signed) revealed that a 2-pixel pre-blur tuned for vector engineering drawings was wiping out the subtle ink contrast of pen strokes before the comparison engine ever saw them. The detector was working — there just wasn't anything left to detect.

The fix introduces an adaptive blur that looks at the alignment between the two PDFs before deciding how much smoothing to apply:

  • Near-identical pages (same template, just filled in differently — signatures, form fields, handwritten edits) skip blur entirely. Light ink contrast is preserved and signatures show up clearly in both the visual diff and the right-side change list.
  • Pages with real content shift (engineering drawings where shapes have moved, like a 3-pole vs 4-pole circuit breaker) still get the 2-pixel blur to cancel sub-pixel render jitter.
  • Image-only PDFs with no text anchors keep blur on as a defensive jitter mask.

Detection thresholds were also tuned back down so that thin pen strokes (typically 1-2 pixels wide) no longer fall under the minimum region size. Engineering-drawing precision is unchanged.

changed Compare PDF v3.3 — RANSAC affine alignment for pixel residual

Live QA on Eaton JDC3 vs JDC4 circuit-breaker drawings exposed pixel-residual false positives on regions where the two PDFs rendered the same vector content at slightly different positions. Five-PR iterative fix landed in one session.

Bug Q + R bundle (PR #502, #503):

  • Pre-blur — 2-px gaussian on both canvases before smartCompare. Sub-pixel edge jitter softens below CONTENT_CHANGE_THRESHOLD; structural diffs survive.
  • Skip morphClose — dense edge runs no longer merge into mega-CCL components that flood as whole-drawing yellow blankets.
  • Drop oversize regions — pixel highlights whose bbox covers > 15% of canvas area get filtered. Text-tier already explains "whole drawing differs" via dimension + title changes.
  • RANSAC affine alignment via lib/align.ts — document-mode compareOne now emits anchorPairs (rows where normalized text matches identically between A and B). ComparePdf feeds those to the existing RANSAC TSR primitive, fits a translation + scale + rotation transform, renders B canvas through the affine into A's frame before smartCompare. Render jitter cancels at the source.

Iterative refinement:

  • PR #504 (reverted by #505) — tried "tighter layering": blur + morph only on unaligned fallback path, arguing alignment makes them redundant. QA showed counts INCREASED (128 → 133) because RANSAC INLIER_THRESHOLD_PTS = 5 pt ≈ 7 px at 100 DPI — sub-pixel jitter < 1 px still survives the inlier filter. Reverted. Alignment + jitter masking are complementary, not exclusive.

Final state: alignment cancels gross translation, pre-blur + morphClose mop up sub-pixel residue, oversize-drop prevents structurally-different-content blanket. Belt-and-suspenders is the correct architecture when the upstream primitive is approximate.

15 PRs in three days got Compare PDF from "v3 substrate works" to "best-in-class browser PDF compare." Algorithm now handles bank statements, tabular summaries, engineering drawings, scanned blueprints, signed certificates, and reflowed contracts — each with their own tier in the pipeline.

changed Compare PDF v3.2 — visual + algorithmic polish marathon

10-PR polish marathon driven by live QA on real bank statements (Chase Jan/Feb), engineering blueprints (Meridian SB-2024), and medical certificates. Each PR fixed a specific bug class surfaced via screenshot + multi-agent dialectic.

Visual fixes

  • MODIFY dominates visually (PR #487) — per-side MODIFY emission so yellow lands at each panel's actual row position, paragraph MOVE detected with relaxed jitter tolerance, fuzzy cross-page MODIFY promote for drifted paragraphs, hyphen unicode coverage (U+00AD, U+2010, U+2011, U+2013).
  • Word-level yellow (PR #488, #501) — yellow paints ONLY on the chars that actually differ, not the whole row. Adobe-style precision. B-side parent rect skip prevents redundant whole-row band on B panel.
  • Filename labels (PR #499) — Original / Modified panel headers show source filenames. Lost from v2 scrap, restored.
  • MODIFY visual dominance — translucent yellow fill α=0.15 base + solid 1.5px yellow stroke, no more dashed-outline-lost-in-fills problem.

Count + status alignment

  • Pixel-fallback chip count (PR #489) — image-only PDFs (blueprints, signed scans) now show region counts in chips instead of zeros. Status bar reads N changes not raw pixel delta.
  • Orphan page counts (PR #497) — 13-pg A vs 14-pg B compare reflects the orphan page in chip totals.

Algorithmic precision

  • Tighter post-promotion thresholds (PR #491) — PROMOTE_SIMILARITY 0.4 → 0.65, JACCARD_FLOOR 0.15 → 0.30, length-ratio 0.4 → 0.5, new TOKEN_JACCARD_FLOOR 0.35 on alpha-only words. Stops unrelated bank-statement transactions ("12/13 CHARGEPOINT" vs "01/13 AMAZON") from pairing as MODIFY just because they share format tokens (CA, INC, /13).
  • Pixel classifier thresholds (PR #492) — PIXELMATCH_THRESHOLD 0.1 → 0.2, CONTENT_CHANGE_THRESHOLD 60 → 80, MIN_REGION_AREA 8 → 24, TONE_DELTA 40 → 55. Stops blueprint title-block yellow flood on sub-pixel render jitter.
  • Table-cell positional MODIFY (PR #494, #497) — Tier 0.5 wires the dead detect-tables.ts scaffold. Aligned tables with ≥30% identical cells get cell-by-cell positional pairing. Bank-statement Account Summary "Available Credit $8,169 → $10,264" now shows yellow on dollar cell only, not whole row. Cell bbox clipped to column midpoint geometry.
  • Histogram longest-run anchor pairing (PR #495) — picks anchor pair whose surrounding equality run is longest, per Pearce's HistogramDiff.java::tryLongestCommonSequence. Fixes cascading mis-anchor in repeated-text legal docs.
  • Additive pixel residual (PR #501) — pixel-engine smartCompare runs alongside text-tier (not exclusive). Filters region overlap > 50% with existing text-tier highlights so identical text labels don't double-count. Engineering drawings + signed PDFs now surface both layers.

Internal docs added: .kb/work/compare-pdf-algorithm-truth.md (ground-truth pipeline tier-by-tier with bug catalogue A–N), .kb/work/compare-pdf-known-limits.md (edge cases the algorithm intentionally doesn't handle).

10 PRs shipped in one day. Each verified against live QA screenshots before merging.

changed Compare PDF v3.1 — eight accuracy and performance wins

Phase A of the v3.1 accuracy push landed eight incremental improvements to how Compare PDF aligns and classifies text changes. Bank statements, contracts, and reflowed documents all produce cleaner, more meaningful diffs.

  • Hyphenation merge — text reflowed at a different column width that splits words at hyphens ("Mini-" + "mum balance" vs "Minimum balance") used to produce three false changes per split. Geometric heuristics now stitch the hyphen back together without needing a dictionary, and the regex covers hyphen-minus, soft hyphen, U+2010, U+2011, and U+2013.
  • Single-pass text cache — three internal callers were each re-parsing every page's text stream. They now share a memoised cache, removing ~30–50% of wall time on 50-page docs.
  • Histogram diff anchoring — replaced the older "count==1 unique word" anchor strategy with a recursive lowest-count-wins procedure (the same one git uses). Documents with repeated phrases ("WHEREAS" × 50 in a lease, "Section 3.2" × 120 in a contract) now anchor on the rare tokens inside each sub-range instead of discarding repeated text outright.
  • Line-mode pre-pass — runs a line-level encoding pass over unmatched residue before falling to per-row fuzzy matching, catching block-moves and simple insertions earlier in the pipeline.
  • Cross-page move detection — paragraphs that move from page X to page Y used to emit as a wholesale red REMOVE on page X plus a wholesale green ADD on page Y. Identical-text moves now promote to a linked MOVE pair.
  • Heavy-redline performance — the tier-3 cross-product cap moved from 5,000 to 90,000 operations per page, so more borderline pairs get the similarity pass and promote to MODIFY instead of falling to wholesale add/remove. Real-fixture impact: the IRS W-9 fixture goes from 659 to 506 reported changes (-23% noise).
  • Table detection scaffold — a lightweight geometric table detector (≥3 consecutive rows with same column structure) ships now and gets wired into the diff pipeline later in the same release.
changed Compare PDF v3.1 — eight algorithmic accuracy + perf wins

Phase A landed eight algorithmic improvements in a single coordinated PR (PR #481) covering accuracy + performance. Distilled from a multi-agent algorithm debate vs Heckel / Pearce / Tichy / Cormode-Muthukrishnan + Liang / Breuel research papers.

  • Histogram-diff anchoring (Pearce / git xhistogram) — replaces Heckel's count == 1 predicate with lowest-count-wins recursion. Legal / financial docs with repeated phrases ("WHEREAS" × 50, "Section 3.2" × 120) now anchor structurally instead of dropping into fuzzy fallback.
  • Hyphenation merge — geometric heuristic (line ends -, next row lowercase, indent within 30pt, dy ≤ 2 line-heights). Catches reflowed body text without dictionary lookups; language-agnostic.
  • dmp linesToChars line-mode pre-pass — Myers-on-row-tokens between tier-1 anchoring and tier-2 fuzzy. Catches block moves + simple insertions among unmatched residue.
  • Tier-1 expansions — Heckel neighbor extension + duplicate-bucket nearest-y fallback. Runs of identical-text rows (page numbers, table cells) now lock as anchored.
  • Paragraph MOVE detection — consecutive anchors with consistent dy collapse into one MOVE record per paragraph instead of N per-row records.
  • Cross-page MOVE promotion — wholesale REMOVE on page X + wholesale ADD on page Y with identical text get paired as MOVE via FNV-1a hash. Adobe-style cross-page reflow detection.
  • Row-level MODIFY with sub-paint metadata — one MODIFY record per modified row in the chip count, char-level parts[] for paint detail.
  • Post-promotion modify pass — 5-stage industry-standard add/remove → MODIFY promotion via Jaccard + dmp similarity. Catches "Previous Balance $X vs $Y" cases that drift past the tier-2 fuzzy Y window.

Plus perf wins: WeakMap text-cache dedup (3× pdfjs read collapse), bounded post-promotion cross-product (~90k ops cap), idle-callback page scheduling.

Similarity calculation switched from changes / canvas_pixels (always rounded to 99%) to 1 - (totalChanges / totalRows) — status bar finally reads meaningful numbers.

changed Compare PDF v3 — lean rebuild on a strategy substrate

Full algorithmic rewrite. v1's monolithic smartCompare pipeline split into a strategy substrate (PR #401, #403, #413). One driver, three mode strategies (document / drawing / image), shared primitives extracted into lib/. ~1,500 LOC of duplication retired.

  • Strategy pattern: per-mode pipelines instead of branching inside one big function. documentStrategy.compareOne handles paragraphs / tables, drawingStrategy handles vector geometry, imageStrategy handles scans.
  • Shared primitives: lib/align.ts (RANSAC TSR fit), lib/pixel-engine.ts (smartCompare), lib/header-footer.ts (page furniture noise filter), extract/text-cache.ts (WeakMap-memoised pdfjs reads).
  • Real-file validation: 7-fixture regression harness via scripts/debug-compare-v3.mjs — Chase statements, Meridian blueprints, Eaton drawings, medical certs, lease agreements, AcroForm cases.
  • Right-pane ChangeList: scrollable per-page list of every Change record with kind icons, before/after preview, confidence percentage, click-to-pulse navigation.
  • Filter chips: Add / Remove / Modify / Move toggles with live per-kind counts.
  • History panel ported from PDF Editor — recent compares persisted in IndexedDB, click-to-restore without re-uploading.
  • Engine toggle via ?engine=v3 + localStorage gate for staged rollout. v1 path retired alongside the engine-toggle UI a session later.

All comparison logic still runs 100% in-browser. Files never upload.

changed Compare PDF v3 — lean rebuild on a faster, cache-aware substrate

Compare PDF now runs on a leaner v3 engine with cache-aware result reuse and tighter validation against real files.

  • Results are cached per file pair: the engine hashes both PDFs plus the comparison options and stores the result in an IndexedDB cache (bounded LRU, 50 entries). Reopening the same comparison is near-instant; tweaking an option does the minimum extra work needed.
  • Build-aware invalidation: when we ship a comparison-engine fix, every existing cached result is invalidated automatically so you never reproduce a stale bug.
  • Real-file validation: the rebuild was validated against actual user files (not just synthetic test cases) so the highlight rules — red removed, green added, yellow modified, blue moved — match what reviewers expect.

A small internal cleanup also dropped some dead code paths and extracted a duplicate-detection helper so the side-B move logic is easier to reason about.

changed Acrobat-grade text editing in PDF Editor — real glyph replacement, not stamp-on-top

PDF Editor's edit-text mode now rewrites the actual content stream instead of stacking a white cover and new glyphs on top. This is the headline feature of v1.2 and lands across five phases of work.

How it now works:

  • Click to edit. Single-click on a word picks that text run and drops the caret at the clicked character position — Acrobat-style, not Word-style drag selection. The drag-bbox picker has been removed entirely.
  • Real content-stream rewrite. A new pdfium-wasm engine handles the actual glyph replacement on save. Original font, position, fill color, and render mode are preserved.
  • Same-line shift. When edited text grows or shrinks in width, adjacent text on the same line translates by the width delta so it doesn't overlap or leave a gap.
  • Line wrap and push-down. When growth pushes siblings past the right margin, they wrap to a new line and every text object below the affected line shifts down by one line-height to make room.
  • Font fallback chain. When the original embedded font is missing glyphs your edit needs (subset fonts only embed glyphs used in the original text), the editor falls back to a PDF base-14 family or embeds NotoSans Regular/Bold/Italic/BoldItalic for non-base-14 families like Calibri or Roboto.
  • Preview accuracy. The on-canvas preview now uses the font family that pdfjs reports for the clicked text, so serif PDFs preview in serif and sans-serif in sans-serif. A subtle dashed cyan underline beneath edited text signals that the preview is approximate — the saved file uses the document's real font.
  • Clip warning. If reflow pushes content past the page bottom and the saved file will clip, a toast warns you so you can undo and shorten the edit.

Smallest-text-object matching also handles the doubled-text scenario where Word and Google Docs sometimes emit nested or stacked runs.

changed Compare PDF gets a full editor shell with rail, inspector, and exclusion zones

Compare PDF was rebuilt around the same full-viewport editor chrome that powers PDF Editor. The bespoke comparison UI was split into reusable pieces and gained a stack of features that move it beyond a simple pixel-diff viewer.

What's new on the page:

  • Dual drop slots for Original and Modified files, with relaxed file-type detection so PDFs that browsers report with empty MIME types still load.
  • Page rail with stacked A/B thumbnails per row, each tagged with a diff badge — identical, N px changed, only-A, or only-B. Thumbnails lazy-render via IntersectionObserver, so 500-page documents no longer encode a thousand PNGs on first mount.
  • Right-side inspector with single-active accordion panels for Metadata, Bookmarks, Form Fields, and Fonts. Each panel shows A vs B side-by-side with markers on differences. Panels stay mounted after first open so reopening the Fonts panel doesn't re-walk every page.
  • Drag-rect exclusion zones to mask false-positive highlights — useful for ignoring footers, timestamps, or page numbers that change on every page.
  • Translucent ruler (px / in / mm, R to toggle, unit choice persisted).
  • Text Diff modal now wraps the polished split diff viewer with line numbers, word-level spans, collapsible unchanged hunks, and prev/next change navigation. T opens it.
  • Keyboard shortcuts: ⌘O to open, F7 / Shift-F7 to jump to next/prev change, R for the ruler, page nav with arrow keys, ⌘=/⌘-/⌘0 for zoom.
  • Status bar caps similarity at 99% when any diff exists so "100% similar · 3,355 px differ" can't both render at once.
changed Compare PDF — editor port + featured showcase

Compare PDF moved off the standalone v1 shell into the shared editor template (PR #320). Same comparison engine, new chrome — header, toolbar, side rail, status bar all unified with the rest of the PDF tool family.

  • Editor chrome: same toolbar, right-pane structure, and status bar as PDF Editor — consistent muscle memory across the tool family
  • Featured-tool landing page: dedicated /featured/compare-pdf showcase with hero, demo, and value props (PR #320, #337)
  • Homepage placement: surfaced in the featured rotation
  • Bug-audit pass: thermal-relief geometry fixes + compare-pdf algorithm review (PR #336)

The legacy v1 standalone shell stayed shipped during the port; v3 substrate landed two weeks later.

added Compare PDF — visual + text comparison

Full PDF comparison tool with three modes: visual (side-by-side), overlay (slider), and text diff.

  • Visual comparison: grayscale conversion, pixelmatch pixel diffing, brightness-difference filter, morphological closing, connected-component labeling — catches filled form fields while ignoring rendering noise
  • dHash fast-reject: identical pages detected in microseconds via perceptual hashing
  • Text extraction: reads both content stream (static text) and annotation layer (form field values, Fill & Sign text)
  • Overlay mode: smooth 60fps slider via CSS custom properties (no React re-render during drag)
  • Interaction: focal-point zoom (Ctrl+Wheel tracks mouse position), drag-to-pan, synchronized scroll, fullscreen toggle
  • Smart page handling: different page counts show "Page only in Original/Modified" instead of false "identical"

All processing runs 100% in-browser — your PDFs never leave your device.

Image tools 3
changed ID Photo Maker: full rebuild with 156-country catalogue

The ID Photo Maker got a ground-up rewrite. It now supports 156 countries with ICAO baseline specs plus 10 government-specific overrides (US, UK, Canada, Australia, India, etc.) so each document type matches its real legal requirement for size, head proportion, and background.

Key changes:

  • New combobox country/document picker — type to filter, no more scrolling through a long list.
  • Background removal moved into a dedicated Web Worker so the UI stays responsive while the AI model runs. Two model choices: a fast 5 MB U-2-Netp for the standard tier and a 115 MB BiRefNet-lite premium model with sharper edges.
  • Jurisdictional AI compliance — US, UK, and Canadian passport flows now skip AI background replacement by default with a clear opt-in warning, because those governments forbid digitally altered backgrounds.
  • Mobile native camera — phones now launch the OS camera app for the best sensor resolution instead of an in-browser camera widget.
  • Multi-size print sheets — drop your photo onto 4×6 in, 9×13 cm, 10×15 cm, or 13×18 cm paper layouts ready to print at any drugstore kiosk.
  • New crop tool with frame-on-photo positioning model, free pan, rotation, and native touch gestures — replaces the prior cropper that had occasional pinch-zoom issues.
  • Passport Photo Maker and Baby Passport Photo also restored as dedicated tools alongside the general ID flow.
changed Privacy: Image to Favicon tries your domain first

The "extract from URL" feature in Image to Favicon used to immediately send every typed domain to Google's favicon service. It now tries https://{your-domain}/favicon.ico directly first, and only falls back to Google if the direct fetch fails (no CORS, missing icon, etc.). An on-screen note tells you upfront what the policy is, and a secondary status line confirms when the Google fallback was actually used.

removed Two image tools moved out of the active catalogue

Two tools were soft-archived as part of the pre-launch catalogue cleanup:

  • Instagram Grid Splitter
  • Watermark Image

Their pages still resolve for anyone who has a saved link, but they no longer appear in navigation, category pages, or search.

Video tools 4
removed Video Format Converter retired after stability issues

Video Format Converter has been pulled. Cross-codec conversions inside the browser's FFmpeg sandbox kept producing intermittent hangs at 30% on MOV, MKV, and AVI inputs, and the fixes were turning into a long tail of edge cases.

The two surviving video tools remain solid:

  • Video Compressor — single-codec re-encode path, verified working.
  • Remove Audio from Video — stream-copy path, no transcoding involved.

Old converter URLs redirect to the video-tools category page so you can see what's still available.

fixed Video tools fixed silent hang on some hardened browsers

Video tools no longer hang silently in Brave with aggressive shields or some Chrome configurations. The bug: the WASM worker that powers video processing couldn't initialize, but the failure was completely silent — the UI sat at "Compressing… 0%" forever.

Two layers of defense now:

  • 60-second load timeout with an actionable error message that explains the likely cause and suggests Chrome or Edge if you're on a hardened browser. The message tells Brave users specifically to lower Shields for the site.
  • Underlying root cause fixed: the Vite-built worker chunks now serve with the right cross-origin embedder policy so the browser actually allows them to start. Before the fix, Chrome's failure mode was completely silent — no JS exception, just a stuck promise.
fixed Video tools: progress bar now actually moves during encode

Video tools now show real-time encoding progress instead of freezing at 30%. The encoder was always doing the work — the bar just wasn't updating because nothing was reading FFmpeg's progress output.

Bundled fixes for video processing:

  • Live progress during encode: the bar now reads FFmpeg's per-frame time output and animates smoothly from 30% to 85% (or 80% on the stream-copy path) instead of jumping at the end.
  • Format-aware duration detection: AVI, MKV, and some MOV files that the browser can't read directly now still get a proper progress percentage because FFmpeg's own demuxer reports the duration.
  • Fallback for unknown duration: if duration genuinely can't be determined, the bar steps to mid-range on first activity instead of staying stuck.
  • Full-width progress bar: the bar in the processing card no longer caps at 420px wide, fixing the half-width "is this broken?" look.
  • Clean state per run: each tool invocation now uses a fresh FFmpeg instance, eliminating the bug where running the converter after the compressor would hang at frame 1.
changed Media tools sharpened: 10 retired, Metronome added, Musicians audience

After a brutal-honest competitive review against iOS Photos, Google Photos, CapCut, native screen recorders, ElevenLabs, ezgif, and Loom, the media catalogue was trimmed and repositioned. The remaining video and audio tools now lean into the moats they actually have — laptop-only, no-install, no-account — instead of competing with apps people already have on their phones.

  • Retired (10 tools) — video-trimmer, video-rotate, video-speed-changer, video-merge, screen-recorder, voice-recorder, text-to-speech, gif-maker, webcam-recorder, and bpm-analyzer. Each lost to a free incumbent (iOS Control Center, Android 11+, macOS Cmd+Shift+5, ezgif, Loom free, Mixed In Key) with no realistic polish path to dethrone.
  • Repositioned — video-compressor and video-format-converter drop their generic SEO and lean into the specific painful jobs: compress on a laptop without installing CapCut or Handbrake, get a Discord/Slack/email-friendly file size, convert the MOV / MKV / AVI formats that phone editors treat as edge cases. New URL aliases for common conversions (mov-to-mp4, mkv-to-mp4, avi-to-mp4).
  • New tool: Metronome — a Web Audio metronome with tap-tempo, accents, subdivisions, visual beat indicator, BPM 30-300, and time signatures from 2/4 to 7/8. Lookahead-scheduled for ~5 ms accuracy. Lives at /tools/media-tools/metronome.
  • New audience: Musicians/for/musicians curates audio-pitch-changer, tone-generator, metronome, audio-trimmer, and audio-speed-changer for practice and learning workflows.
Developer tools 20
changed DXF viewer now renders real drawings — text, dimensions, hatches, paper layouts

The DXF viewer used to draw only outlines — now it renders the whole drawing. Open an AutoCAD .dxf and you'll see the text, dimensions, filled hatches, smooth curves, and even the laid-out paper sheet — all locally in your browser, no upload, no Autodesk account, no installer. Before this, a real architectural or mechanical drawing came through as a skeleton of lines with the labels, dimensions, and fills silently missing.

What's new

  • Text & dimensions: titles, room labels, callouts, and dimension lines now render — the annotations that make a drawing readable instead of a wireframe.
  • Hatch fills: walls, floors, and section poché show as filled regions, so floor plans and sections look like floor plans and sections.
  • Paper layouts: a Model / Paper toggle appears when a file has both. Paper view renders the title block and the scaled drawing views (viewports) inside it — the sheet the way it was laid out for printing.
  • SVG export: save the drawing as a scalable vector file, alongside the existing PNG and PDF export.

Improvements

  • Smooth curves: splines now render as true curves instead of jagged straight-line approximations.
  • Every layer listed: the layer panel shows all layers declared in the file (matching AutoCAD), not just the ones that happened to carry visible geometry.
  • Nothing dropped silently: if the viewer can't render a particular entity, it now tells you with a notice — so you're never misled into thinking a drawing loaded fully when part of it didn't.

Bug fixes

  • Fixed drag-to-pan, which could select the drawing or flash the file drop zone instead of panning.
  • Fixed text that could render upside-down.

As always: the file never leaves your device.

added Log Query Workbench — SQL on your logs, locally

Drop a CSV, JSON, NDJSON, or Parquet log and query it with real SQL — joins, window functions, percentiles, the lot — entirely in your browser. The engine is DuckDB compiled to WebAssembly, so your logs and queries never leave your device. It's the "let me slice this file right now without uploading it to a SaaS" tool.

What's new

  • Log Query Workbench: a full SQL workbench for log and tabular data. Query files locally, with results in a virtual-scrolled grid built for large result sets.
  • One-click analyses: it detects log columns (ip, status, latency, path, timestamp) and generates the SQL for top talkers, status-class-over-time, 4xx/5xx error spikes, slowest endpoints (p95/p99), request volume by hour, and an auth-failure timeline. The generated SQL drops into the editor so you can tweak it.
  • Schema browser: every loaded file shows up with auto-detected column types and row counts; click a table to start a query.
  • Export anywhere: send query results out as CSV, JSON, or Parquet.
  • Agent-callable: window.loft.tools.invoke('log-query-workbench', { file, sql }) runs a query headlessly over a dropped file.

Nothing uploads — open DevTools' Network tab and watch your data stay put. The DuckDB engine downloads once from a CDN on first use, then runs offline.

added Subnet Planner — plan your IP space, visually

A real subnet planner, not just a calculator: enter a parent block and the subnet sizes you need and it lays out an optimal VLSM allocation, draws a visual map of your address space, flags overlaps, and finds the next free block of any size. The plan is a file you own — no NetBox install, no server, no account, nothing uploaded.

What's new

  • Subnet Planner: VLSM allocation, a visual address-space map (colored by status), overlap/conflict detection across the whole plan, and a free-space finder.
  • Allocation tracker: name each subnet and tag it with VLAN, site, and status; the plan persists locally and exports as JSON or CSV (which NetBox/phpIPAM can ingest).
  • Built-in tools: a CIDR calculator (network, broadcast, range, mask ⇄ wildcard, usable hosts), supernet aggregation, and IPv6 expand/compress.
  • Import: load a CSV or JSON plan to pick up where you left off — round-trips with the spreadsheets you already use.

It's a planner and record-of-truth, not a live discovery tool (a browser can't ping-sweep or query SNMP) — import is how the current reality gets in. Everything runs in your browser.

added Angle measure mode in CAD viewers

A new angle measure mode landed in the CAD viewer family. Click three points to get the angle between two edges — a standard CAD-review need that complements the existing distance and point measure modes. Available via the toolbar tool group and the Cmd-K command palette.

changed Autodesk-parity polish across the CAD viewer family

Three Autodesk-Viewer-class features landed across the CAD viewer family in a focused parity push:

  • Five visual styles: shaded, wireframe, shaded-with-edges, hidden-line, and x-ray. Hidden-line gives you the engineering-drawing look with edges only. X-ray makes the model translucent so you can see internal geometry at 8% opacity — the industry-standard reference look, not an opinionated brand-color version.
  • Bounding-box dimensions overlay: X, Y, and Z extents of the loaded model in your selected measurement unit, with axis colors matching the 3D convention (X red, Y green, Z blue). Auto-hides Z for 2D viewers.
  • Section box with six planes: previous section mode was a single plane. The new box mode gives you X-min, X-max, Y-min, Y-max, Z-min, and Z-max sliders so you can carve out any axis-aligned region of the model — the standard CAD-review tool for inspecting an interior cavity.

Phase A also fixed a STEP-parsing bug where the JDC4 model was rendering three phantom rod-shapes because the cylindrical surface trim-curve was being inverted. The fix extends our post-tessellation phantom-extrusion filter from cones-only to cones, cylinders, and toruses.

added CAD viewers — editor template, mobile chrome, AR preview, sharable URLs

The new 3D and CAD viewers got the full editor template treatment, lifting them to feature parity with the rest of the Loft Tools editor surface.

What landed:

  • Command palette (Cmd-K): 26 commands across File, View, Render, Tools, Assembly, and Help groups. Fuzzy search, arrow keys, Enter to fire. The keyboard grammar matches every other editor in the suite — F to fit, M to measure, S to section, 1-6 for ortho views, Home for isometric.
  • View cube widget: top-right corner snaps the camera to any of 15 standard views.
  • Mobile chrome: a touch-optimized toolbar appears below 480px with 44px touch targets — the viewer is usable one-handed on a phone.
  • AR preview: on iOS Safari, GLB files can launch into Quick Look's room-scale AR view. Drop a model from a vendor page and walk around it at 1:1 scale.
  • Sharable URLs: the current view (camera angle, render mode, section state) encodes into the URL hash. Copy the link, paste it, and the recipient lands on exactly your view.
  • Bundled sample files: each viewer ships with at least one sample model so you can try it without finding a file first.
  • Print panel: print the current view with a clean header and dimensions.

The CAD splash screen was also brought into alignment with the Gerber viewer's source-of-truth dimensions so the two viewer families feel like siblings.

added GLB animation playback + WebXR for supported devices

GLB files with embedded animations now play in the viewer. Open a .glb from a game, simulation, or product visualization and the command palette grows an Animation group with a Play entry per detected clip plus a Pause command.

The same release added a WebXR / VR mode toggle across all six mesh viewers (STL, OBJ, PLY, GLB, 3MF, STEP). On a device with a WebXR-compatible headset, the "Enter VR mode" command drops you into a room-scale immersive view of the loaded model. On devices without XR support the entry stays hidden.

added Markup overlay for CAD review — rectangles, arrows, notes

A click-to-draw markup layer landed on the CAD viewers — the kind of annotation surface engineers and designers use in Autodesk Viewer to flag a region during a design review.

Three markup tools:

  • Rectangle: two clicks define a bounding-box outline with an optional label
  • Arrow / line: two clicks define a callout arrow
  • Note: one click drops a numbered note with editable inline text

Markups are stored per file in your browser's local storage, so reopening the same model brings them back. They auto-sync across tabs via the storage event, and their coordinates are normalized so resizing the window doesn't shift them. Pointer events bypass to the underlying viewer when no markup tool is active, so orbit and measure stay live alongside annotations.

changed STEP assembly tree shows real part names + properties

STEP files with multi-part assemblies now show real part names in the assembly tree instead of "Mesh 1 / Mesh 2 / Mesh 11". The parser was pulling only the first PRODUCT name and suffixing shell indices; the fix walks all products and maps each shell to its real name.

The same release added a per-part properties panel: select any part in the assembly tree and a key-value table surfaces its STEP-encoded ID, name, and description. This is the same metadata Autodesk Viewer and Fusion 360 surface when you select a component — useful for cross-referencing parts against a bill-of-materials or a CAD-team's part catalog.

added 3D and CAD viewer family — seven new tools

Loft Tools now has a full 3D and CAD viewer family. Seven file formats are supported, all running locally in your browser — no uploads, no Autodesk account, no installer.

Formats supported:

  • STL — the standard 3D-printing mesh format
  • OBJ — the long-standing mesh interchange format
  • PLY — common in 3D scanning and academic geometry
  • GLB — binary glTF with materials and animations
  • 3MF — Microsoft's modern 3D-print format with units and color
  • STEP — the heavyweight: full B-rep CAD assemblies from SolidWorks, Fusion, NX, CATIA, Onshape, and more
  • DXF — AutoCAD's 2D drawing format

What you can do with them:

  • Orbit, pan, and zoom with mouse, trackpad, and touch
  • Snap to standard views — top, front, side, isometric — via a corner view-cube widget
  • Measure distances and points with a measure tool that snaps to vertices and edges
  • Section through the model with a clipping plane to inspect interiors
  • Switch render modes between shaded, wireframe, shaded-with-edges, and hidden-line
  • Browse the assembly tree on multi-part STEP files — drill into nested products and isolate components

Everything runs on a new in-browser CAD kernel built specifically for this — no thin wrapper over a remote service. Files never leave your device.

changed Gerber Viewer right pane is now actionable

The Gerber Viewer's aperture and drill panels used to be inert lists of data. Now every aperture and drill row is clickable — tap a row and the viewport recenters on the first flash of that D-code while the renderer paints a selection ring on the target pad.

More:

  • Click any aperture row to highlight every flash on the board — a second click clears the highlight. Toggling the parent layer hides the contribution automatically.
  • Click a copper trace in Inspect mode to pin its width as a measurement — the renderer drops a perpendicular crossbar with the width value labeled, so you can document conductor widths without re-measuring.
  • The trace-width probe now runs in the default select mode, not just Inspect — hover any copper trace and read the width live.
  • Aperture column sorting now announces sort state to screen readers.
  • PNG/SVG/DXF export errors surface as in-app toasts instead of browser alerts.
fixed Gerber Viewer — thermal-relief pads and SVG export rewrite

Two correctness fixes in Gerber Viewer's render pipeline.

Thermal-relief (AMTHERM) pads now render as the correct wagon-wheel pinwheel shape in the WebGL fallback path. Previously the four rect cuts were dropped, producing a filled inner pad surrounded by a continuous ring — visually wrong on any board using thermal reliefs to connect pads to copper pour.

The SVG export got a full rewrite. Three compounding bugs in the previous version meant export rarely matched the canvas render:

  • Polarity was ignored — every chunk painted in copper color regardless of LPD/LPC state. Thermal-relief cuts, copper-pour cutouts, and soldermask openings all rendered solid.
  • Soldermask was inverted — chunks represent openings in the mask, not the mask itself, but the exporter painted them as solid mask color.
  • Annular rings now emit as evenodd fill paths instead of stroked circles, which is more reliable across renderers like Inkscape and Illustrator.

The rewrite uses per-layer SVG <mask> elements as the polarity arithmetic, mirroring how the canvas renderer composes layers.

fixed Calendar events generated with truly random IDs

The ICS calendar event generator used to fall back to Math.random() for event UIDs on browsers that lacked a built-in UUID API. It now uses cryptographically strong randomness in all cases, so generated events cannot be made to collide with another calendar entry on import.

fixed Gerber viewer: polish round on render correctness

A focused polish pass after side-by-side comparison against tracespace, pcb-tools, and KiCad GerbView.

  • Thermal pads. Aperture macro primitive 7 (the cross-hair pad) now renders as a true pinwheel — annular ring with four rectangular cuts subtracted — instead of a plus-sign blob with the inner pad missing.
  • Silk over pads. Silkscreen ink no longer paints over pad openings, drill holes, or past the board outline. Real PCB fab processes don't deposit ink on bare metal; files often ship with silk crossing pads, and the viewer now clips that out on both Canvas2D and WebGL paths.
  • Per-flash transforms (X3 %LM/%LR/%LS). Modern KiCad 7+, Altium, and Eagle exports request per-flash mirror, rotation, and scale on aperture flashes. Previously dropped silently, which made silk text appear too big, oriented wrong, or back-to-front on bottom layers. Now applied correctly.
  • GPU paste color. Solderpaste over copper no longer renders as a tan/yellow opaque blob in GPU mode — caused by a premultiplied-alpha mismatch between the shader and the browser compositor.
  • Other fixes. Trace mode now picks the stroke body, not just pad centers, so clicking anywhere on a trace highlights its net. WebGL fallback no longer drops arc segments from fill chunks. Default tool mode is now pan (matches Tracespace / JLCPCB / Altium365 / KiCad convention) so drag actually does something on first load. Space-bar pan no longer re-fires the last-clicked button.
added Gerber viewer: flex / rigid-flex PCB support

The viewer now understands flex and rigid-flex board files. New layer kinds: coverlay (amber translucent), stiffener (opaque grey FR-4), and bondply (warm adhesive). Detection reads both X2 metadata (Coverlay / Stiffener / Bondply file functions per the Ucamco spec) and filename patterns for legacy archives.

The Board Info panel now shows a "Stackup" view when the file ships with material-stackup metadata, rendering the cross-section as a colored vertical legend that matches the canvas. Boards are auto-classified as rigid, flex, or rigid-flex based on stackup composition. Automatic IPC-2223 bend-radius calculations: 6× total flex thickness for static bends, 8× for dynamic, 15× for multilayer flex.

changed Gerber viewer: real PCB rendering + X2/X3 metadata + diff mode

The Gerber viewer just stopped looking like Gerber files and started looking like real PCBs. A KiCad export that previously rendered as a mustard-yellow mess now shows the green soldermask, exposed gold pads, dark drill holes, and FR-4 tan substrate you'd expect.

  • Faithful colors and layers. Soldermask is properly translucent green with gold pads showing through, drill holes punch through as dark holes, silkscreen sits at a sensible weight, and copper pours fill solid instead of looking like sparse threads.
  • Smart layer detection. Recognizes French and German KiCad exports (Cuivre, Composant, Kupfer, Bestueckung), Eagle two-letter extensions (.GTL, .GBL, etc.), and reads modern X2/X3 metadata directly from the file for unambiguous detection. A pre-canvas confirmation dialog lets you fix or drop misdetected layers before viewing.
  • Diff mode. Drop a second archive to compare two fab revisions side-by-side with a draggable slider divider, or use XOR to make added/removed copper pop in cyan/magenta. Layer toggles mirror across both archives so picking copper on one shows copper on both.
  • Performance. Idle CPU on a 100k-chunk board dropped from ~60% to ~0% while preserving 60fps response, thanks to a frame-skip loop that only redraws when something actually changed.
  • Industry conventions. Solderpaste hidden by default (assembly-only), bottom-side layers hidden by default (matches CAM350 / GerbView), benign tracespace warnings filtered out so the warning chip only flags real issues.
fixed Gerber viewer: unit toggle now respected everywhere

The mm/inch toggle was being ignored in five display surfaces. When the toggle was set to inches, several panels still displayed millimeter values with an "in" suffix slapped on the end. Fixed sites:

  • Aperture Table size column (a 1.5 mm circle was reading as "⌀1.500 in")
  • DRC report markdown coordinates
  • Reference pad label coordinates
  • Measurement TSV/Markdown export
  • Status bar cursor X/Y, hover pad coords, and trace probe width

All now route through a single unit-conversion helper. The Netlist CSV download intentionally keeps raw millimeter values for downstream machine consumption.

added Inspect any pad to read its net, refdes, pin, and component info

Modern Gerber files carry rich metadata about every pad — the viewer now surfaces it. The new Inspect mode lets you click any pad to read its net name, reference designator, pin number, component value, footprint, mount type, rotation, and aperture function. Click a net name to highlight every pad on that net across the board.

The Netlist panel now lists canonical nets sorted by pad count when X2 metadata is available, with click-to-highlight for any net. The Aperture Table gained an "Fn" column showing pad function (SMD pad, via pad, BGA pad, etc.). The Job Info panel reads .gbrjob companion files for generation software, creation date, project ID, board thickness, finish, and copper weight.

When a layer is detected by X2 metadata rather than filename guessing, the detection row shows it so you understand why a layer was tagged the way it was.

removed Text-tools cleanup — 21 commodity transforms retired

Phase 1 of the AI-hard-moat pivot. Twenty-one text and design transforms that any chat assistant solves in two seconds were retired, so the catalogue focuses on tools where local compute and file-binary handling actually matter.

  • Novelty text generators removed (5 tools, return 410 Gone): zalgo text, fancy text generator, ASCII art generator, strikethrough text, small-text generator.
  • Commodity text utilities removed (11 tools, redirect to category): lorem ipsum, reverse text, case converter, sort lines, remove duplicate lines, remove extra whitespace, find-and-replace, essay word counter, reading-time estimator, word-frequency counter, readability score, passive-voice detector.
  • Random-name and random-team generators retired — Google's SERP widget already answers these in 0.5 seconds.
  • Design commodities removed — color-gradient generator and pattern generator (Coolors and the OS color picker own these).

Copy honesty sweep: removed every "ad-free" / "no advertising" / "zero ads" claim across the site (ads are planned for the free tier in a later phase), and pulled the "built in the open" framing since the codebase is closed-source. The cookies page now explains what changes when ads ship instead of promising they never will.

Cleaner card layout: tool cards now cap descriptions at three lines so the homepage and category pages render with even card heights regardless of description length.

changed Dev-tools rebuilt — line-numbered editors, syntax highlighting, and a unified CSV ↔ JSON ↔ YAML converter

Every dev-tool that takes pasted text or builds a generated file got a rebuild. Plain textareas became proper code editors. Side-by-side input/output panes replaced the old two-textbox layout. JSON, CSV, and YAML conversions consolidated into one bidirectional tool that auto-detects what you pasted.

Line numbers + syntax highlighting on every output

Every output pane now shows numbered lines and proper colour coding. JSON keys go cyan, strings green, numbers and booleans orange. The same treatment applies to XML, YAML, CSS, HTML, JavaScript, SQL, Markdown, and JWT decoded payloads. Highlighting loads on demand per language so the page stays light.

The input side stays a plain monospace textarea — that's a deliberate choice. Highlighting while you type breaks cursor placement and copy-paste in browsers; we'd rather you have a textarea that behaves like a textarea, with the highlight reserved for the formatted output you actually want to read or copy.

One bidirectional converter for CSV, JSON, and YAML

Previously we shipped three separate tools: CSV → JSON, JSON → CSV, and YAML → JSON. They were the same tool with the input and output swapped. Now there's one tool with two format dropdowns and a swap button between the panes.

  • /tools/dev-tools/csv-to-json — CSV in, JSON out (default).
  • /tools/dev-tools/json-to-csv — same tool, JSON → CSV by default. URL preserved for SEO and bookmarks.
  • /tools/dev-tools/yaml-to-json — same tool, YAML → JSON by default.
  • /tools/dev-tools/json-to-yaml — same tool, JSON → YAML by default.

Click the round arrow between panes to swap source and target on the fly. Toggle "Auto-detect" and the tool sniffs the format of whatever you paste. Status chips below each pane tell you how many rows / columns were detected and which delimiter the parser picked.

New per-tool wins

JSON formatter — two new toggles in Advanced Options. BigInt-safe quotes integers larger than 2^53 before parsing so they survive the round-trip without losing precision (banking IDs, Twitter snowflakes, distributed-system tokens — anything that gets silently corrupted by JSON.parse). Auto-repair strips trailing commas, quotes unquoted keys, normalises single-quoted strings, lowercases True/False/None. Useful for Python or JS-object-literal copy-pastes.

Hash generator — pick from MD5, SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 (turn each on or off independently). Switch to HMAC mode and provide a shared secret to authenticate a payload. Paste a known hash into the Expected hash field for an instant match check across every enabled algorithm at once.

Markdown to HTML — DOMPurify sanitization is on by default with a green "Sanitized" chip when active. Toggle it off and the chip turns amber to remind you the raw HTML is unsafe to render unless you trust the input.

Timestamp converter — completely rebuilt. A live "current epoch" ticker at the top updates every second in seconds / milliseconds / microseconds, each one click-to-copy. Below: input format (Unix-s / Unix-ms / Date-string), timezone selector, and an All-Formats output covering Unix, ISO 8601, RFC 2822, Local, and Relative time. The new Code snippets panel below shows ready-to-paste expressions for that exact moment in JavaScript, Python, Go, Rust, PostgreSQL, MySQL, Bash, and ISO 8601.

UUID generator — auto-generates one UUID on page load (no more empty output). Choose v4 (random) or v7 (timestamp-ordered). Format options for braces, no-hyphens, uppercase, URN. New Decode field: paste a UUID and we extract its version, variant, and (for v1 / v7) the embedded timestamp.

URL encoder/decoder — new URL inspector view appears in the Tips slot when you decode a valid URL. The pasted URL splits into protocol / host / path / query-params / fragment so you can inspect each piece individually.

HTML minifier — new Preserve template syntax toggle. Minify a Blade / EJS / Smarty / Handlebars / PHP template and the {{ … }}, <?= … ?>, {% … %}, <% … %> blocks survive intact while the surrounding HTML still gets crushed.

JWT decoder — claim-validation chips. When the token has an exp claim that's already passed, a red Token expired chip shows. Standard claims iss, sub, aud are surfaced when present.

Regex tester + Diff checker — both now ship with default sample input so the result panel never starts empty. Replace the sample to test your own pattern / your own diff pair.

Examples + Copy + Download on every tool

Every tool's input pane has an Examples dropdown with one or two sample inputs you can load with a click. Every output pane has a Copy button (top-right, where you'd expect) and a Download button beside it that saves the output as the right file type — .json, .css, .min.js, .htaccess, sitemap.xml, uuids.txt, etc.

Advanced Options and Tips live in collapsible cards beneath the panes. Open or close once and we remember your preference for next time.

Why this took a rebuild instead of a polish

The old layout was two plain textareas with a tiny center column for controls. No line numbers, no highlight, no Copy on the output, no Examples menu, no Download. We could have papered over each gap one tool at a time, but eight separate text-tool migrations are coming and they all need the same chrome. Rebuilding the underlying template once means every text-flavored tool the site ships from now on inherits the same workspace UX.

Privacy + security 5
added EVTX Explorer — triage Windows event logs in your browser

Drop a Windows .evtx event log and triage it entirely in your browser — SIGMA detections, logon-session reconstruction, an Event ID + MITRE knowledge base, and faceted filtering. The log, full of internal hostnames and indicators, never leaves your device. A Rust-to-WebAssembly engine does the parsing locally.

What's new

  • EVTX Explorer: parse and triage Windows Event Logs (Security, System, Sysmon, PowerShell, custom channels) in the browser, with the records list on top and full per-record detail below.
  • SIGMA detections: bundled rules (log clearing, service installs, PsExec, recon, scheduled tasks, privileged-group changes) plus a failed-logon-burst heuristic flag suspicious events with severity and MITRE ATT&CK technique — and you can paste your own SIGMA rule.
  • Logon-session reconstruction: 4624/4634/4647 paired into sessions with logon type, account, source IP, and duration.
  • Event ID knowledge base: common security IDs annotated with what they mean and why they matter, shown inline.
  • Faceted triage: filter by Event ID, level, provider, and channel, plus full-text search; export filtered events or detections to JSON.

Triage, not an EDR — it finds known patterns in a log you already have, with no upload and no setup. Built on the open-source omerbenamram/evtx parser; thanks to that project.

added Identity Inspector — decode certs, JWTs, SAML & OIDC locally

Paste a certificate, JWT, SAML response, or OIDC discovery document and decode it entirely in your browser. The artifacts a sysadmin debugs all day — full of emails, roles, tenant IDs, and sometimes key material — never leave your device. Open DevTools' Network tab and watch: nothing is uploaded.

What's new

  • Identity Inspector: a four-in-one decoder for X.509 certificates, JWT/JWS tokens, SAML messages, and OIDC discovery documents, with problems flagged inline.
  • Certificates: subject, issuer, validity with an expiry countdown, SANs, key usage, fingerprints (SHA-1/256), CSR decoding, multi-cert chain ordering, and an expiry dashboard.
  • JWT: pretty-printed claims with an iat/nbf/exp timeline and human countdowns, plus optional signature verification against a public key or JWKS — never a server secret.
  • SAML: inflates and pretty-prints AuthnRequests and Responses, extracts the assertion (NameID, conditions, audience, attributes), and flags clock skew and audience mismatch.
  • OIDC: renders endpoints, scopes, claims, grant types, and signing algorithms from a .well-known/openid-configuration document.

Why not jwt.io or an online SSL decoder? Those send your token or certificate to a vendor's server. This does the same decoding locally — the privacy is the point.

added MFA Vault — your 2FA, encrypted on your device

A passphrase-locked vault for the MFA sprawl that password managers don't handle well: TOTP/2FA seeds, backup codes, which method is on which account, and break-glass procedures. Your key is derived with Argon2id and everything is encrypted with AES-256 in your browser — the vault is a file you own, and nothing ever syncs to a server.

What's new

  • MFA Vault: a client-side-encrypted store for TOTP/HOTP seeds with live codes and a 30-second ring, locked behind an Argon2id + AES-256 passphrase that's never stored.
  • Import your existing 2FA: from otpauth:// URIs, QR-code screenshots, or a full Google Authenticator export (otpauth-migration) — all accounts at once.
  • Export: copy an entry as a URI or QR to re-scan elsewhere, and back up the whole encrypted vault as a file.
  • Recovery code locker: store the one-time backup codes per account and tick them off as you use them, with a low-codes warning.
  • MFA inventory + account map: record which methods each account uses and which identity (personal, admin, service, root) is used where — the sprawl picture nobody writes down.
  • Break-glass runbooks: per-system recovery steps, encrypted alongside the secrets.

Auto-locks after idle. The trust model is the product: your passphrase is unrecoverable, the vault file is yours, and a browser tab is not a hardware key — for the highest-value accounts, pair this with a security key.

fixed PWA security hardening — OCR model allowlist, beacon SRI, no opaque fallback

Three security fixes in the PWA service-worker path.

  • OCR model precache is now origin-allowlisted. The pre-cache OCR model handler used to accept any HTTPS URL, which meant a same-origin script could coerce the service worker into fetching arbitrary blobs into the OCR cache (poisoning + bandwidth abuse). The allowlist covers jsDelivr, media.github, raw.github, and the canonical Tesseract data host.
  • Analytics beacon requires integrity hash. The third-party analytics beacon used to ship without an SRI integrity attribute — any CDN compromise would have injected arbitrary JS into our origin. The beacon now requires both a token AND an integrity hash env var; without the hash the beacon is suppressed entirely.
  • Dropped the opaque CORS fallback in OCR precache. Opaque responses can't be integrity-checked or size-counted, and would let a CORS-stripping man-in-the-middle attacker poison the cache. The fallback was speculative — jsDelivr and githubusercontent both serve CORS by default.

Plus a correctness fix: the OCR language regex now accepts underscores, so chi_sim and chi_tra (simplified and traditional Chinese) no longer silently fail validation.

changed Pre-launch security hardening across the whole site

A multi-pass security review tightened every tool that touches files, passwords, or HTML on this site. Highlights users will notice:

  • Encryption upgraded. File Encryption and Secure Note Sharing now derive keys using 600,000 PBKDF2 iterations (the current OWASP recommendation, up from 100,000). Existing encrypted files and shared notes remain readable — only new ones use the stronger settings. File Encryption bundles now also bind metadata into the encryption tag, so tampering with a bundle's filename or salt invalidates decryption instead of failing silently.
  • Unlock PDF refuses partial unlocks. Previously, a file that only partially decrypted could come out the other side looking unlocked but still mixed encrypted streams. The tool now refuses to write a half-broken PDF and tells you why.
  • Redact PDF is now truly permanent. The standalone Redact PDF tool was only painting black rectangles on top of the original text. It now matches the PDF Editor's behaviour: redacted pages are rasterised into a flat image so the original glyphs cannot be recovered. The tool's labels and warnings were updated to honestly describe what happens.
  • HTML to PDF and Markdown to HTML can no longer execute pasted scripts. Both tools now route pasted content through a strict sanitizer before rendering, so a malicious paste can't reach your saved files, your encryption passwords, or other tools' state.
  • Gerber Viewer rejects decompression bombs. Tar.gz / zip archives that claim to be small but expand into gigabytes are aborted before they can crash your browser tab. The same protection was added to the File Encryption bundle loader.
  • Image to Favicon now tries the site's own /favicon.ico first before falling back to Google's favicon service, and tells you on screen which path was used. Honest disclosure that the domain you type can, in some cases, be sent to Google.
  • Phosphor icons are now bundled instead of loaded from a third-party CDN, so a compromise of an external host cannot affect future visits.
  • Site-wide HTTPS hardening (HSTS preload, tighter Content-Security-Policy, JSON-LD escaping). No visible change for normal use; it just closes injection paths.
Cooking + craft 3
changed CanCraft — acid P-values, a 2-D field solver, and per-defect diagrams

A round of depth and polish on the CanCraft thermal-process cockpit, widening who it serves and how much you can trust the numbers.

  • Acid foods get a real answer: acid / acidified products (pickles, tomatoes, acidified packs) now show a delivered boiling-water pasteurization value (P) against the spoilage target — not a "not applicable" shrug. Only truly water-activity-controlled products (jams) stay out of scope, with the survivor chart replaced by a plain explanation
  • 2-D finite-difference field solver: an independent, axisymmetric finite-difference conduction model computes the cold-spot curve and cross-checks the Ball-formula number — so you can see how much your heat-penetration assumption is doing, with the cold-spot location reported
  • A diagram for every defect: the troubleshooter now draws a labeled can silhouette deformed to match — domed ends for swells, a caved wall for panelling, a peak, a seam leak path, rust pitting, the flat-sour "sour, no gas" marker — consistent across all eleven defects
  • Deviation overlay: paste a measured cold-spot trace and it's plotted against the scheduled curve, so you see where the run diverged — not just the delivered-F₀ number
  • Touch + accessibility: teaching now responds to a tap, not only hover; charts carry their numbers in their labels; status is announced, not colour-only
  • Saved scenarios persist across reloads

Everything runs in your browser. Planning and education only — not a filed scheduled process. Validate with a process authority and a real heat-penetration study.

added Canning Calculator becomes CanCraft — a real thermal-processing workbench

The thin canning calculator is now CanCraft, a six-stop workstation that does actual cannery math — not just jars and altitude. Define a product, design the container, pick a retort, and watch the cold-spot temperature curve and sterilizing value (F₀) update live as you tune. Everything runs in your browser; nothing leaves your device.

What's new

  • Product & organism setup: pH and water-activity classify the food (low-acid vs acidified) and set the target organism, kinetics, and F₀ floor automatically.
  • Container designer: round or rectangular cans with size-code ↔ inch ↔ mm round-trips, plus buckle and panel pressure limits derived from the geometry.
  • Retort systems: eight industrial setups — still steam, water immersion, water spray, steam/air, agitating (end-over-end and axial reel), continuous cooker-cooler, and hydrostatic. Rotation actually speeds the heating curve; each medium carries its own overpressure requirement.
  • Live thermal simulator: cold-spot curve with the lethal-rate fill, a play/scrub transport, per-stage F₀ breakdown, and a one-click "solve the minimum hold for my target F₀."
  • Pressure analysis: peak internal pressure, wall differential vs the buckle/panel limit, hoop stress, and the cooling overpressure ramp that prevents buckling.
  • Double-seam teardown: enter the seam dimensions and get overlap %, body-hook butting, free space, and a scaled cross-section drawing with a pass/fail against the can-size spec.
  • Defect troubleshooter: pick a symptom (swell, buckle, flat-sour, leaker…) and get ranked probable causes, the confirming test, the remedy, and a deep link to the input that fixes it.
  • Heat-penetration CSV import: drop a thermocouple log and CanCraft fits fh/jh for you — works for any container shape because the measured curve already embodies the geometry.
  • Scenarios & sensitivity: save setups, compare them, see which variable moves F₀ the most, and export the schedule as CSV.
  • Reference library: a seventh stop with 360+ primary sources — FDA 21 CFR 113/114, USDA-FSIS, Codex, ISO, IFTPS, NCHFP, ASTM seal-integrity standards, retort-pouch and high-barrier packaging science, and patents — each link checked reachable, filterable, opening in a new tab.

CanCraft is a planning and education tool — it computes lethality and integrity to help you understand a process, and it never substitutes for a qualified process authority or a filed scheduled process.

changed CanCraft — a thermal-process cockpit that teaches

CanCraft was rebuilt around one idea: a canner should leave understanding the thermal-process model — not just reading a number. The engine (F₀, heat penetration, retort systems, pressure, double-seam) stays; everything you see around it now explains itself.

  • A teaching rail: hover or focus any control, chip, or result and a panel explains what it means, why its safe line sits where it does, what moves it, and what fails if you cross it — with the safety-vs-spoilage distinction made explicit
  • Honest verdicts: F₀ is shown against the 12-D floor, never as a bare "safe"; per-stop status turns green only on a genuine pass, not by default
  • No more blow-ups: an acid or water-activity-controlled product now reads "F₀ not applicable" with the reason (a botulinum cook doesn't apply), instead of a nonsensical number
  • Deviation analysis: paste a real cold-spot trace and the general method recomputes the delivered F₀ versus your schedule and the floor — it informs the judgment, it never clears a load
  • Failure as a teacher: the troubleshooter ties each defect to your live numbers, tags it safety / spoilage / quality, and links straight to the input that fixes it
  • Legible charts: every chart has a legend and axis labels and is sized to fit; the container cross-section shows where the cold spot is and why
  • Two honest depths: Learn (guided essentials, everything explained) and Drive (every lever — D/z, fh/jh, seam teardown, pressure, deviation)

Everything runs in your browser. This is planning and education — not a filed scheduled process. Validate with a process authority and a real heat-penetration study.

Loft Tools site 42
added Tool history — every change, on every tool

Every tool now carries its own change history, derived automatically from the build's git log. See exactly how a tool has evolved — when it was last improved, how often, and what changed.

  • Per-tool timeline: each tool page shows when it was last updated, the total number of updates, and its three most recent changes
  • Dedicated history page: a /history route per tool lists every change grouped by date, each tagged with its type (feature, fix, performance, refactor…) and scope
  • Editor tools included: full-bleed editors (PDF Editor, the CAD/mesh viewers, CanCraft) get a History link in their header — same trail, no clutter on the editing surface
  • Honest attribution: a change is credited to a tool only when it touches that tool's own files — shared infrastructure never inflates the count
  • Zero upkeep, retroactive, automatic: history is generated at build time for every current and future tool, reaching back through file renames so nothing is lost when a tool is rebuilt

No hand-written entries to maintain — the history is the commit log, surfaced where it's useful.

added Local-first blog + a rebuilt "How it works"

Loft Tools now has a proper place to explain how browser-local tools actually work — and why your files never leave your device. A new blog and a rebuilt explainer page launched together.

What's new

  • The blog is live — a local-first education library covering the tech behind the tools: on-device OCR, browser speech-to-text with Whisper, OPFS (the Origin Private File System), the WASM component model, PDF redaction done right, web color management, and head-to-head comparisons with desktop incumbents. More posts are scheduled through the summer.
  • "How it works" pillar — the explainer page was reworked proof-first: a clearer hero, a table of contents, and diagrams showing the file → in-browser engine → result path with nothing uploaded.
  • Blog in the top nav — reachable from every page, not buried in the footer.

Why it matters

The whole pitch is that PDFs, images, audio, and CAD files are processed in your browser tab — no server, no upload, no account. These pages show the receipts: what runs locally, what that costs in memory, and where the limits are. Every post is structured so search engines and AI assistants can cite it accurately.

changed About page — privacy + cross-platform, less grievance

The About page previously spent three paragraphs bashing competing tool sites — "barely disguised ad farms", "actively hostile minefields", "greedy paid tools". That hostile tone undermines the privacy-first brand and reads as bitter rather than principled. The new version leads with privacy and cross-platform reach (PWA, every modern browser, offline-ready after first visit, no install), then explains who built it and how it stays free. The solo-dev voice and the tool-request CTA stay.

A separate copy sweep pruned vague marketing phrases on the homepage and /featured meta — "powerful" replaced with the specific format families being addressed ("PDF, PCB, and 3D software"), "Zero friction" on the About subtitle replaced with the concrete "No accounts, no upload, no tracking." (An attempt to also rewrite the homepage hero h1 and subtitle in the same sweep was reverted later the same day.)

added Definitional capsules on every tool

Every tool now ships a 40-60 word answerCapsule — the definitional paragraph rendered between the H1 and the HowTo block, and reused as the WebApplication.description in JSON-LD. Research on AI-generated answers shows ~44% of ChatGPT citations come from the first 30% of a page, so this is the highest-leverage AEO surface a tool page has.

  • Coverage went from 15 to 60 (100%) in this pass.
  • Tone is privacy-moat first, mechanism-specific, no marketing verbs. Examples: Protect PDF leads with the key-derivation happening in your browser (and contrasts that with SaaS uploaders seeing the plaintext); Secure Note Sharing leads with the URL-fragment trick (browsers never transmit fragments, so the encrypted note literally cannot reach a server); Redact PDF leads with the byte-removal vs black-rectangle-overlay distinction.
  • Each capsule is unique in opening structure (action, contrast, mechanism, spec, scenario) — no cookie-cutter "X is a free browser-based Y that…" template.
  • A small scripts/inject-answer-capsule.mjs helper inserts the YAML folded scalar after the existing h1: line; supports --overwrite to replace.
fixed Tool tip rail CTA points to the category, not back to the same page

The right-rail tip card on featured tool pages was wired to "Open Compare PDF →" linking to the Compare PDF page — the page the reader was already on, making the button a no-op reload. The CTA now reads "More tools like this" and routes to the sibling category page (e.g. /tools/pdf-tools/) so the click surfaces adjacent tools instead. Falls back to /tools when the category is unknown.

added Tool-page right rail — tips, cross-promo, what's new

Tool pages now show a right-side rail card at desktop widths (≥1280 px), pinned at the same position on every page. It rotates between tool-specific tips harvested from each tool's YAML, cross-promo for the featured tools, the latest changelog entry, and a community-support card.

  • Tool tips ship with every YAML now. Featured tools (PDF Editor, Compare PDF, Gerber Viewer, and the seven CAD viewers) each ship three to four tips — non-obvious behaviours like real text edit vs annotations on top, true redaction, F7 to walk every diff, snap-to-pad measurement, snapshot URLs. Small tools ship one or two. Tips also render into each tool's .md AI variant under ## Tips.
  • Featured-tool editor surfaces (PDF Editor, Compare PDF, viewers) get the rail too, Photopea-style — editor canvas shrinks to leave a 332 px gutter on the right. Hidden on tablets and mobile so the editor owns the full viewport there.
  • Consistent position: rail floats at right: 16 px on every tool page. Wide monitors (≥2064 px) keep the content perfectly centered; narrower laptops (1280–2063 px) push the content slightly left to make room — same rail position either way.
  • Card variants: glass surface matching the tool workspace, top-left chip ("Tool Tip", "From Loft Tools", "What's New", "Support Loft"), hero element (Phosphor icon, keyboard combo, or version badge), title, description, optional bullets, single CTA.
  • Print + low-viewport friendly: rail hides when printing or saving as PDF, and collapses its minimum height on short viewports so the call-to-action stays reachable.
  • Pro tier ready: when the paid tier ships, adding is-pro to <html> and one CSS rule will hide the rail across the site with zero refactor.

This is the placeholder era — content rotates from a hand-curated pool deterministically per tool per build date. When the in-house ad system lands, real creatives will slot into the same position via the same component without changing the user-facing pattern.

added Search citation copy on every tool

Every tool page now shows a short 40–60-word "answer paragraph" between the headline and the how-to steps. It's the first thing readers — and AI assistants citing the page — see.

  • Coverage — went from 15 tools with the paragraph to all 60. The paragraphs avoid the AI-slop "free browser-based" template and instead lead with action, contrast, scenario, spec, or mechanism.
  • Mechanism-first — each paragraph names the specific library or browser API doing the work (pdf-lib, Tesseract.js WASM, Web Crypto API, Canvas API, ffmpeg-wasm, MODNet for ID-photo segmentation, etc.) instead of generic privacy claims.
  • Schema-fed — the same text populates the WebApplication.description JSON-LD field, so the differentiator surfaces both to humans on the page and to crawlers reading the schema.

Research on AI citations suggests roughly 44% of ChatGPT citations come from the first 30% of a page, so this paragraph is the highest-leverage block on the tool template.

added Tips on every tool, now in Google's HowTo schema

Every Loft Tools tool (60 of them) now ships hand-written tips — short, normie-friendly notes about non-obvious behaviour and the privacy mechanism that makes each tool different from upload-based competitors.

  • Privacy moats, named explicitly. Each file tool explains where the bytes actually go: pdf-lib in the tab for PDF tools, Tesseract.js via WebAssembly for OCR, AES-256-GCM via Web Crypto for encryption, fragment-only ciphertext for secure note sharing. No vague "we respect privacy" claims — falsifiable mechanisms with the library and algorithm named.
  • Capabilities normies miss: the Color Picker eyedropper reads pixels from any monitor (not just the uploaded image), shift-clicking thumbnails in Delete PDF Pages selects a range, F7 walks every diff in Compare PDF, v7 UUIDs are sortable by creation time.
  • Tips also feed Google's HowTo rich results. Each tip is now emitted as a HowToTip inside the page's existing HowTo schema, so the SERP rich-result card can surface them alongside the step list — without any new structured-data block to maintain.
  • Validator gained a tips schema check so future YAML edits can't ship malformed tips.
  • .pages.dev previews are now noindex, nofollow via a Pages middleware. Stops Googlebot indexing the per-deploy preview URLs as duplicates of lofttools.com.
fixed Stale homepage copy cleaned up after the 3D / CAD launch

Three pieces of homepage copy were leaking outdated category names and tool counts to search engines after the late-April catalog cull and the 3D / CAD viewer launch.

What changed:

  • The structured-data description on the homepage mentioned old categories (media, text) that had been renamed or retired.
  • The page meta description listed aspirational formats (DICOM, IFC) that aren't actually shipped, while missing the seven 3D / CAD formats that just launched.
  • The hero subtitle led with "Best free online tools" — a self-superlative phrase that reads as marketing AI-speak and doesn't reflect the new 3D / CAD viewer hook.

All three are now accurate and current. Search snippets and AI-scanner crawls will surface the right thing.

added First-party analytics — privacy-respecting, PWA-aware, no third-party RUM

Loft Tools now runs its own first-party analytics, replacing the third-party RUM beacon that was sampled, broken when the upstream had outages, and silently dropping events on offline / service-worker-cached pageviews.

What's new for visitors:

  • No third-party tracker on any page: the analytics beacon is same-origin. Nothing about your visit leaves the loft tools domain.
  • Global Privacy Control honored: if your browser sends GPC, the beacon doesn't fire. No opt-out flag to find — your browser setting is the opt-out.
  • No raw IP or user-agent stored: visitor identification uses a rotated salt hash that resets daily, so we can count unique visits without ever writing your IP or UA to disk.
  • Bot traffic filtered silently: known crawlers get a clean 204 with no event recorded, so traffic numbers reflect humans only.
  • Offline-safe: pageviews fired while you're offline queue in the service worker and replay when you reconnect. No more missing visits on flaky networks or after PWA installs.

The full beacon polish round added rate limiting, a daily-aggregate cron so dashboards stay fresh without a full table scan, and a conversion-goals layer that tracks tool completions, PWA installs, shares, and saves so we know which tools actually help versus which need work.

added Industry-standard PWA — share targets, file handlers, screen-wake-lock

Installing Loft Tools as a PWA now unlocks the full set of OS-level integrations that modern installable apps offer. The web app manifest was rebuilt against industry standards and a handful of new browser APIs were wired in.

What you can now do as an installed user:

  • Share files from any app into Loft Tools: the share sheet on iOS, Android, and Windows now lists Loft Tools as a target for PDFs, images, and zips. Files arrive in the relevant tool ready to process.
  • Open files directly into tools: the OS-level file picker can route specific file types straight into the right tool (e.g. a PDF opens into the editor).
  • Window Controls Overlay support: on supported desktop browsers the title bar collapses into the navbar, giving you more vertical room for documents.
  • Smarter install prompt: the install flow tracks user intent better so you're prompted when you'd actually benefit, not on the first visit.
  • Wake-lock on long jobs: tools that run a long operation (large PDF compares, video re-encodes) can hold a screen-wake-lock so your screen doesn't sleep mid-process.
  • App badge support: on PWAs that support it, the installed icon shows a badge when a long job finishes — useful when you've switched away mid-export.
  • App shortcuts: right-click the installed icon for jump-to-tool shortcuts including Cmd-K search.
  • Custom protocol handler: web+lofttools:// URLs open the installed app on click.

A polish pass shortly after added a status indicator in the navbar showing PWA mode and wired the new helpers into the compare-pdf and shared-template tools so everyone benefits.

removed Server-side automation hooks removed

The server-side automation surface was scrubbed entirely. It was unused by external clients and added attack surface with no upside. Going forward, the only programmatic agent surface is the in-page window.loft.tools shim that lets a browser-running agent operate the same tools a human would — no server keys, no rate limits, no separate auth path.

changed Site stays dark by default — clones get a soft origin lock

Loft Tools is now dark by default unless you explicitly toggle to light, and clones of the site get a visible warning banner instead of a free copy of our service worker, analytics, and PWA install prompts.

Why this matters:

  • The site's brand identity is dark-first. Honoring the OS preference meant macOS users on auto-light schedules saw a white flash on first load. The fix is to default to dark and respect only the explicit toggle.
  • Origin protection: if you land on a clone of the site at a non-canonical domain, a banner identifies it as an unofficial copy. The PWA installer, analytics, and offline-cache features stay locked to the real site at lofttools.com.
fixed Real favicon and dark-default theme served to crawlers

Google search results were showing a generic teal-square placeholder instead of our brand mark. Two visible-brand bugs landed in the same fix:

  • Favicon now resolves for crawlers: /favicon.ico was returning 404, and our icon entries were locked behind dark/light media queries that Googlebot doesn't match. The result snippet picked up our cyan brand mark instead of a generic fallback.
  • Site stays dark on first paint: theme bootstrap was honoring the OS-level light/dark preference, so a macOS auto-day/night cycle could flash the site white on first load. The fix locks the default to dark and only switches to light when the theme toggle is explicitly clicked.

A few follow-up rounds polished the favicon further: a proper multi-resolution .ico, a canonical dark-frame version from the brand kit, and a fix for a dark-corner bleed in the on-dark logo asset.

changed Self-hosted webfonts to unblock mainland China visitors

Loft Tools no longer loads fonts from Google Fonts. All three fonts (Inter, JetBrains Mono, and Space Grotesk) now serve from the same origin as the site itself.

Why this matters:

  • Mainland China visitors were seeing system-fallback fonts because Google Fonts is blocked behind the Great Firewall. The site now renders with the intended typography for them too.
  • One fewer render-blocking external request on first page load. The TCP and TLS handshake to Google's CDN no longer holds up first paint.
  • Tighter Content Security Policy since fonts.googleapis.com and fonts.gstatic.com are no longer trusted origins.

The transition took two attempts — the first approach was incompatible with the Tailwind build pipeline, leaving the site briefly falling back to system sans-serif before the proper fix landed via Astro's built-in Fonts API.

added AI crawler signals + Chrome prefetch advice now declared in robots

Loft now explicitly tells AI crawlers they're welcome via Cloudflare's Content Signals declaration in robots.txt. The default rule now declares:

  • Search indexing: yes
  • AI input: yes
  • AI training: yes

This matches the long-standing project stance that AI crawlers (GPTBot, ClaudeBot, PerplexityBot, and others) are intentionally allowed because being citable by AI engines benefits a privacy-first tool catalog.

Additionally, /.well-known/traffic-advice was added with Chrome's Private Prefetch Proxy advice. According to Google's data, prefetched navigations can be 20-30% faster on LCP — and Chrome only uses prefetch when sites opt in via this endpoint.

changed AI-friendly markdown endpoint for each tool now answers privacy questions in detail

Every tool now exposes a rich, AI-friendly privacy section at /tools/{category}/{slug}.md. Crawlers and AI engines like ChatGPT, Claude, and Perplexity prefer this markdown view, and they want specific answers — not vague reassurance.

The new privacy block explicitly addresses:

  • No file upload (verifiable in your browser's Network tab)
  • No AI training on your files
  • No content scanning of any kind
  • No server-side logs of file contents, filenames, or EXIF data
  • No retention anywhere on our infrastructure
  • No account required
  • Offline-capable after first load

Each tool's markdown view also includes a closing comparison against upload-based competitors so that AI engines answering questions like "what's the safest PDF tool" have the structural difference clearly stated. The on-page experience is unchanged — this is for the crawlers and assistants summarizing tools elsewhere.

changed Footer simplified to three legal links

The footer now shows just three legal links — Privacy, Terms, and All policies — instead of the previous seven.

The /legal hub still lists everything (cookies policy, license, notices, accessibility, DMCA, and so on) and is one click away. Industry norm for indie SaaS is two to three legal links; more than that starts to read as legal-anxiety and crowds out secondary product links.

Loft uses no cookies (analytics are cookieless) so the cookies-link prominence isn't required.

added Blog launched with citation-aware structure

Loft Tools now has a blog at /blog with a careful focus on quality over quantity. Posts use a structured citation system so claims can be traced to sources.

Each post supports:

  • Verified author and publisher baked into the structured data.
  • Citations as a first-class field — every reference renders as a proper schema.org CreativeWork and shows in a References block at the bottom of the post.
  • Draft mode so work-in-progress posts don't ship until they're ready.

First posts in draft are deep dives on PDF comparison approaches and how they relate to the rest of the industry. The blog is positioned as a reference resource, not a marketing surface.

added Faster indexing on Bing, Yandex, and Naver via IndexNow

New pages and changes now reach Bing, Yandex, and Naver within minutes instead of waiting 1-3 days for a sitemap recrawl. Loft Tools now uses the open IndexNow protocol that these search engines support.

Coverage notes:

  • Bing indexing also benefits ChatGPT Search, which runs on Bing's index.
  • Yandex powers Russian search.
  • Naver powers Korean search.
  • Google doesn't support IndexNow yet (announced in 2022, still not implemented), so Google indexing still depends on the standard sitemap path.

The first ping pushed 122 URLs and was accepted. Subsequent deploys only push the delta against the last run.

fixed SEO fixes: trailing slashes, canonicals, and crawler-friendly redirects

Search engine crawlers will now see consistent URLs across the entire site. Three connected bugs were making Bing Webmaster Tools flag every URL with "URL has redirect" warnings.

What was fixed:

  • Sitemap entries now use trailing slashes to match what the server actually serves. Before the fix, the sitemap pointed at one URL and the page lived at another — a strong negative signal to search engines.
  • Canonical tags align with the served URL on every tool page, category page, and static page. Mismatched canonicals were undermining indexability.
  • Retired tools now redirect with 301 to a real destination instead of falling through to a 404. Bing keeps revisiting 404s where it deindexes redirects, so this also helps recovered crawl budget.
  • Category page redirects for retired categories (text-tools, media-tools) and individual culled tools all enumerate explicit slug + alias variants so no indexed URL falls through.

These changes don't affect anything you'd notice as a user, but they meaningfully improve how often search engines correctly surface the right pages.

changed Tighter brand identity to distinguish from unrelated Blender add-on

Brand search results will now correctly identify Loft Tools as a web-based PWA, not the unrelated Blender 3D modeling add-on of the same name.

Schema improvements:

  • Description now leads with "web-based Progressive Web App" and explicitly names the file categories Loft works on (PDF, image, audio, video, dev file processing).
  • Alternate names registered: lofttools, loft.tools, and lofttools.com so any spelling variant resolves to the same entity.
  • Tagline ("High-performance browser tools, zero privacy risks.") is now part of the entity definition, matching the footer.
  • GitHub repo now linked as a verifiable identity anchor.

Same Loft, same tools — search engines and AI assistants will just have a much easier time telling us apart from the Blender plugin in their knowledge graphs.

changed Tighter security and privacy headers across every page

The site now serves stricter security headers across every asset. This work hardens cross-origin policies so that browser-side workers (the WASM engines that power video, PDF, and OCR tools) can't be silently blocked or hijacked.

What changed:

  • Comprehensive cross-origin policies on every script, worker, image, font, and brand asset — eliminating the silent worker-blocked failure mode that briefly broke video tools.
  • Tighter Content Security Policy: image sources narrowed from a wildcard to specific CDNs, inline event handlers explicitly blocked, OAuth and admin Cloudflare endpoints removed from the public-site policy.
  • SVG output sanitization added to the Barcode Generator tool so generated SVG can be safely embedded elsewhere.
  • Header consistency: every header now lives in exactly one rule, eliminating a class of bug where Cloudflare Pages was merging header values across rules.

These are mostly defense-in-depth changes — the kind of thing that prevents specific bugs you'd never see directly but that matter for everyone.

changed Video tools category — text-tools retired, audio tools culled, SEO trailing-slash fix

Two simultaneous changes: the tool catalog got a focused cut, and a long-standing SEO drag on every URL was fixed.

Catalog cuts

  • Text-tools category retired. The remaining two tools (CSV-to-Table and Extract Emails) were AI-trivial — ChatGPT or Claude does either in seconds without you needing to leave the chat. Every existing /tools/text-tools/* URL now redirects to the homepage.
  • Media-tools renamed to Video Tools. Five audio utilities (Audio Pitch Changer, Audio Speed Changer, Audio Trimmer, Metronome, Tone Generator) were culled — practice utilities better served by dedicated apps. The three survivors all process video: Video Format Converter, Video Compressor, Remove Audio from Video. Each lives at /tools/video-tools/<slug>/ now; the old /tools/media-tools/<slug>/ URLs 301 to the new ones automatically.
  • Cooking — Altitude Baking Calculator removed. Two cooking tools remain: Sourdough Calculator and Canning Calculator.
  • Dev / Image — 8 soft-archived tools fully retired. CSS / HTML / JS Minifiers, Markdown-to-HTML, Image Border Frame, Instagram Grid Splitter, Watermark Image, and Pan Size Converter were already hidden from navigation; their URLs now 301 to the homepage so search engines deindex them.

Net: 15 tools culled, total catalog down to 59 surviving tools — all of which are either file-aware (PDF, image, video, CAD) or formula-precise (cooking math, security).

SEO trailing-slash fix

Every URL on the site is served at /foo/bar/ (Astro's canonical form), but for months the sitemap and canonical tags were emitting the bare /foo/bar form. Bing Webmaster Tools was reporting "URL has redirect" on every single sitemap entry — a quiet crawl-budget bleed that affected ranking. Fixed across the sitemap generator, every canonical <link> tag, and the 24+ rules in _redirects so the bare form 301s straight to the slashed form instead of chaining through two hops.

Video tools — FFmpeg load fix

The Content-Security-Policy was tightened in May to drop unsafe-eval, on the assumption that FFmpeg-wasm used only WebAssembly.instantiate. That turned out to be wrong — FFmpeg's Emscripten glue uses dynamic Function() for codec dispatch on some audio/video paths, and the tighter CSP was throwing a runtime violation the moment you dropped a video. CSP restored to allow unsafe-eval (alongside the existing unsafe-inline, so no meaningful security regression). The three video tools convert again.

Force-refresh the site (Ctrl+Shift+R) if you previously saw the "Compiling or instantiating WebAssembly module violates [...] CSP" error — the PWA service worker caches the old headers.

added Launch-ready legal, contact, and PWA install pages

The legal, contact, and install paths all got production polish before launch day.

Legal & contact:

  • Privacy, terms, cookies, and DMCA pages now name Loft Tools' operator, mailing address, and registered DMCA agent (Service Provider ID DMCA-1072893).
  • 8 new contact channels (legal@, dmca@, abuse@, security@, accessibility@, license@, sponsor@, feedback@) all route to a real inbox via Cloudflare Email Routing.
  • New /contact page organizes everything by intent: 3 quick forms (bug, request, feedback), 2 direct email channels (sponsor, license), and 6 legal channels. Each card shows both the email and a link to the relevant policy.
  • New /.well-known/security.txt per RFC 9116 so security researchers know where to report issues.
  • Footer's Legal column now links the Accessibility statement.
  • Privacy policy now accurately discloses Cloudflare Web Analytics (cookieless) and the live Stripe sponsorship flow.

Bug Report tool — searchable tool picker. The "Which tool?" field on /bug-report had been a native 74-option <select> which was nearly unusable. It's now a typeahead combobox: type to filter, arrow keys to navigate, Enter to pick. "Other / not listed" pinned at the bottom.

PWA Install Guide — full rewrite. The install button is now always visible, not gated by browser sniffing. The guide accordion covers 13 browser × OS combinations (Chrome, Edge, Safari, Brave, Opera, Vivaldi, Samsung Internet, Firefox, Arc/Dia) with literal click-paths cited from each vendor's docs. Honest about which combinations don't support real installation, and offers a one-click fast-path when the browser actually supports it.

Small fix: 6 placeholder strings across the feedback forms were rendering literal "…" text instead of an ellipsis character.

added Sponsorships: hardened payments, public wall, and permanent archive

The sponsor system went through a full audit pass before we accepted live payments. It now handles delayed bank-transfer payment methods (ACH, SEPA, Boleto), survives duplicate webhook deliveries from Stripe, and never demotes an admin-approved name back to pending on a retry.

User-visible additions:

  • New /sponsor/all page — a permanent gratitude archive grouped by year for sponsors who fall outside the active wall. Policy: monthly active sponsors are always shown, monthly cancellations get a 30-day grace period, one-time gifts stay on the wall for 90 days, then move to the archive forever.
  • Network outages no longer look like an empty wall — visitors during a degraded run see a real error instead of being told the wall is permanently empty.
  • Stripe Embedded Checkout opens in-place with focus trapping, escape-to-close, and a working retry button if the network blips during checkout.
  • A weekly reconciliation worker now sweeps Stripe's subscription list and flips any "ghost" active sponsors to inactive — defence against webhook delivery failures.

Behind the scenes: rate limiting on the checkout endpoint stops anyone from burning Stripe's quota with junk requests, and display-name moderation now normalizes Unicode tricks (zero-width characters, combining marks, lookalike letters) before filtering.

fixed Mobile audit: 13 fixes for phones and screen readers

We ran a deep audit of the site on iPhone and Android and shipped a stack of fixes for issues that desktop testing had been hiding.

  • Tool cards are now 2 across on mobile, not 1. Previously the 72-tool catalogue stacked into ~37 viewport heights of scroll — roughly 8× too much. Compact cards now fit 2 per row with the description hidden until you tap through.
  • The homepage search box works on mobile again. It had been silently dead since our recent security overhaul because of a missing initialization hook.
  • iOS Safari no longer zooms when you tap inputs. A site-wide 16 px font-size floor on touch devices kills the automatic zoom that iOS triggers on smaller inputs, which had been disorienting in Compare PDF, QR Code, CSV to JSON, Hash Generator, and the IP Subnet calculator.
  • Editor toolbars no longer clip off the screen. Gerber Viewer's toolbar had been truly unreachable past the right edge; PDF Editor and Compare PDF got a fading right-edge gradient to hint that more buttons scroll into view.
  • Floating search button on long lists. Scroll past the first screen on /tools or any category page and a small search FAB appears in the corner — tap to reopen the search modal without scrolling back up.
  • Skip-to-content links are now consistent across the homepage, category pages, and the My Tools dashboard, fixing a WCAG 2.1 AA gap.
  • The hero search box, which had been a <div> styled as a button, is now a real <button> so screen readers announce it correctly.
changed Cleaner calls-to-action across the site

We stripped ~17 arrow-decorated "Link →" call-to-action buttons that had crept into nearly every section. When every link has the same arrow, the arrow stops meaning anything. Arrows now only appear on the four CTAs that genuinely escape the current section to a broader context: the homepage "What's new" banner, the mega-menu "All categories" link, the footer's latest-changelog link, and the icon-only currency submit button.

Pages that benefit most: /support (was 3 identical arrows in a row), the homepage, the tools index, the docs landing, feature requests, and the explore mega-menu (which had 16 per-category arrows alone).

changed Editor header now opens the explore menu on hover

The shared editor header used by PDF Editor, Compare PDF, and Gerber Viewer got a navigation refresh. The Loft mark in the corner is now a pure home link — click it and you go home, nothing else. The first breadcrumb segment ("Loft") now opens the same Explore menu you see on regular pages, but anchored under the trigger as a left-slide drawer so the cursor doesn't have to cross the screen. On mobile, a hamburger button replaces the hover trigger and opens the same drawer with a touch-friendly scrim.

A small detail: navigating between regular pages and editor pages now smoothly morphs the "Explore" button text into "Loft" and back, so the menu trigger feels like the same element across layouts.

fixed Glass card surface restored on tool pages, "Upload" removed from copy

Tool workspaces now have a proper glass-card surface again — translucent background, backdrop blur, cyan rim, and a soft shadow ladder. The previous flat fill made cards disappear into the page. Light mode gets a matching white-glass surface with slate hairline borders. The card is now driven from a single set of theme tokens so palette tweaks propagate without per-component edits.

The word "Upload" was removed from user-facing strings across 32+ tools. Files never leave your device — calling step 1 "Upload PDF" was actively misleading. The trust pill now reads "Local compute" instead of just "Local" so it's clear what stays local (the compute itself, not a file pointer). Button labels like "Upload PNG / SVG / JPG" became "Choose PNG / SVG / JPG", and YAML step names switched from "Upload" verbs to "Select", "Open", or "Pick" depending on context. Internal state strings and explicit no-upload claims ("Your file is never uploaded") were intentionally preserved.

changed Brand v2 — cyan-first palette, Space Grotesk wordmark, light mode

The visual brand pivoted from violet-primary to cyan-primary with a new wordmark and a working light mode toggle.

  • Cyan is the brand color now. The full ramp 50–900, borders, glows, and status dots all rebound to cyan. Violet survives only as a deliberate accent on one hero word via the rainbow gradient.
  • New mark and wordmark. A cyan-gradient rounded square with a cavity and white dot replaces the 3D isometric "L". The wordmark is Space Grotesk SemiBold, lowercase "loft". New primitives — LoftMark, LoftWordmark, LoftLockup, and StatusDot — are available across the site.
  • Theme-adaptive favicon. The favicon now swaps body and dot colors based on the browser tab's color scheme. The tab icon also reflects tool state — working (animated), ready, or error — so you can see at a glance whether a long-running task finished while you're on another tab.
  • Light mode toggle. A sun/moon button in the navbar flips the whole site between dark and light. The choice persists across sessions and survives SPA navigation between pages. The pre-paint inline script means there's no white-flash when loading on a dark-mode preference.
  • Polished light surfaces. Shadow tokens, glows, hero halos, glass cards, button shadows, and the featured-tool landing pages were tuned per theme so dark mode keeps its cyan bloom while light mode uses slate ground shadows with thin cyan rims. Particle dots are ink on light, white on dark, and flip live when you toggle. Toast, explore mega-menu, footer mark, editor header mark, and category facet sticky bar all flip cleanly.

A handful of follow-ups closed remaining light-mode leaks: hardcoded white text that was invisible on light backgrounds, the manifest 404 in dev, the explore dropdown's gold halo that read as warm cast on white, and the theme toggle icon (which now shows the destination state — sun on dark, moon on light — instead of the current state).

changed Pre-launch polish — featured tool pages, homepage, sponsor

A run of visual polish ahead of public launch. The featured tool pages now have a real product-page treatment, the homepage stops shouting in amber, and the sponsor page is honest about what your money goes to.

Featured tool pages

/featured/pdf-editor, /featured/compare-pdf, and /featured/gerber-viewer got a top-to-bottom rebuild.

  • Display headline — value-prop framing per tool ("Edit PDFs without Adobe", "Diff PDFs without Acrobat", "View PCBs without CAM350") with the brand gradient on the pivot word. PDF Editor breaks the headline onto two lines so "Adobe" lands on its own.
  • Hero badge — small glowing pill above the headline names the category in one phrase.
  • Hero screenshot — single floating frame, no fake browser chrome, with a violet/cyan glow puddle below it. Trust strip overlaps the puddle so the colour leaks behind it.
  • Trust strip — four short value statements under the screenshot, each strictly one line of title and one line of subtitle. No more wrapping.
  • Comparison table — rows are now grouped (Pricing, Core, Privacy, Trade-offs) with the Loft column highlighted. Trade-offs are surfaced explicitly instead of buried.
  • Tightened spacing — top of every featured page gives back ~50 px of dead space; the "Built for" chip strip is gone (audience tags now live in the meta description and table copy).

Homepage

  • No more amber — the Featured cards' gold price chip and the per-card "★ Featured" badge are gone. Launch buttons use the brand violet→cyan gradient.
  • What's new lozenge — a small chip under the hero links to the latest changelog entry so people who land on the homepage know something just shipped.
  • Featured row — ID Photo Maker dropped (didn't fit the "what people pay for" framing). Three Featured cards: PDF Editor, Compare PDF, Gerber Viewer.

Sponsor page

/sponsor rewritten end-to-end. One Stripe checkout, plain language about what sponsorship covers, no breakdown-of-my-AI-bill drama, no inflated ROI math.

Public-page chrome

PublicPageLayout (used by /featured, /changelog, /roadmap, /feature-requests) tightened: 60 px top padding → 24 px, back-link bottom margin 24 px → 14 px. Cuts roughly 45 px of dead space above the title on every page that uses the layout.

added Sponsor Loft Tools via Stripe — one-time, monthly, or custom

The /sponsor page has a new Stripe-powered checkout so anyone who wants to help keep the lights on can do it in a few clicks. Three options:

  • $5 one-time — quick tip.
  • $15 per month — recurring support.
  • Custom amount with an inline one-time / monthly toggle.

Sponsors can optionally display a name on the public sponsor wall (or stay anonymous) via opt-in fields during checkout. A live wall on the page shows current sponsors as soon as the first payment lands. Cancellations are self-serve through Stripe's customer portal at any time.

A redesigned 7-entry FAQ explains the flow, including the honest framing that sponsorship is not tax-deductible. Successful payments land on a new /sponsor/thanks confirmation page.

changed Editor splash polish + new legal pages + SEO copy pass

A round of polish across the editor splash template and a top-to-bottom voice cleanup of tool descriptions and FAQs. Plus a proper legal section.

Editor splash

The empty-state splash (PDF Editor, Gerber Viewer, every future Tier-1 tool) used to render content floating on the editor's dark canvas with two soft radial glows bleeding into the page bg, while the inner drop card carried a hard dashed rectangle. Two visual languages on the same surface — read as bot-generated.

  • Card chrome added — bordered surface with surface-elevated background, 16 px radius, top-edge highlight line. Matches every other card on the site (roadmap, tool grids, featured cards).
  • Asymmetric glow contained — moved to a ::before pseudo-element inside the card, so border-radius + overflow: hidden keep the gradient from spilling.
  • Loading + error are first-class slots now — splash content swaps in place during parse (spinner replaces icon, status replaces label, optional progress bar where the CTA sits) instead of floating a separate spinner outside the card. Industry pattern from Adobe Acrobat web, Smallpdf, iLovePDF, Sejda. Every tool that uses the splash inherits the behaviour.
  • PDF Editor splash — format chip row trimmed from .pdf · .jpg · .png · .heic to just .pdf. Image upload still works for image-to-PDF, but advertising four file types on a "PDF editor" splash made it read as a multi-format converter.

Gerber Viewer panes

The three-column shape (rail · canvas · inspector) now stays stable across empty / loading / loaded states. Was: rails were gated behind doc && so the empty state showed only a centered splash with nothing on either side, and the layout reorganised the moment a file landed.

Each panel handles its own no-document hint: No board loaded · Drop an archive or use ⌘O in the rail, plus a panel-specific message in every right-pane section (Board, Layer details, Apertures, Drill, DRC, Netlist, Inspect, Measure, PnP, Test, History).

Legal section

/legal/* is now a proper section: terms, privacy, cookies, accessibility, acceptable use, disclaimer, DMCA, plus a small index page that links them all. Each one is plain-language, no walls of boilerplate.

Voice + SEO cleanup

A pass over 60+ tool YAML specs and the doc surfaces that read from them:

  • Tool descriptions and FAQs trimmed of bot-isms and AI-slop hedges. Where two tools described the same step in three different sentences, they now use one.
  • D02-brand and D06-seo decisions updated with the resulting voice rules.
  • .kb/seo/standards.md + voice-guide.md added so future descriptions stay consistent.
  • llms.txt synced with the new copy.
  • Two scripts/_archive/ rewriters (rewrite-duplicate-faqs.mjs, rewrite-howto-step-duplicates.mjs) that did the mechanical work, archived for future use.

Audit notes

The redesign work this round leaned on by the team is in audit-2026-05-05/ — five audit reports covering ship-readiness, featured-tool polish, support, tools-landing, AI-slop catalog, and the sponsor redesign mockup. Internal docs, not user-facing, but they shape the next few weeks of work.

changed Security: dependency vulnerability sweep

Vulnerability count dropped from 26 to 17. Forced upgrades on transitive dependencies that were stuck on outdated versions: yaml (cleared a stack-overflow CVE from a deep dependency chain), uuid (cleared a bounds-check CVE), elliptic (pinned to latest for when the upstream patch lands).

The remaining 17 findings are all documented as either having no patched upstream version yet, requiring a breaking framework downgrade to clear, or being dev/server-only and not reachable from the user bundle. Documenting them keeps the audit reviewable instead of a wall of unactionable noise.

changed Chrome polish — smoother everything

A round of polish across the whole site shell. Nothing functional changed; everything just feels less rough.

  • Particle background rewrote: density now scales with viewport area instead of jumping at breakpoints, particles softly fade at viewport edges, the constellation slowly drifts between cyan and violet, mouse cursor parts the field, click bursts a small impulse, and the canvas dims as you scroll past the hero so it stops competing with content. A real bug also fixed where resizing the window progressively blurred the canvas.
  • Hide-on-scroll header: scroll down past the hero and the header slides up to reveal more content; scroll back up and it returns. Pauses while a drawer or menu is open.
  • Press ? anywhere to open a keyboard-shortcut cheatsheet. Esc closes. Same place every page.
  • FAQ accordions now glide open/close instead of snapping. Same animation as the mobile drawer category accordions.
  • Hamburger button vertically aligned with the brand glyph (was 8 px off on mobile). Drops the heavy bg + border so the visual weight matches.
  • Mobile drawer scrim click reliably closes the menu now (previously broke on pages with their own animations).
  • Modal focus trapped: keyboard focus stays inside SearchModal and InstallGuideModal, returns to its previous spot on close.
  • Scrollbar styled to match the dark theme (was the pale OS-default grey).
  • Focus rings unified to cyan accent across every focusable element.
  • Page transitions: nav / footer / particle canvas no longer re-render on every page hop. Particle animation keeps its state.
  • Copy buttons show a toast confirming the clipboard write (and a friendlier error if the browser blocks clipboard).
  • Tighter breadcrumb spacing under the sticky header on tool pages.
changed Removed stale "600+ tools" copy across the site

Swept the last "600+ tool factory" framing out of user-facing surfaces after the vision pivot. The dynamic tool count now comes from the actual catalogue.

  • Search modal placeholder: "Search 600+ tools..." → "Search tools..."
  • Docs intro now reads the live count from the catalogue instead of a hard-coded "384+".
  • Two dev-tool sample fixtures (HTML minifier, Markdown to HTML) rewritten with neutral content.
  • Roadmap translation phase rescoped to the surviving moat catalogue in Spanish and Portuguese first.
changed Taxonomy cleanup — 8 categories, retired placeholders

Finished tidying the catalogue after last week's vision pivot. The site is now organised into 7 live tool categories plus 1 placeholder — every category page lists tools that actually exist.

  • Dropped two placeholder categories (AI Tools, Compare Tools). Their tools moved into live homes: Whisper transcribe joined Media Tools, JSON diff joined Dev Tools, image diff joined Image Tools, and Compare PDF was already in PDF Tools.
  • Renamed Specialty Viewers to Open Anything — clearer about what's coming next.
  • Final taxonomy: PDF, Image, Dev, Text, Media, Cooking, Security, and Open Anything.
  • Five audience landing pages that pointed at culled tools (Home DIY, Makers, Family Life, Trades, Side Hustle) are gone; Kitchen and Musicians stay and gained relevant tools.
  • Old category URLs now redirect cleanly so any bookmarked links keep working.
changed Stripe-style mega menu, mobile drawer overhaul, Pro→Featured

Refactored the entire site navigation. The Explore mega menu and the mobile hamburger drawer were rewritten from the ground up; "Pro" is now called "Featured" everywhere.

  • Stripe-style mega menu — desktop Explore now opens a centered floating panel with a backdrop scrim that dims the rest of the page. Single body-level instance instead of one inside each header state, so cursor can cross the gap from button to panel without flicker.
  • Mobile drawer redesign — hamburger sits at body level on top of the drawer; same button toggles open/close (icon swaps between bars and ×), no separate close affordance. Tap-outside-to-close via scrim works reliably now (drawer + scrim escaped the sticky-header stacking context).
  • Drawer content cleanup — pin icon dropped from "My Tools"; pink heart added to mobile Support; mobile font sizes dropped to match category style instead of standing out; categories with 0 tools no longer appear.
  • /pro → /featured — the entire showcase section moved to /featured; old URLs redirect automatically.

No tools changed behavior; this is purely chrome.

added Install Loft as an app — plus a diagnostics page when things go sideways

Loft can now be installed as a real app on Chrome, Edge, Opera, Brave, iOS Safari, and macOS Safari 17+ — with an honest guide for each one and a diagnostics page users can share with us when install doesn't behave. This release closes the loop with the offline dashboard: installing usually flips your pins from "best effort" to "protected from auto-eviction" in a single tap.

What's new

  • Install button in the header — shows on every page, adapts to your browser:

    • Chrome, Edge, Opera, Brave → triggers the browser's native install dialog.
    • iPhone / iPad Safari → opens a modal walking you through Share → Add to Home Screen.
    • macOS Safari 17+ → opens a modal walking you through File → Add to Dock.
    • Firefox → hidden. Firefox removed PWA install in 2021 and we don't fake it.
    • Already installed or recently dismissed → hidden. If you skipped the prompt, we wait 14 days before asking again.
  • "How install works" guide at /docs/pwa-install — straight answer to "why does install look different on my phone vs my laptop?" with per-platform steps and honest caveats about which browsers do and don't support it.

  • Diagnostics page at /help/pwa-diagnostics — a live health check. If install isn't working for you, visit the page and click Copy report (markdown). Paste that output into a bug report at /bug-report and we'll almost always know what's going on within minutes. The report includes your platform, whether the install prompt has fired, service worker state, manifest fetch, storage quota, and more — all signals that matter for triage, none that identify you.

Offline dashboard got smarter about install

The "How offline mode works" panel on /my-tools now reacts to your install state:

  • Running as an installed app → shows "Running as an installed app — your pins are fully protected from auto-eviction."
  • Browser supports persistence but declined it → the existing Request persistence button now sits next to an Install app button, because installing is the most reliable way to get persistence granted on Chrome.
  • Safari on iPhone / iPad / macOS → Safari doesn't expose a persistence API at all, so the panel now says so plainly and offers the install guide as the real fix.

Performance

Two small tweaks to first-paint: added a preconnect for the Phosphor Icons CDN (icons appear ~200-400ms sooner on cold connections) and bumped the Apple home-screen icon from 192px to 512px for sharper rendering on retina devices.

What's still honest about install

PWA install is the least-standardized thing on the modern web. We did our best to make the button mean the same thing everywhere, but the reality is that Apple and Mozilla ship different capabilities, and Chrome holds back its install prompt until it decides you've engaged enough with the site. If install doesn't look or work the way you expect, the diagnostics page is the fastest path to an answer — from us or from you figuring it out yourself.

added Feedback forms, voting, and the surface around the tools

The product was ready; the surface around it wasn't. This shipment puts everything in place for a real public launch: legal pages you can read, real support forms you can fill out, and a way to vote on what gets built next.

Real support and feedback forms

Three forms now live, each with its own page and its own labeled GitHub issue under the hood:

  • /bug-report — pick the tool, describe what happened, what you expected, your browser and OS. Submissions land as a labeled bug issue in our private tracker.
  • /request-a-tool — name a tool you want, describe what it should do, point at similar tools you've used. The roadmap is shaped largely by what people ask for.
  • /feedback — open-ended. Comments, ideas, hellos.
  • /support — landing page that points you at whichever of the three you need.

Submissions go through Cloudflare Turnstile (invisible bot check) and are written to a private GitHub issue tracker, never to a third-party form service. No account needed to submit.

Vote on feature requests

The /feature-requests page is now interactive. Click the upvote button on any feature you want and the count updates immediately. The page is grouped by status so you can see what's accepted, planned, under review, proposed, or declined at a glance.

How votes stay private: the server stores a one-way hash of your IP plus the feature ID. The hash can't be reversed to identify you and can't be linked across features. Same person, same feature → silently no-op. No accounts, no cookies, no tracking pixel.

Pages you'd expect a real product to have

  • /about — the story behind Loft Tools, what makes it different, who built it.
  • /privacy — what we collect (very little) and what we don't (almost everything).
  • /terms — minimum-viable terms of service in plain language.
  • /cookies — explicit "no tracking cookies" statement plus what is stored locally on your device.
  • /404 and /500 — branded error pages that suggest a tool to try or let you report the issue.

Polished site chrome

  • Footer rebuilt: brand block on the left with a live "system live" status pill and "What's new" teaser pulling from the latest changelog entry; a three-column nav on the right (Product, Support, Legal); single centered credit line.
  • Navbar content rail now matches the footer width — same left and right edges top to bottom on every page.
  • Roadmap restructured to a "Now / Next / Considering" bucket layout that won't go stale.
  • Homepage particle effect slowed to a quarter of its original speed for a calmer first impression.

Everything still runs locally in your browser. The forms and voting are the only things that talk to a server, and even those don't store anything that identifies you.

added My Tools dashboard, offline explained, and a browse UX overhaul

The offline dashboard shipped a few weeks ago but was hidden — you had to know the /my-tools URL existed. It's now a first-class surface with a permanent home in the header, a plain-English guide to how offline actually works, and per-tool freshness indicators. The category browse experience got an overhaul at the same time: the mega menu now previews tools on hover, and the filter pane moved out of the sidebar so tool cards use the full page width.

My Tools is always one click away

A new My Tools link lives in the main nav on every page — between Pro and Docs on desktop, second in the mobile drawer. It carries a live count pill showing how many tools you've pinned for offline. Click it to land on your dashboard.

The count updates in real time as you pin or unpin anywhere on the site, and stays in sync across multiple tabs open on Loft.

Offline mode, explained

Your dashboard now opens with an About offline mode panel that answers the questions people actually ask:

  • What gets saved? The tool's page and JavaScript assets. Your files and inputs are never uploaded — they stay in your browser, same as always.
  • Where does it live? In your browser's storage for this site. It never leaves your device.
  • What can remove it? Clearing site data, using a different browser or device, long inactivity, or clicking Unpin.
  • Keeping things fresh: each card shows when it was last cached. If a tool looks outdated, a Refresh cache button re-downloads the latest version.

The panel also includes a live storage meter (how much of your quota we're using), a persistence chip (green if your browser has granted persistent storage; a button to request it if not), and a Clear offline cache action that removes all cached assets in one click when you want to start fresh.

Per-card freshness at a glance

Every pinned tool card now shows one of three states:

  • Available offline · Cached 2 hours ago — green check, the tool and its assets are ready to use offline.
  • Cached, may be stale — amber refresh icon, the cache is older than 30 days; click Refresh for the latest version.
  • Pinned, not yet cached — muted cloud icon, you pinned it but the assets didn't finish downloading; click Refresh to retry.

First-time users get a real welcome

If you've never pinned a tool, the dashboard now shows a 3-step explainer — Find a tool → Save offline → Use anywhere — with the full offline guide expanded underneath. No more landing on "No tools pinned yet" with no idea what to do next.

Browse with preview

The Explore menu in the header used to be a 16-cell grid where clicking was the only way to see a category's tools. Now it's a two-pane layout: a list of all 16 categories on the left, and on the right a live preview of the top tools in whichever category your cursor is on — with a "View all X tools" link to the full listing.

Hover PDF → see Compare PDF, Merge PDF, Sign PDF, and the rest. Hover Finance → see Mortgage Calculator, Loan EMI, Retirement Planner. No page load, no commitment.

Category pages breathe

The filter pane used to sit as a 240px sidebar next to the tool grid, squeezing cards into a narrow lane. It's now a full-width horizontal bar above the grid: search input always visible, type/tag filters tucked behind a Filters button that shows a count pill when you've got any applied, and Pro-only as a dedicated chip.

Tool cards now use the full page width — noticeably bigger, easier to scan, better use of your screen.

Pro showcase polish

  • Comparison tables (e.g. Compare PDF vs. paid alternatives) now keep the feature name column sticky when scrolling horizontally on mobile.
  • The stats row on each Pro showcase page got gold-tinted cards with subtle borders — the "Free forever", "No uploads", "Same outputs" numbers now read as emphasized claims rather than floating text.

Shared design vocabulary

Under the hood, hero eyebrows, audience chips, FAQ accordions, and filter chips were consolidated into shared components — so pages across Loft look and feel like one product, and future pages inherit the polish by default.

Infrastructure 2
changed Faster admin-facing routes via smarter geographic placement

Admin and API routes now run in the same region as their data, eliminating round-trip latency on every authenticated request. This benefits maintenance and tooling workflows, not directly user-visible.

changed Production launch: 100/100 security score and faster heavy assets

Two big platform changes landed for the production launch.

Heavy WASM and AI model assets now load from our CDN. Cloudflare's 25 MB per-file deploy cap was blocking the bundle (FFmpeg core is 30 MB, the AI runtime is 26 MB). Those plus PaddleOCR models now ship via cdn.lofttools.com, freeing the main bundle while keeping everything browser-side. Tessdata language packs and ONNX models stream on first use.

Mozilla Observatory now scores us at A+ (120/100). We cut inline-script permission from our content security policy, which previously held us at B+. Every inline script and style now ships with a cryptographic hash, so the browser will refuse to run anything we didn't author. Page transitions are temporarily full-reload as a result — we'll bring smoother transitions back via native View Transitions in a follow-up.

A side effect: violation reports now go to a real endpoint instead of silently 404ing, so we'll actually see anything that goes wrong.

General 7
removed 12 more low-fit tools culled in the catalog cleanup

Another round of focused cleanup retired 12 tools that fell outside our file-precision and privacy-sensitive moat. Each was either fully covered by a chat assistant in a couple of prompts, or a niche photo feature that didn't justify a standalone page.

What was removed:

  • Photo niches folded into broader tools: Baby Passport Photo and Passport Photo Maker now redirect to the existing ID Photo Maker, which covers the core passport / ID use case. SVG-to-PNG redirects to the general Image Format Converter.
  • Standalone photo utilities that didn't warrant their own pages: Image-to-Favicon, Photo Collage Maker, Photo Date Stamp.
  • Dev formatters and generators that any chat assistant can produce in a single prompt: SQL Formatter, XML Formatter, Timestamp Converter, robots.txt Generator, sitemap Generator, .htaccess Generator.

All 12 retired URLs return clean redirects (24 in total covering bare and trailing-slash variants) — old bookmarks land on the surviving cousin or the category page. SEO equity is preserved.

removed 15 tools culled, text-tools retired, media-tools renamed to video-tools

A focused catalog cull dropped 15 tools and reshaped two categories. The site now ships 65 carefully chosen tools instead of a long tail of AI-trivial utilities.

What was removed:

  • Text utilities that any chat assistant can do in two lines: CSV-to-table and email extractor. The text-tools category itself was retired since these were its last two tools.
  • Audio practice tools: pitch changer, speed changer, trimmer, metronome, and tone generator. These didn't fit the file-aware, formula-precision focus.
  • Minifiers and conversion utilities that AI handles inline: CSS / HTML / JS minifiers and a Markdown-to-HTML converter.
  • Image extras that overlapped poorly with the core image set: border / frame, Instagram grid splitter, watermark image.
  • Cooking outliers: altitude-baking and pan-size converter.

What got renamed:

  • media-tools is now video-tools, with three survivors: Video Compressor, Video Format Converter, and Remove Audio from Video. The audio practice tools that had lived in this category were removed in the same pass.

All retired URLs redirect to homepage or the relevant category page so you'll never hit a 404 from an old bookmark. Categories are now: pdf-tools (33), image-tools (15), dev-tools (10), video-tools (2 after a later cull), cooking-tools (2), security-tools (2), and open-tools.

removed Pre-launch tool cull: focused catalogue of 72 tools

Ahead of the public launch we did a sweep against our quality-first philosophy and removed 13 tools that didn't earn their slot. The catalogue dropped from 85 visible tools to 72, with the lineup now sharper and harder to replicate.

Hard-removed (redirected to the closest replacement):

  • QR Code Reader — every phone camera reads QR codes natively now
  • Text to Slug, HTML Entity Encoder, URL Encoder/Decoder, Strip HTML — five-second tasks an AI assistant or DevTools console solves instantly
  • Resize Image and Resize All Platforms — absorbed into the more capable Image Resizer

Soft-archived (URLs still serve, hidden from navigation): Markdown to HTML, Pan Size Converter, CSS/HTML/JS Minifier, Image Border Frame.

Image Resizer absorbed the singletons — it now handles single images, bulk resizing, and social-media presets in one tool with a cleaner description and dropzone copy.

changed Pivot follow-up — 8 categories, dropped placeholders, audience trim

Tightened the post-pivot taxonomy. The placeholder categories ai-tools and compare-tools are gone — those tools belong inside live categories instead (Whisper-style transcription lands in Media, json-diff and csv-diff land in Dev, image-diff in Image, and compare-pdf already lives in PDF). The specialty-viewers category was renamed to Open Anything (/tools/open-tools) for clearer brand framing — same DWG / DICOM / IFC / STEP / Visio reader family, sharper name. Old /tools/specialty-viewers/* URLs 301 to the new path automatically.

The final live taxonomy is 8 categories: PDF, Image, Dev, Text, Media, Cooking, Security, plus Open Anything (placeholder until the first viewer ships).

Audience pages were also trimmed. Five audiences (/for/home-diy, /for/makers, /for/family-life, /for/trades, /for/side-hustle) pointed at construction / craft / finance / everyday tools that all went away in last week's cull, so those pages now return 410 Gone. Kitchen and Musicians survived intact and still curate their tool lists.

  • Renamed specialty-viewersopen-tools ("Open Anything") with full 301 redirect coverage
  • Dropped ai-tools and compare-tools placeholder categories — folded into existing live cats
  • Pruned 5 audience pages whose entire tool list was culled in the 2026-05-02 pass
  • Added a roadmap entry tracking the Open Anything viewer family
changed Vision pivot — focused tool set

The site dropped 6 categories' worth of single-function calculators and shifted toward tools that compete with paid software, specialty file viewers, and local-AI utilities. About half the tool count is gone. The remaining tools are the ones that actually earn their URL.

  • Removed categories: Construction & Home, Crafts & Hobbies, Everyday Life, Finance & Business, Gardening & Pets, Auto & Vehicle. ~85 commodity calculators retired. Old tool URLs return 410 Gone; old category indexes redirect home.
  • New placeholder categories: Local AI Tools (Whisper transcription, on-device LLM, on-device translate), Specialty File Viewers (DWG / DICOM / IFC / STEP / Visio), Compare & Diff (image-diff, json-diff, csv-diff). Empty for now — first tools coming over the next weeks. The category page tells you when to expect them instead of pretending they exist.
  • Surviving categories keep their full tool set: PDF & Documents, Image Tools, Dev Tools, Text & Writing, Video & Audio, Cooking & Kitchen, Security & Privacy.
  • Why: a 600-tool farm of single-function calculators is what AI assistants replace in a chat. The new direction is tools where local compute is the differentiator — file binaries you can't easily process in a chat, parsers behind paid software, and AI utilities that should never send your data to a cloud API.

The pivot trims what we ship, not the privacy guarantee. Everything still runs in your browser; nothing uploads.

changed Strategic pivot — sharper tools, fewer commodities

Loft Tools just shipped its biggest portfolio reshape since launch. After a brutal-honest competitive audit of every category against AI assistants, mobile OS apps (iOS Photos, CapCut), and entrenched single-purpose incumbents (calculator.net, regex101.com, jwt.io, wheelofnames.com), 64 commodity tools were retired and 19 more soft-archived. Three new categories were created to anchor the new positioning.

What changed:

  • 45 commodity tools archived — finance commodities (tip / percentage / discount / business-card / invoice variants), image AI-adjacent tools (cert / id / meme / collage), text duplicates (base64 / lorem / word-counter), dev brand-incumbent shadows (regex / json / jwt / cron / coolors / diff), and small-batch removals across construction / craft / converter / pdf / cooking. Each lost to a single-purpose competitor or a Google SERP widget that answers in 0.5 seconds.

  • 19 tools soft-archived — entire Garden category (lost to Almanac.com's zip-code data backbone), Cooking category (small, redistributed via /for/kitchen audience), and 5 Everyday tools (coin / dice / RNG / lottery / wheel — Google ships interactive widgets for all of them). Soft-archived means components stay shipped, URLs still work, audience pages can surface them — they just leave primary nav. Reversible.

  • 6 tools recategorized — converter-tools survivors moved to natural homes: knit/crochet/yarn → crafts, lumber-dimensions + wire-gauge → construction, pan-size → cooking. URL redirects preserve SEO.

  • 3 new categories createdSpecialty File Viewers for opening DWG / DICOM / IFC / Visio / SPSS files corporate software locks behind $300-30K/yr subscriptions; Phone ↔ Laptop Bridge for HEIC / MOV / video-compress-to-Discord cross-device pain; Privacy Strip for face blur / EXIF strip / PDF metadata strip / password gen. All three categories are placeholder folders with READMEs — first viewers ship in following weeks.

New positioning: Free tools your phone won't, your laptop won't ship, and corporate software wants $300/year for. Two moats both immune to AI commoditization and OS feature creep — gatekept proprietary file formats, and tasks too small to justify installing an app for.

Tool count: 250 → 186 visible (with 19 more soft-archived for revival if needed). Density of high-moat tools rises significantly.

added April 2 — 14 new tools and a real audio/video editor

The biggest single-day shipment to date. Seven new local-compute tools, plus a major upgrade pass that turned the audio and video tools into something you can actually edit in.

New tools

  • Diff Checker (dev) — code/text diff with split + unified views, five diff modes (line, word, character, trimmed, sentence), regex-powered filters for ignoring timestamps, version strings, imports, comments, or whitespace-only lines. Keyboard navigation between changes, collapsible unchanged sections.
  • Image to PDF (pdf) — multi-image to PDF with drag-to-reorder, per-image rotation, configurable page size and margins, grid layout (1/2/4/6/9 images per page), and a live PDF preview as you arrange.
  • PDF to Images (image) — convert PDF pages to JPG, PNG, or WebP at any DPI from 72 to 600. Visual page picker, range input, optional grayscale, ZIP download for multiple pages, and per-page file size estimation before you click convert.
  • Extract PDF Images (pdf) — pull out every embedded image from a PDF with auto-detection. Filter by minimum size, deduplicate identical images across pages, see which page each image came from, download individually or as a ZIP.
  • Bulk Image Resize (image) — resize many images at once with six modes (exact dimensions, by width, by height, by percentage, longest edge, or social media preset). 15 built-in presets for Instagram, Facebook, Twitter, YouTube, LinkedIn, TikTok, Pinterest, Discord, and Twitch. Per-image target dimension preview, ZIP download.
  • Screenshot Stitcher (image) — combine multiple screenshots into one tall or wide image. Smart overlap detection automatically trims duplicate status bars and navigation chrome between consecutive captures, so a stitched scroll capture looks seamless.
  • PDF Grayscale (pdf) — convert color PDFs to grayscale with three modes (standard, high-contrast S-curve, print-optimized gamma). Includes an ink cost estimator showing how much CMYK coverage you save and the rough dollar value per page.

Audio and video tools — interactive editing

The seven existing FFmpeg-powered media tools all got a major upgrade. The audio tools now show an interactive waveform you can drag handles on to set trim points; the video tools picked up frame-by-frame keyboard navigation, output format and codec controls, and platform-aware presets.

  • Audio Trimmer: interactive waveform with drag handles, set-to-current playback buttons, keyboard shortcuts (Space, arrow keys for 1s/5s seek)
  • Audio Speed Changer: waveform display, automatic BPM detection, smart presets (half tempo, double tempo, match a target BPM), output duration estimate
  • Audio Pitch Changer: waveform display, circular 12-note ring picker, fine-tune slider (±50 cents)
  • Video to Audio: waveform with trim handles to extract just a section, optional fade in/out
  • Ringtone Maker: waveform with trim handles, tone type selector (Ringtone / Notification / Alarm with platform-specific max durations), step-by-step install guide for iPhone (Finder or GarageBand) and Android
  • Video Trimmer: frame-by-frame keyboard navigation (arrow keys = 1/30s, Shift+arrow = 1s), Space to play/pause
  • Video Format Converter: FPS control (24/30/60), platform compliance checklist for YouTube, Instagram, TikTok, Discord, WhatsApp, and email presets
  • Video to GIF: color count selector (64/128/256), dither toggle, estimated file size before you convert
  • Audio Converter: now batch-processes up to 20 files at once with individual progress and a ZIP download for the whole set

Everything still runs 100% in your browser. Your media files never get uploaded.

General 1
added Chart Overlay Studio — draw price-accurate TA on any chart image

First tool in the relaunched Finance category. Paste a screenshot of any chart — from a broker app, a paywalled terminal, or a message — calibrate its price axis once, and draw professional technical-analysis tools right on top. No incumbent lets you draw on a chart you don't own; this one runs entirely in your browser, so the image never leaves your device.

Bring your own chart

  • Paste, drop, or open any chart image. Paste works the way it does in every AI dropbox — Win+Shift+S then Ctrl+V drops a screenshot straight onto the canvas, no saving the file first.
  • PNG, JPG, WebP, AVIF, GIF, BMP — anything your browser can decode. Screenshots from the Snipping Tool, broker apps, and phones all work.
  • Pan and zoom the image — scroll to zoom to the cursor, hold Space (or the Pan tool) to drag.

Detect and trace automatically

  • One click reads the whole chart. Auto-detect finds the plot area, traces the price series, and reads the axis — then drops Fibonacci levels, a trend line, and support/resistance for you to refine.
  • Line, candlestick, and OHLC bar charts are all reconstructed from the image. Candles rebuild open/high/low/close from the red/green bodies; bar charts are read from their tick stems.
  • Any colour, any background. Detection works in grayscale contrast — the same approach behind Compare PDF — so a green area line, a blue monochrome candle, or a dark line on white all trace the same, on light or dark themes.
  • Magnet snap pulls your cursor onto the nearest line while drawing, so points land exactly on the data.

Calibrate the price axis

  • Two-point calibration: click two points whose prices you know, type each value, and every drawing on the chart reports true prices.
  • Auto-snap (OCR): reads the price-axis labels for you with the built-in PaddleOCR engine and pre-fills the calibration — runs entirely on your device, loaded only when you ask for it.
  • Linear or logarithmic price scales, detected automatically by Auto-snap and switchable by hand.

Draw the tools that matter

  • Fibonacci retracements and extensions, with each level labelled at its real price.
  • Trend lines, rays, and parallel channels.
  • Andrew's pitchfork from three pivots.
  • Support/resistance zones and horizontal price lines with live price labels.
  • Text notes. Every drawing is selectable, draggable by its handles, and editable — color, width, dashed — from the inspector.

Read the numbers behind the line

  • Quant readout on the traced series: returns, volatility, and maximum drawdown computed straight from the points the tool reconstructed.
  • Regime and structure: a trend-vs-mean-reverting estimate plus automatic jump and change-point markers on the chart.
  • Monte Carlo cone projects a band of plausible forward paths from the traced volatility, with the odds of touching a level you pick.
  • KDE support/resistance surfaces the price zones the series clustered around. It's descriptive analysis of the pixels you traced — not financial advice.

Save your work

  • Export the annotated chart as a PNG, with or without the underlying image.
  • Save and reload a project as JSON to keep editing later.

Lives at /tools/finance-tools/chart-overlay-studio. Everything — image decode, calibration, OCR, and export — runs locally; nothing is uploaded.

General 3
added PCAP Analyzer — deeper dissection engine

Rebuilt the packet dissection engine around a single-pass framework so the detail tree, packet list, and display filter all read from one clean-room traversal — and added eight more protocols on top of it.

  • New protocols dissected: 802.1Q VLAN + QinQ, SCTP, GRE, IGMP, IPsec ESP & AH, VRRP, and IP-in-IP / 6in4 tunnels — click a packet to see the full field tree
  • First-class everywhere: the new protocols are labeled in the packet list, filterable by name (sctp, gre, …), and grouped in conversations + the protocol hierarchy — not just the detail tree
  • Honest about encryption: ESP and AH surface their clear-text header fields (SPI, sequence) and never pretend to decode the encrypted payload
  • Tunnel-aware: GRE, IP-in-IP, and VLAN recurse into the encapsulated protocol, so a tunnelled packet shows every layer
  • Single-pass spine: link → network → transport → application dissection runs once per packet, replacing five separate parse passes — every new protocol now lands in one place
  • Cleaner foundations: bounds-safe parsing on truncated frames, correct payload bounds on padded Ethernet frames, and content-sniffed TLS/HTTP that win over a port label

Every capture is still parsed entirely in your browser by a Rust → WebAssembly engine — nothing is uploaded.

added Serial Console — talk to hardware from your browser

A privacy-first serial terminal that runs in the browser: plug in a USB-serial or console cable and configure a switch, router, firewall, or embedded board — no PuTTY, no minicom, no driver install, and nothing ever leaves your device. It's the cable-in-your-hand companion to a KVM: first-config of out-of-box gear, embedded/maker boards, and recovery when the network is down.

  • Two transports, zero server: native Web Serial on desktop Chrome/Edge/Opera, and WebUSB on Android Chrome driven by built-in CH340/CH341, CP210x, FTDI, and PL2303 chipset drivers — so an Android phone with a USB-C console cable can configure a switch from the browser
  • Split panes + broadcast: open up to four devices side-by-side and type once to send to all of them — configure a whole rack of switches in one go; a per-device confirm still gates destructive commands, and a broadcast that misses a disconnected device tells you instead of silently dropping it
  • Structured command blocks: with a device profile active, each command and its output is grouped into a block you can copy, re-send, bookmark, or share — something a flat terminal can't do
  • Cross-vendor command library: 160+ real commands across Cisco IOS/NX-OS, Juniper, Arista, Aruba, MikroTik, Ubiquiti, FortiGate, Linux, and Arduino/ESP32 AT — fuzzy-searchable from a command bar or the Cmd/Ctrl+K palette, with vendor badges, destructive commands gated behind a confirm prompt, your own saved macros (import/export as JSON), and command history (↑/↓ recall)
  • Auto-baud + full framing: presets or auto-detect the baud rate, set data bits / parity / stop bits / flow control, switch live while connected
  • Real-terminal niceties: color themes (Dracula, Nord, Solarized, Gruvbox, Catppuccin), scrollback search, clickable links, per-line timestamps, adjustable font size — from a top View menu and a floating toolbar
  • Parse the stream: trigger/highlight rules (regex → color a line, e.g. %ERROR → red), a live value graph (plot numbers out of the stream), and multi-format decode (hex · uint8 · int8 · uint16 · float32)
  • Hex/ASCII decode, live filter, and session recording: export the session to .log / .json / .txt, all from a local ring buffer
  • Mobile-first: on a phone the UI leads with tappable macros, a quick-keys row (Tab, ?, arrows, Ctrl-C, Esc, Enter), a command box with history, and a pane switcher — no fighting a phone keyboard
  • Agent-callable: window.loft.tools.invoke('serial-console', { action: 'searchLibrary', query, vendor }) answers cross-vendor command questions headlessly

Runs 100% on your device — open DevTools and watch the Network tab stay empty. iPhone and iPad are not supported: iOS browsers use WebKit, which has no Web Serial, WebUSB, or Web Bluetooth — use Android or a desktop Chromium browser. The four chipset drivers are clean-room implementations whose register math is verified against an open reference; they're marked community-tested until confirmed on physical hardware (the in-tool Help panel shows each chipset's status).

added PCAP Analyzer — read captures in your browser

A privacy-first packet-capture analyzer: open a .pcap or .pcapng and inspect it with a Wireshark-style workflow — entirely in your browser. Every other online analyzer uploads your capture to a server; this one never does. First tool in the new Network & Sysadmin category.

  • Clean-room WebAssembly engine: a from-scratch Rust dissection engine (no GPL Wireshark code) compiled to a ~88 KB WASM module — dissects Ethernet, ARP, IPv4/IPv6, ICMP, TCP, UDP, DNS, HTTP, and TLS (handshake + SNI + certificate), with well-known-port labels for DHCP/NTP/SNMP/SSDP/QUIC and more
  • Wireshark-style display filter: ip.addr == 10.0.0.5 && tcp.port == 443, http, dns.qry.name, frame contains "...", with &&/||/!, live validation, and inline errors
  • Three-pane layout: virtual-scrolled packet list (handles ~1M packets), per-packet protocol tree, and a hex view with click-to-highlight byte ranges
  • Analysis tabs: Conversations, Endpoints, Protocol Hierarchy, IO graph, and Expert info (retransmissions, resets, zero-window) — click a row to filter
  • Follow stream: reassemble any TCP/UDP conversation, client and server colored separately, ASCII or hex
  • Export: save the filtered subset back to .pcap, or the packet list to CSV/JSON
  • Agent-callable: window.loft.tools.invoke('pcap-analyzer', { file }) returns a summary, conversations, and endpoints headlessly

Runs 100% in-browser via WebAssembly — your capture never leaves your device. A privacy-first triage analyzer for the common-case protocols, not a full Wireshark replacement (no live capture; TLS application-data decryption is on the roadmap).

General 7
added CAD viewers — Autodesk-grade measure UX + canonical editor primitives

Big polish pass across the seven CAD viewers. The measure tool stops feeling like a prototype and starts feeling like Onshape; the navigation chrome finally has the standard buttons every desktop CAD user expects; and the editor template that powers all our viewers got the canonical primitives extracted so new tools won't reinvent them.

What's new

  • Top-floating measure rail replaces the right-rail accordion. Mode chips for Distance / Angle / Radius / Area / Bbox, a Straight ↔ Along-surface path toggle, units + precision selectors, an entry-count badge, and Undo / Copy / Clear actions — all in one cursor-aware row that drops over the canvas only when measure mode is on.
  • Inline canvas labels float at each committed measurement's midpoint with a leader line back to the part. Click the label to delete the entry. Labels track the camera in real time as you orbit.
  • Cursor coach chip follows the pointer during a pick. Three lines: what the next click does ("Click 2nd point"), the running provisional value (running distance, or polygon area in area mode), and the keyboard hints ("Backspace = undo · Esc = cancel").
  • Four measurement kinds were two before. Radius picks three points on an arc and draws the circumscribed circle + centre marker. Area picks 3+ polygon vertices; double-click or Enter to commit. Distance + Angle stay.
  • Along-surface (geodesic) mode for distance + area. Samples the segment, raycasts onto the mesh, sums the actual surface walk instead of straight-line distance. Useful for cable-length and seam estimates on STEP / STL parts.
  • In-progress polygon ghost — a dashed cyan outline tracks the polygon you're building, and a pulsing yellow ring appears over the first vertex when you hover close enough to close. No more "where do I click to finish?".
  • Per-snap-type glyphs — the snap badge under the cursor now correctly labels vertex / edge-midpoint / face-centroid targets instead of always saying "vertex". Built from a new half-edge adjacency cache that runs once per file load.

Navigation toolset

  • Pan / Hand tool button on every viewer. Left-drag pans while it's active; right-drag still orbits. Trackpad users no longer have to learn that right-drag pans.
  • Zoom Window marquee. Click the chip, drag a rectangle, and the camera tweens to fit that screen region.
  • Home button captures the framing you saw on first load — so "home" actually returns to your default view, not a generic iso angle.
  • Views popover — every viewer now exposes the 7 standard cube views (front / back / top / bottom / left / right / iso-home) plus 5 saved-bookmark slots with rename / overwrite / clear actions. Saved per-tool, persisted across sessions.
  • Smooth camera tweens on every view jump, bookmark restore, fly-to-feature, cube click, fit-to-selection. Quadratic ease over 300ms. Respects prefers-reduced-motion.
  • Right-click context menu on the canvas. Click a face to select it (flood-fills the connected co-planar region with a translucent overlay), then right-click for Fit to selection / Home / Start measure / Clear selection.

STEP improvements

  • STEP explode view — drag the slider in the Explode popover or hit E to spread an assembly's shells along the Z axis. Same UX as the existing 3MF explode; works on any multi-shell STEP.
  • Section view in box mode no longer renders a stippling z-fight pattern on bbox-aligned faces at default 0/100% bounds.

Display + render controls

  • Background presets — theme, dark, light, gradient. (UI surface lands next; the engine hooks are live.)
  • Lighting presets — studio / outdoor / 3-point / soft. Modulates the three scene lights in place.
  • Render quality slider — low / auto / high. High enables ACES filmic tonemap for PBR-textured GLB / glTF models.

Tree search

  • Search above the assembly tree in STEP / 3MF / OBJ / GLB viewers. Renders only when the tree has more than 5 nodes — simple files stay clean.

Under the hood

The editor template that powers every viewer + editor (PDF Editor, Gerber Viewer, CAD viewers) now ships canonical primitives so future tools won't rebuild them:

  • useEditorHistory — generic event-sourced undo/redo + jump-history hook. PDF Editor + Gerber already migrated.
  • ContextMenu, MeasureRail, MeasureToolbar, MeasureCoach, MeasureCanvasOverlay, PanToolButton, HomeButton, BookmarksMenu, ZoomWindowButton, TreeSearch — drop-in primitives in src/components/editor.
  • measure-math.ts — pure-math kernel (distance / angle / circumscribed circle / polygon area) shared across 2D + 3D viewers.
  • edge-adjacency.ts — half-edge cache with floodFillCoplanarFace powering face selection + per-snap-type glyphs.

Try it on STEP viewer, STL, 3MF, OBJ, PLY, or GLB.

changed CAD viewers — canonical top-bar layout across the family

Every CAD viewer's top bar is now organised the same way. Open one viewer, you know where every button lives in the other seven. Web-first means no hidden popovers — every action stays visible — but grouped so your eye finds the right cluster instantly.

Canonical group order

FILE | MODE | NAV | DISPLAY | ACTIONS | ⌘K

  • FILE — open the file picker.
  • MODE — Measure, Section (the two stateful tools).
  • NAV — Pan, Zoom Window, Fit, Home, Bookmarks (the camera controls; Onshape/Fusion users will feel at home).
  • DISPLAY — Explode, Bbox, axis re-orient — whatever toggles how the geometry is shown.
  • ACTIONS — Screenshot, Share, AR, Compare — one-shot commands.
  • ⌘K — the command palette, always at the far right (matches PDF Editor).

Groups are separated by 1px dividers. The trailing Commands button is pushed to the right edge with a flex spacer, so it sits exactly where Adobe / Affinity / Figma users expect.

Naming fixes

  • "Dims" → "Bbox" everywhere. The old label was ambiguous (dimensions of what?). Bbox tells you it toggles the bounding-box overlay.
  • "PNG" → "Screenshot". We render screenshots as PNG, but the user-facing action is "take a screenshot." The verb belongs on the button, not the file format.

Per-viewer specifics

  • STEP — full 6-group layout including Compare deep-link in ACTIONS.
  • STL — adds a 3D-print group between MODE and NAV: Plate (build-plate ghost) · Printer (profile select) · Drop-to-plate.
  • 3MF — Explode lives in DISPLAY (only meaningful for multi-part files).
  • OBJ — axis re-orient (Y-up ↔ Z-up) in DISPLAY.
  • PLY / GLB — standard 6-group layout.
  • DXF — pared-down 2D layout: no Section/AR/Bookmarks/Explode (none apply to 2D).

Why this matters

Inconsistent toolbars cost users milliseconds on every action. Multiply by a CAD review session that takes 20 minutes and you've burned attention on layout-hunting that should go to the part. Canonical order makes muscle memory transfer between formats — open a STEP today, an OBJ tomorrow, the buttons are in the same place.

The new layout primitives (Divider, TopBarSpacer) live in src/components/editor/primitives/ and are exported from the editor barrel, ready for future tier-1 editor tools (audio, video, RAW).

added CAD engine v0.1 — STEP / DXF / STL / OBJ / PLY / GLB / 3MF, all local, all in the browser

Seven viewers ship together on the same Rust→WebAssembly substrate. Drop a part, see the geometry, measure it, save a PNG. Nothing leaves your machine — every byte stays in the tab.

  • STEP viewer opens AP203 / AP214 / AP242 files (.step / .stp) and tessellates them in the browser via a vendored fork of the Apache-2.0 ricosjp/truck Rust CAD kernel. We carry local patches for the bugs we hit on Schneider Electric J-frame breakers (silent B-spline drop on Inventor exports) and Elgin EG-Frame mechanisms (sphere-radius panic on sub-tolerance fillets). The trimmed mesh streams across a Web Worker so the main thread stays responsive on 17 MB assemblies — verified end-to-end on a Schneider PowerPact JDC3 + an Elgin breaker mech (126,000 triangles, 16 MB file, no UI freeze).
  • DXF viewer opens AutoCAD drawings and renders them as SVG in the browser. Line, arc, circle, polyline, lightweight polyline, spline, and ellipse are all supported. Block-reference (INSERT) entities recursively expand the block definition with translation + rotation + scale, depth-capped at 16 nestings — a typical mechanical drawing's title block, branding, and section markers all light up correctly.
  • STL / OBJ / PLY / GLB / glTF / 3MF viewers — the same React shell with format-specific loaders. Each viewer auto-detects format by magic bytes when the extension is missing, so users who drop a .bin exported from Fusion 360 still get sensible behaviour.
  • Section view — three dual-knob sliders carve away the bounding box on the X / Y / Z axes via Three.js per-material clipping planes. Useful for hiding bundled accessories (rotary handles, mounting kits) on Schneider J-frame STEP exports without touching the source file.
  • Assembly tree — STEP files with multiple shells render as a THREE.Group of sub-meshes; the toolbar exposes per-shell visibility checkboxes. Single-shell parts get the existing single-mesh fast path.
  • Measure — the classic point-to-point ruler with raycast snap. Click two points, read the distance in the status bar.
  • Section view, render mode (shaded / wireframe / shaded + edges), screenshot, reset view — every viewer carries the same toolbar.

Numbers under the hood: 379 KB gzipped WASM, 200 MB hard file ceiling, ISO 10303-21 comment + empty-list preprocessor for Shapr3D / HOOPS Exchange compat (their STEP files were rejected by ruststep's strict tokenizer), 41 cargo tests, 14 lib tests, 7 property tests, ClusterFuzzLite fuzz harness. All vendored dependencies are MIT / Apache-2.0 / BSD / MPL — cargo deny check is enforced in CI.

Try the viewers at STEP, DXF, STL, OBJ, PLY, GLB, 3MF.

changed Gerber Viewer — actionable right pane, aperture highlight, click-to-pin trace width

Hardware engineers asked for tighter feedback loops between the right-pane panels and the canvas. This release makes every panel row do something useful.

  • Aperture highlight — click any row in the aperture table and every flash of that D-code on the layer lights up in cyan. The viewport recenters on the first flash so you can see what just lit up. Click the same row again to clear. The row gets a cyan tint that matches the on-canvas glow so panel + viewport read as the same control. Standard CAM350 / GerbView gesture, missing from v1.
  • Click-to-pin trace width — in Inspect mode, click any copper trace where there isn't a pad under the cursor. A perpendicular dimension line drops across the trace at the cursor point, labeled with the conductor width. Sticks around like any other measurement, exports in the TSV / Markdown copy of the Measurements panel. Trace-edge endpoints get a new ┼ snap glyph so they're visually distinct from pad-edge ones.
  • Trace-width probe is now always on — previously gated to Inspect mode; the spec promised always-on. Hover any copper conductor in the default Select mode and the status bar reports its width.
  • Drill row click → recenter on first hole — same pattern as aperture rows. The drill table is no longer a passive list.
  • Aperture sort columns get screen-reader semanticsaria-sort on every header, data-sid on every sort button so the agent harness can drive sorting too. Same treatment for the DRC group-head accordion.
  • PNG export failure shows a toast instead of a blocking alert() dialog. SVG and DXF export gain catch-and-toast as well, so any future parse failure surfaces inline instead of as an uncaught console error.

Under the hood the 1995-line GerberPanels.tsx was split into 10 panel modules plus a shared helpers file. No behaviour change from the split, but every panel is now its own file you can read top-to-bottom in one screen.

Two hardcoded rgb() values in the readiness-score colouring were swapped for the --color-error / --color-success semantic tokens — they were the last raw colour leaks in the viewer's CSS.

Lives at /tools/open-tools/gerber-viewer.

added Gerber Viewer v1.1 — diff, DRC, 3D, flex

Three days after launch, the Gerber Viewer gets the features hardware engineers asked for first: compare two boards, run design-rule checks, see the board in 3D, and handle flex / rigid-flex stackups.

  • Diff mode — drop a second archive to compare two revisions. Slider mode reveals A vs B by dragging a vertical divider. XOR mode tints A in cyan + B in magenta so deltas pop while shared geometry reads white. Industry pattern from gerbv compare + KiCad ROOT plot.
  • DRC — click DRC in the right pane and pick a fab preset (JLCPCB 2-layer, OSH Park 4-layer, IPC Class 2). Checks: min trace width, min drill, min annular ring, copper-to-edge clearance, real trace-to-trace clearance, copper shorts, and pour-to-trace clearance. Click any violation → viewport recenters on the exact location.
  • Trace pick — click any pad or trace → BFS-walk the connected copper, highlight the entire net across all visible layers, with cross-layer hops via drill correlation. Works on copper pours.
  • 3D board preview — open 3D in the toolbar to see your board extruded as a real PCB. Drill cuts are CSG-subtracted from the substrate. Layer textures render at 8 px/mm. Orbit / pan / zoom via mouse + trackpad.
  • Flex / rigid-flex — when the .gbrjob declares Polyimide or Coverlay materials, the viewer auto-detects the board kind, surfaces a stackup table with IPC-2223 bend-radius calculation (5× / 8× / 15× rules), and unlocks a vertical bend slider in 3D mode that folds the back half around the centre axis using a vertex-shader bend. Coverlay layers render with the same bbox-evenodd technique as soldermask.
  • GPU renderer — toggle the GPU button in the toolbar to switch from Canvas2D to a WebGL2 polygon-mesh backend. ~3× pan/zoom perf on boards over 10k chunks. Falls back automatically when the browser blocklists WebGL2 — and the toolbar pill stops lying about it (a silent fallback was the previous behaviour).
  • Step-and-repeat parsing, X3 layer-state transforms (%LM mirror / %LR rotation / %LS scale), Eagle vector-paint coalesce, and a proper thermal pinwheel for AMTHERM primitive 7 — Eagle and Altium boards that previously looked off (rotated silk, fat copper pours, broken thermal pads) now render correctly.
  • Silk masking — silk text is suppressed where ink physically wouldn't sit: over drill holes, over soldermask openings, and past the board outline. Matches inked-board appearance without fighting the file's chunk stream.
  • Apple-style spinner during file load + parse, with brand colours and reduced-motion fallback.
  • Pan as default mode, focus-blur on Space-down so toolbar buttons don't intercept pan, distinct on/off contrast for layer eye toggles.
  • Two demo boards out of the box: Stickhub (KiCad reference 2-layer with X3 attributes, drill, paste, silk + .gbrjob) and Flex demo (60 × 17 mm flex strip with coverlay + polyimide stackup). Replaces the v1 placeholder samples.
  • Empty / blocked states — drop an archive with no Gerber files → clear error. Hide every layer → "All layers hidden — toggle a layer in the rail" overlay. Browser blocks the print popup → toast tells the user. PNG export hits browser canvas-size limits → explains and suggests zooming out.

Parser worker prewarms on tool mount so the very first drop doesn't race the cold-compile. Bus auto-recovers if the worker dies. WebGL context-loss listener invalidates GPU caches and forces a redraw when the driver flakes.

Bottom-side layers default to hidden (Eagle stamps both sides at the same world coordinates without a per-layer mirror — showing both gives ghost-overlap; one toggle in the layer rail brings the bottom back).

Lives at /tools/open-tools/gerber-viewer.

added Gerber Viewer — open PCB files in your browser

First entry in the Open Anything category. Drop a fab archive (.zip / .tar / .tar.gz / loose .gbr / .drl), inspect every layer, measure traces — without installing CAM software.

  • Archives: zip, tar, and tar.gz auto-detected by magic bytes, extracted client-side via fflate + nanotar. Loose Gerber and Excellon files land directly.
  • Layer auto-detection: whats-that-gerber classifies each file (top copper, bottom copper, soldermask, silkscreen, drill, outline). Manual override lives on each layer row when the heuristic guesses wrong.
  • Realistic PCB palette: green soldermask, copper-tone traces, white silkscreen, dark drill — the colours hardware engineers expect, applied via composite blend so soldermask actually tints copper underneath. Per-layer color overrides via inline swatch picker.
  • Three-pane CAM350 layout: layer rail left (drag-reorder, visibility, color, kind), canvas center, inspector accordion right (Job info, Layer properties, Aperture table, Measurements, View, About).
  • Measure tool: two clicks → distance with snap-to-pad. Live preview line shows running distance before commit. Pad-center snap powered by an rbush spatial index per layer, built lazily on first hover.
  • Status bar (CAM350 / GerbView convention): cursor X/Y leftmost, mode + active layer center, scale (px/mm) and "Local" trust pill right.
  • Aperture table: sorted by D-code with shape, size, and pad-flash hit count — matches Altium / KiCad GerbView.
  • Pan + zoom: wheel zoom, drag pan, fit-to-window, 1:1, mirror (bottom-side flip), 90° rotation. Auto-fit on first load using actual canvas dimensions.
  • Export: PNG snapshot, SVG (per-layer vector groups, opens in Illustrator / Figma / Inkscape), DXF (LINE / ARC entities for mechanical CAD).
  • URL fragment encoding: viewport, layer visibility, and tool mode round-trip through the hash so a snapshot is one copy-paste away. Nothing leaves the device.
  • Sample board bundled (CC0): one-click Try Demo to verify the pipeline before dropping a real fab output.

Phase C (CAM350 parity) shipped same day:

  • World View minimap floating in the canvas bottom-right with click-to-recenter — CAM350 / GerbView convention.
  • Test panel with Fab-readiness score (0..100, R/Y/G band) aggregating layer completeness, DRC violations, board-size sanity. Downloadable Drill CSV + Aperture CSV for fab quote requests. Layer-completeness checklist (top/bottom copper + soldermask both sides + top silk + outline + drill).
  • Drill table panel (separate from Aperture table — CAM350 / KiCad convention): Tool / Diameter / Hits sorted by tool number ascending.
  • Stack-up visualiser as a left-rail tab alongside Layers — vertical layer-order display with kind + side labels.
  • Command palette (⌘+/) with 20+ commands, fuzzy search, ↑↓ navigation, Enter-to-run. Industry-convention shortcut (Figma / Notion / Slack) — no browser conflict.
  • Find modal (⌘+F) accepting D-code (D11), refdes (U1), or coords (10, 12) in a single field — recenters viewport on the first hit.
  • Print snapshot — opens a fresh window with canvas + caption + auto-print + auto-close.
  • Job info enrichment: Perimeter (bbox-based) + Area + Copper area (sum of stroke length × width + pad bbox area) alongside existing Width / Height / Units.

v2 features shipped same day:

  • Realistic substrate: board area paints in soldermask green so bare-FR4 between traces reads as a real PCB. White drill holes punch through copper pads — JLCPCB / GC-Prevue rendering convention.
  • Industry-standard layer rail: top toolbar (All / Top / Bot / hide-all), per-row up/down reorder arrows, alt-click eye = solo, right-click for "Move to top / bottom" + Kind + Side override menus. Drag a file onto the rail itself = swap doc.
  • Trace-width probe: hover over a copper trace in Inspect mode → status bar reports the exact width.
  • DRC-lite with three fab presets (JLCPCB 2-layer, OSH Park 4-layer, IPC Class 2). Checks min trace width, min drill, min annular ring, copper-to-edge clearance. Click a violation row → viewport recenters on that location.
  • Pick-and-place / CPL overlay: drop a KiCad .pos, JLCPCB CPL, or Altium PnP CSV; component centroids render as cyan dots with rotation ticks + designator labels.
  • CAM350-style status bar: cursor X/Y leftmost, Mode + per-mode hint, active layer, scale (px/mm), Local trust pill right.
  • Industry-standard cursors: default (Select), grab (Pan / Space-down), crosshair (Measure), help (Inspect).
  • Cmd / Ctrl + wheel zoom (Figma / Acrobat / Altium convention) anchored on cursor position. Plain wheel no-op so accidental scrolls don't reframe the board. F or ⌘+0 fits to window. V / H / M / I switch modes.

Parser sits in a Web Worker — the main thread never blocks during a parse, and the heavy tracespace v4 + Node-stream shim load only on first drop. Lives at /tools/open-tools/gerber-viewer.

Gerber is a registered trademark of Ucamco NV. Loft Tools is an independent third-party viewer and is not affiliated with or endorsed by Ucamco.

added Gerber Viewer — open PCB fab files in your browser

First entry in the Open Anything category. Drop a fab archive, inspect every layer, measure traces, run DRC — without installing CAM software.

Core viewer

  • Archives: zip, tar, tar.gz auto-detected by magic bytes; loose .gbr and .drl files also work. Everything extracts client-side.
  • Layer auto-detection classifies each file (top copper, bottom copper, soldermask, silkscreen, drill, outline). Manual override on each row when the heuristic guesses wrong.
  • Realistic PCB palette: green soldermask, copper-tone traces, white silkscreen, bright drill holes — the colours hardware engineers expect.
  • Three-pane CAM350 layout: layer rail left, canvas center, inspector accordion right with Job info, Layer properties, Aperture table, Measurements, View, About.
  • Measure tool: two clicks, distance with pad-center snap, live preview line.
  • Pan + zoom: ⌘/Ctrl + wheel zoom anchored on cursor (Figma / Acrobat convention), drag pan, fit-to-window, 1:1, mirror, 90° rotate.
  • Export: PNG, SVG (per-layer vector groups for Illustrator / Figma / Inkscape), DXF (LINE / ARC for mechanical CAD), Print.
  • URL fragment sharing: viewport + layer visibility round-trip through the hash — share a deep-linked inspection view.
  • Sample boards bundled (CC0): a four-pad smoke test plus a richer DIP-8 breakout with multi-layer routing and vias.

Same-day v2 (CAM350 parity)

  • Industry-standard layer rail: top toolbar (All / Top / Bot / hide-all), per-row reorder arrows, alt-click eye = solo, right-click for "Move to top / bottom" plus Kind and Side overrides. Drag a file onto the rail = swap doc.
  • Trace-width probe: hover over a copper trace in Inspect mode → status bar shows the exact width.
  • DRC-lite with three fab presets (JLCPCB 2-layer, OSH Park 4-layer, IPC Class 2). Click any violation to recenter on it.
  • Pick-and-place overlay: drop a KiCad .pos, JLCPCB CPL, or Altium PnP CSV — components render with rotation ticks and designator labels.
  • World View minimap in the bottom-right with click-to-recenter.
  • Test panel with a 0–100 fab-readiness score (R/Y/G band), downloadable Drill and Aperture CSVs, layer-completeness checklist.
  • Drill table separate from the aperture table (CAM350 / KiCad convention).
  • Stack-up visualiser as a left-rail tab.
  • Command palette (⌘+/) with 20+ commands, fuzzy search.
  • Find (⌘F): D-code (D11), refdes (U1), or coordinate (10, 12) in a single field.
  • Editor groundwork: click a pad in Select mode to inspect or delete it; Delete / Backspace key wired.
  • Geometric netlist extraction with CSV export and click-to-recenter per net; vias automatically union nets across copper layers.
  • DRC expansion: silk-to-copper, mask-expansion, drill-to-drill spacing (7 rules total). Tree-grouped error explorer with click-to-recenter.
  • Cross-probe: selecting a pad highlights matching coordinates on every other copper layer + drill.
  • IPC-2581 detection: recognises the format and gives a clear "use Gerber export from your CAD tool" message instead of failing with a confusing parser error.

Lives at /tools/open-tools/gerber-viewer. Parser runs entirely in a Web Worker — the main thread never blocks during a parse.

Gerber is a registered trademark of Ucamco NV. Loft Tools is an independent third-party viewer.

General 1
changed Brand redesign — cyan-first, Space Grotesk wordmark, live status favicon

Loft Tools' visual identity has shifted from violet-primary to cyan-primary. The 3D isometric "L" icon is retired. The brand mark is now a cyan-gradient rounded square with a white dot in the upper-right cavity — a single artwork that scales from a 16px favicon all the way up to an iOS home-screen icon without losing legibility. Inside the product, the same mark drives the navbar, every favicon variant (light + dark tab themes), every PWA icon (Android, Apple touch, maskable, Microsoft tile), and every social-share preview.

The wordmark moved from Montserrat 800 ALL-CAPS to Space Grotesk SemiBold lowercase loft. Tighter letterforms, lower visual weight, and a sentence-case feel that pairs with the cleaner mark. Inter (UI) and JetBrains Mono (code labels) stay.

What changed for users

  • New mark in the navbar. Cyan rounded square with a white dot — the same artwork that's now your favicon, your installed-app icon, and your OG card. Click it to go home, same as before.
  • The favicon tells you the tool is working. Drop a file into any compress/convert/redact tool and watch your browser tab — the dot turns green while processing, back to cyan when finished, amber if something needs your input, red on error. The tab title gets a small glyph too (●, ⚠, ✕) so backgrounded tabs are scannable at a glance.
  • Light-mode-aware favicon. If your browser is in light theme, the favicon renders with an ink frame + cyan dot so the dot stays visible. Dark theme renders the inverse. Both swap automatically — no setting to flip.
  • Light-mode toggle in the navbar. Sun/moon icon in the right-side actions. Your choice persists across sessions (localStorage). On first load, we honor your OS's prefers-color-scheme. The toggle smoothly cross-fades surfaces, ink, and accents.
  • Hero rainbow word survives. "Zero Friction" on the homepage still runs the multi-stop gradient. That's the one place violet stays in the brand — a deliberate accent on a single isolated word in a display heading. Everywhere else (borders, focus rings, glows, CTAs, badges, sponsor paths, FAQ accordion, blockquotes) is now cyan.

Where you'll see it

  • Navbar — full state shows the mark; the compact (scrolled) state keeps the mark, drops the rest of the chrome. Both states use the new artwork.
  • Footer + editor mega-drawer — same mark, smaller.
  • OG image — new cyan-gradient OG card with Space Grotesk text and the v2 mark in the corner. Drives every social-share preview when a tool doesn't ship its own per-page OG.
  • Sponsor page — GitHub path keeps its pink heart (that's GitHub Sponsors' color); the rest of the path tints (badge, hero halo, CTA shadow) are now cyan. Stripe path reads as a cyan "pro" route. Buy Me a Coffee stays gold — it's a tier color, not brand.
  • All file-processing tools — primary download buttons are cyan-only (was a violet→cyan gradient). Progress bars, processing rings, completion badges, comparison overlay sliders all rebound to cyan tokens.

Engineering notes (skip if you don't care)

  • Three-tier token architecture preserved (D02-brand.md). Tier 1 raw palette gained a full cyan ramp (50–900). Tier 2 semantic tokens flip cyan-bound. Tier 3 component tokens (buttons, cards, search, status dot, brand mark URLs) inherit. Components reference Tier 2/3 only — never raw hex.
  • Legacy aliases preserved. --accent-violet, --glow-purple, --color-accent-violet (Tailwind utility) still exist but now resolve to cyan. v1 components that referenced those names render correctly under v2 without per-file rewrites.
  • Hero rainbow is now token-driven. --color-hero-accent-rainbow is the single multi-stop gradient definition. .loft-hero__gradient and the featured-page .loft-show__title-accent both pull from it.
  • Status Dot is a first-class primitive. White ring + state-colored fill. --status-dot-frame / --status-dot-{ready,working,attention,error}-fill tokens. Component at src/components/StatusDot.tsx, fully a11y-wired.
  • Favicon state machine ships as setFavicon(state) in src/lib/favicon-state.ts. Inline data-URI SVGs — no network flash on swap. Wired into FileProcessorTemplateV2 so 17 tools (image + PDF + security) inherit the favicon swap automatically. Add to your own tool with a one-line import.
  • Spotlight reveal — new .loft-reveal--anim-spotlight variant adds a 600ms cyan light sweep across result tiles when a job completes. Trigger via useResultReveal({ animation: 'spotlight' }).
  • Orbit-dot spinnerLoftSpinner rewrote from a 12-bar SVG spinner to three cyan dots orbiting with trailing opacity. CSS lives in global.css so any element with .loft-spinner + three <span> children renders one. Three sizes (sm 24px / md 36px / lg 56px).
  • Space Grotesk replaces Montserrat in BaseHead.astro's Google Fonts link. Inter and JetBrains Mono stay. The wordmark SVGs already ship Space Grotesk text rendered to path — no font fetch needed for the mark itself.
  • 74 new brand assets under public/brand/{svg,png,social}/. 39 obsolete flat icons (the 3D isometric "L" ladder) removed.

Known limits

  • Four audit §10 components deferred: PremiumGate, InstallToolButton, RateLimitIndicator, MobileBottomNav. They're designed in the brand kit but not yet built into components. Tracked for a follow-up.
  • loft-wordmark + LoftLockup are exported primitives but unused in the live product right now. The global header is intentionally mark-only per Pattern A. LoftLockup is wired for future surfaces (sponsor splash, email signatures, OG cards that need the full lockup).
  • Light theme is fresh. Tokens are wired and 90% of the surface flips correctly, but if you spot a component that still feels stuck in dark mode (hardcoded dark hex somewhere), file it — there will be polish passes.

The audit, component library, logo-usage rules, surface patterns, and motion specs that drove this redesign all live in .kb/reference/brand/system/. Nothing about file processing changed — your files still never leave the device.