Skip to main content
Support

Browse by category

All categories
Changelog

Loft Tools site changelog

All 43 entries, newest first. Click an entry to read it, or go back to the full changelog for the other areas.

fixedInstall Loft in one tap — the PWA install path actually works now

Installing Loft as an app used to mean digging through browser menus — the site's Install button only lived on the homepage and could never offer the native one-tap dialog. Fixed end to end.

  • One-tap install on Chromium: on Chrome, Edge, Brave, Opera, and Samsung Internet, clicking Install now fires the browser's native install dialog directly — the same single-click flow as PairDrop or Chrome Remote Desktop. The event is captured at page load on every page, so the fast path is always armed
  • Install button on every page: the header now carries the Install button site-wide (full pill on desktop, icon in the compact header), not just a card on the homepage. It hides itself once you're running the installed app, and on browsers with no install path at all (desktop Firefox) it stays out of your way
  • A real install dialog: the app manifest now ships screenshots, so Chromium shows the app-store-style install sheet with previews instead of the bare mini-prompt
  • Safari / iPhone still covered: where the native prompt doesn't exist, the button opens the per-browser guide — Share → Add to Home Screen on iOS, File → Add to Dock on macOS Safari — with exact, current menu paths
  • Share-an-image fix: sharing an image into the installed app now lands in Bulk Image Resize instead of a dead link

Under the hood the install flow, the service worker, and the manifest were consolidated to a single source of truth, so the installed app always gets the same shortcuts, file handlers, and share targets the site advertises.

addedTool 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.

addedLocal-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.

changedAbout 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.)

addedDefinitional 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.
fixedTool 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.

addedTool-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.

addedSearch 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.

addedTips 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.
fixedStale 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.

addedFirst-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.

addedIndustry-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.

removedServer-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.

changedSite 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.
fixedReal 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.

changedSelf-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.

addedAI 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.

changedAI-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.

changedFooter 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.

addedBlog 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.

addedFaster 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.

fixedSEO 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.

changedTighter 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.

changedTighter 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.

changedVideo 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.

addedLaunch-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 DMCA agent.
  • 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.

addedSponsorships: 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.

fixedMobile 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.
changedCleaner 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).

changedEditor 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.

fixedGlass 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.

changedBrand 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).

changedPre-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.

addedSponsor 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.

changedEditor 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.

changedSecurity: 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.

changedChrome 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.
changedRemoved 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.
changedTaxonomy 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.
changedStripe-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.

addedInstall 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.

addedFeedback 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.

addedMy 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.