LogoAuraFile
Back to Blog

Optimizing Web Performance: How AuraFile Achieves a 100/100 Lighthouse Score

A technical deep-dive into the Next.js architecture, image optimization, and Core Web Vitals strategies that power AuraFile's top-tier performance scores.

M
Madhumitha
Mar 22, 20269 min read
Optimizing Web Performance: How AuraFile Achieves a 100/100 Lighthouse Score

Performance is not a feature. It is a baseline.

A file processing tool that loads slowly undermines the trust it needs to handle users' sensitive documents. And beyond user perception, page performance is a direct Google ranking signal — which makes it doubly critical for any web application seeking organic search visibility.

This article documents the specific technical decisions that enable AuraFile to achieve a perfect 100/100 Lighthouse score across Performance, Accessibility, Best Practices, and SEO.


Understanding What Lighthouse Actually Measures

Lighthouse evaluates a page against four categories:

CategoryKey MetricsTarget
PerformanceLCP, INP, CLS, FCP, TTFB90–100
AccessibilityARIA attributes, contrast, labels100
Best PracticesHTTPS, console errors, image aspect ratios100
SEOMeta tags, crawlability, canonical URLs100

Our Foundation: Static Generation — No Server Work Per Visitor

We built AuraFile on Next.js 15's App Router and made a deliberate architectural choice early on: every page that doesn't need to be dynamic gets statically generated at build time.

That means when you visit /compress-image or /merge-pdf, you're not waiting for a server to run any code. You get a pre-built HTML file served from Vercel's global CDN edge — typically with a Time to First Byte under 50ms. Speed before the browser even starts rendering.

Why We Chose Static Over SSR

  • Zero per-request compute: No database queries, no server rendering — the HTML already exists.
  • True CDN caching: Our pages serve from an edge node close to wherever you are in the world.
  • Consistent FCP: We know exactly how fast First Contentful Paint will be, because nothing is waiting for a backend.

Eliminating Layout Shift: Getting CLS to Zero

Cumulative Layout Shift was the metric that surprised us most in early audits. Even tiny things — an image loading without reserved dimensions, or a font swapping in — would send our score sideways.

Our Image Reservation Fix

Every image on AuraFile goes through the next/image component with explicit width and height props. This gives the browser the information it needs to reserve the exact right amount of space before the image arrives — no pop-in, no shift.

How We Handled Fonts

Custom fonts were our other CLS culprit. We moved to next/font/google with display: 'swap'. Next.js downloads them at build time and serves them from our own CDN — no external DNS lookup, no font loading race, no flash of unstyled text.

LCP: Why We Chose Text Over a Hero Image

LCP measures how quickly the biggest visible element in the viewport renders. Hero images are one of the most common LCP problems we see across the web.

We made a deliberate call: our homepage hero is text-based, not image-based. The LCP element is CSS-rendered typography — it's already in the HTML, it doesn't need to be fetched, and it's not going to be slow.

On Pages Where Images Are the LCP Element

Blog posts are different — the hero image genuinely is the biggest viewport element there. For those, we add the priority prop to next/image, which injects a <link rel="preload"> into the <head>. Your browser starts fetching the image in parallel with everything else, rather than waiting to parse down to the <img> tag.

Keeping Our JavaScript Bundle Small

Every kilobyte of JavaScript a browser downloads has to be parsed and compiled before a page becomes interactive. We took this seriously from the start.

Dynamic Imports for Our WASM Tools

Our file processing tools use WASM modules that can be several megabytes. Loading those on marketing pages would be absurd. Instead, we use Next.js's dynamic() with { ssr: false } — the WASM only loads when you actually navigate to a tool and need it. The marketing shell stays tiny and instant.

Tree Shaking Keeps Things Tidy

Because we write in ES modules throughout, Next.js's bundler can automatically drop any imported code that's not executed on a given page. As our codebase grows, the bundle for each individual page stays lean — without us having to manually audit what's included.

Serving the Right Image Format to Every Browser

We let next/image handle format negotiation automatically. Depending on what your browser declares in its Accept header, you get:

  • AVIF for Chrome and Edge (40–50% smaller than JPEG at the same quality)
  • WebP for Firefox and other browsers
  • JPEG/PNG as a fallback for anything that doesn't support the above

That hero image sitting at 800KB as a JPEG? Chrome users get it as a 180KB AVIF. That difference alone has a measurable impact on LCP.

Accessibility: 100 Isn't Optional for Us

We target a perfect accessibility score not because it looks good in audits, but because it reflects how we think software should be built. Concretely, this means:

  • Every interactive element has a descriptive aria-label
  • Our colour contrast ratios meet the 4.5:1 minimum for normal text throughout
  • All images have meaningful alt text (or alt="" for purely decorative ones)
  • Forms are properly labelled, and tab order follows what you'd logically expect

Our SEO Layer

We use Next.js's built-in Metadata API to generate every page's SEO tags at build time. Every page we ship gets:

  • A unique, specific title and description
  • A canonical URL so Google doesn't see duplicate content
  • Open Graph and Twitter card tags so shared links look professional
  • JSON-LD structured data (FAQPage, BlogPosting, WebApplication) for rich Google results

The Infrastructure Under All of This

No amount of code optimisation salvages slow infrastructure. We deploy on Vercel's Edge Network, which gives us:

  • HTTP/3 and QUIC support out of the box, cutting connection latency
  • Smart CDN caching with stale-while-revalidate so fresh builds propagate fast
  • Brotli compression by default — HTML, CSS, and JS transfers are up to 26% smaller than with gzip
  • Anycast routing to the edge node nearest to each visitor

What We Learned: Performance Is a Design Decision

Hitting 100/100 on Lighthouse isn't one big optimisation. It's fifty small ones, made at every layer — from how we structure infrastructure to how we write an alt attribute. And they compound: a fast first paint makes the tool feel trustworthy. A layout that doesn't jump feels stable. Accessible design means more people can actually use what we built.

For us, performance isn't a pass at the end of a project. It's a constraint we carry from the beginning.

Fast, Private, Professional Tools

Experience the performance yourself. All tools load instantly and process files with zero server contact.