Skip to content

[#562] Rebuild the KHIX homepage rendering pipeline - #563

Open
GodlyDonuts wants to merge 4 commits into
KnightHacks:mainfrom
GodlyDonuts:2026/reduce-homepage-memory
Open

[#562] Rebuild the KHIX homepage rendering pipeline#563
GodlyDonuts wants to merge 4 commits into
KnightHacks:mainfrom
GodlyDonuts:2026/reduce-homepage-memory

Conversation

@GodlyDonuts

@GodlyDonuts GodlyDonuts commented Sep 12, 2026

Copy link
Copy Markdown

Why

The KHIX homepage was visually rich, but its rendering model asked the browser to keep nearly the entire experience alive at once: oversized decoded images, animated WebPs, permanent compositor hints, hundreds of animated DOM nodes, offscreen timers, and multiple concurrent transparent animations.

That pushed observed Chrome memory to 1.3 GB, made scrolling visibly choppy, and could leave major artwork missing for tens of seconds.

This PR rebuilds the homepage rendering pipeline so visual quality is preserved—and in several transitions improved—while expensive work exists only where and when it can be seen.

Closes: #562

What

Render less, without showing less

  • Collapses the desktop hero from nine full-screen decoded layers into one AVIF composition plus one transparent ambient video.
  • Creates a purpose-built mobile composition instead of decoding the desktop scene on small screens.
  • Replaces animated WebPs with compact VP9/HEVC-alpha video and static poster fallbacks.
  • Localizes and right-sizes critical art so the hero, purple foliage, pond, waterfall, and FAQ cave no longer depend on delayed oversized remote decodes.

Make animation follow visibility

  • Adds a shared viewport/visibility lifecycle for decorative video, timers, auto-rotation, and ambient effects.
  • Pauses or releases work when sections leave the viewport, the document is hidden, or reduced motion is requested.
  • Keeps only the waterfall stream crossing the viewport center decoded and playing.
  • Reuses one FAQ AudioContext and disconnects completed note graphs.

Replace compositor pressure with bounded drawing

  • Replaces 154 animated waterfall DOM nodes with one viewport-bound canvas using pre-rendered sprites.
  • Caps canvas pixel ratio and adapts its render scale when frame time rises.
  • Removes permanent will-change, broad backdrop blur, oversized shadows, redundant glow animations, and dead layered-hero code.

Preserve and polish the experience

  • Keeps the pond atmosphere, fireflies, wisps, falling leaves, transparent water motion, and interactive controls.
  • Removes the static waterfall tail at the basin and smooths the cave transition.
  • Corrects the hero pond blend, restores full pond ambience, and improves navigation, CTA, gallery, sponsor, and FAQ clarity.
  • Includes WebM and Safari-compatible MOV sources plus static fallbacks.

Results

Measured on the optimized production build:

Signal Before After Change
Chrome RAM usage (observed) 1.3 GB 450 MB ~65% lower
Desktop Lighthouse performance 62 87 +25
Desktop LCP 11.7 s 2.3 s −80.2%
Desktop transfer 19,334 KiB 2.30 MiB −87.8%
Desktop requests 87 57 −34.5%
Mobile Lighthouse performance 42 63 +21
Mobile LCP 21.2 s 7.5 s −64.6%
Hero decoded in-DOM image estimate 69.9 MiB 12.1 MiB −82.7%
Animated waterfall DOM nodes 154 0 −100%
Simultaneous waterfall video streams 2 1 −50%

The Chrome RAM result was observed on the same machine and full-page test flow before and after this change. Exact process memory varies by platform and viewport; the remaining rows provide repeatable loading and rendering-pressure signals alongside it.

Test Plan

  • pnpm --filter @forge/2026 test — 14 tests passed
  • NODE_OPTIONS=--max-old-space-size=4096 pnpm --filter @forge/2026 typecheck
  • Production @forge/2026 build with local non-secret environment placeholders
  • pnpm --filter @forge/2026 format
  • pnpm analyze:react:changed — 0 failures
  • Changed-function JSDoc audit — 87.37% coverage (80% required)
  • Desktop production-browser pass across hero, pond, speakers, waterfall, basin, team, FAQ, and footer
  • Mobile composition and media-source lifecycle verification
  • Reduced-motion, document-visibility, offscreen pause/unload, audio reuse, and fallback behavior verified
  • No horizontal overflow or runtime console errors observed

Checklist

  • Database: no schema changes
  • Environment Variables: no environment variables changed

@coderabbitai

coderabbitai Bot commented Sep 12, 2026

Copy link
Copy Markdown

Review Change StackReview Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: QUIET

Plan: Advanced

Run ID: 7c3d1f0a-1d03-404e-b214-3d94c622bd05

📥 Commits

Reviewing files that changed from the base of the PR and between 3db2c3e and b0e3e39.

📒 Files selected for processing (19)
  • .forge/features/homepage-memory/status.md
  • apps/2026/src/app/_components/AmbientVideo.tsx
  • apps/2026/src/app/_components/ambientVideoSources.ts
  • apps/2026/src/app/_components/footer/CaveBugs.tsx
  • apps/2026/src/app/_components/sections/about/AboutGallery.tsx
  • apps/2026/src/app/_components/sections/about/AboutSection.tsx
  • apps/2026/src/app/_components/sections/faq/LennyBlink.tsx
  • apps/2026/src/app/_components/sections/faq/faq.tsx
  • apps/2026/src/app/_components/sections/hero/Hero.tsx
  • apps/2026/src/app/_components/sections/speakers/PondAtmosphere.tsx
  • apps/2026/src/app/_components/sections/speakers/SpeakerShowcase.tsx
  • apps/2026/src/app/_components/sections/sponsor-team/DeferredWaterfallArt.tsx
  • apps/2026/src/app/_components/sections/sponsor-team/SponsorTeamSection.module.css
  • apps/2026/src/app/_components/sections/sponsor-team/SponsorTeamSection.tsx
  • apps/2026/src/app/_components/sections/sponsor-team/WaterfallAtmosphere.tsx
  • apps/2026/src/app/_components/sections/tracks/TracksSection.tsx
  • apps/2026/src/app/_components/sponsor-showcase/SponsorShowcase.tsx
  • apps/2026/src/app/_components/team-cascade/TeamCascadeClient.tsx
  • apps/2026/src/app/_components/useViewportActivity.ts

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

The homepage now uses viewport-aware media and animation lifecycles. Hero artwork is consolidated into static compositions with transparent ambient video. Waterfall droplets use an adaptive canvas renderer. FAQ audio reuses one AudioContext. Gallery, sponsor, team, speaker, bug, and decorative effects defer or pause work when inactive. Images use local paths, responsive sizing, and optimized delivery.

Priority: ➖ Normal

Severity of issue fixed: Medium

Merge Risk: 🔵 Low · up to b0e3e

Some homepage media can still consume bandwidth earlier than needed, and reduced-motion users still receive portrait hover movement. These are bounded issues, but should be tracked before relying on the optimization results.

🚥 Pre-merge checks | ✅ 7 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The pull request includes visual-only changes that do not implement issue #562. These changes include navbar gradients, borders, and shadows; About gallery borders and hover zoom; hero apply-button re… Revert the unrelated visual-only CSS changes, or link them to a separate issue.
✅ Passed checks (7 passed)
Check name Status Explanation
Title check ✅ Passed The title starts with the required issue number, clearly describes the homepage rendering changes, and is 51 characters long.
Description check ✅ Passed The description directly explains the homepage memory optimizations, implementation scope, measured results, and validation performed.
Linked Issues check ✅ Passed Issue #562 requires more efficient animated media, responsive image delivery without unnecessary priority or unoptimized, reduced permanent will-change, and one shared FAQ AudioContext. The ch…
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 62 functions across 17 files. (2 skipped: …
No Hardcoded Secrets ✅ Passed No hardcoded secrets were introduced. The changed text blobs contain no credential-shaped string assignments or known API-key/token prefixes, and the 25 added media blobs contain no recognizable secre…
Validated Env Access ✅ Passed No pull-request change introduces a direct process.env access. The added and modified source files contain no process.env lines, and the complete head/base comparison shows the existing accesses a…
No Typescript Escape Hatches ✅ Passed No TypeScript escape hatches were introduced. The 19 changed TypeScript files contain no any tokens, @ts-ignore, @ts-expect-error, or !. non-null assertions.
Full details: Out of Scope Changes check

Explanation

The pull request includes visual-only changes that do not implement issue #562. These changes include navbar gradients, borders, and shadows; About gallery borders and hover zoom; hero apply-button restyling; FAQ gem hover effects; and speaker portrait hover effects.

  • Fix all pre-merge checks with AI
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Warning

Some tools did not complete. Review the errors below.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

apps/2026/src/app/_components/AmbientVideo.tsx

ESLint skipped: missing config or dependency (missing-dependency). The ESLint configuration references a package that is not available in the sandbox.

apps/2026/src/app/_components/ambientVideoSources.ts

ESLint skipped: the matched ESLint configuration already failed (missing-dependency).

apps/2026/src/app/_components/footer/CaveBugs.tsx

ESLint skipped: the matched ESLint configuration already failed (missing-dependency).

  • 15 others

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Note

Quiet mode is enabled, so only the most important comments were posted inline. Other review comments are grouped below.

🟡 Other comments (1)
apps/2026/src/app/_components/sections/speakers/SpeakerShowcase.module.css-134-137 (1)

134-137: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Disable portrait motion for reduced motion.

Add .portraitShell to the reduced-motion transition reset. Also reset its hover and focus transform to none.

🧹 Nitpick comments (1)
apps/2026/src/app/_components/sections/sponsor-team/WaterfallAtmosphere.tsx (1)

138-138: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Remove the per-frame size read.

The initial resize() call and ResizeObserver update the canvas dimensions. Keep the resize() call after pixel-ratio changes. This component has no fallback for an unavailable ResizeObserver, so removing the render-loop call does not remove one.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: QUIET

Plan: Advanced

Run ID: c62dc9c5-f04b-4fad-9eb9-9eeeda3ec803

📥 Commits

Reviewing files that changed from the base of the PR and between 5737bb5 and 872a61e.

⛔ Files ignored due to path filters (16)
  • apps/2026/public/media/homepage/hero-ambient-combined.mov is excluded by !**/*.mov
  • apps/2026/public/media/homepage/hero-ambient-combined.webm is excluded by !**/*.webm
  • apps/2026/public/media/homepage/lenny-blink.mov is excluded by !**/*.mov
  • apps/2026/public/media/homepage/lenny-blink.webm is excluded by !**/*.webm
  • apps/2026/public/media/homepage/waterfall-one-balanced.mov is excluded by !**/*.mov
  • apps/2026/public/media/homepage/waterfall-one-balanced.webm is excluded by !**/*.webm
  • apps/2026/public/media/homepage/waterfall-one-mobile.mov is excluded by !**/*.mov
  • apps/2026/public/media/homepage/waterfall-one-mobile.webm is excluded by !**/*.webm
  • apps/2026/public/media/homepage/waterfall-three-balanced.mov is excluded by !**/*.mov
  • apps/2026/public/media/homepage/waterfall-three-balanced.webm is excluded by !**/*.webm
  • apps/2026/public/media/homepage/waterfall-three-mobile.mov is excluded by !**/*.mov
  • apps/2026/public/media/homepage/waterfall-three-mobile.webm is excluded by !**/*.webm
  • apps/2026/public/media/homepage/waterfall-two-balanced.mov is excluded by !**/*.mov
  • apps/2026/public/media/homepage/waterfall-two-balanced.webm is excluded by !**/*.webm
  • apps/2026/public/media/homepage/waterfall-two-mobile.mov is excluded by !**/*.mov
  • apps/2026/public/media/homepage/waterfall-two-mobile.webm is excluded by !**/*.webm
📒 Files selected for processing (44)
  • .forge/features/homepage-memory/spec.md
  • .forge/features/homepage-memory/srd.md
  • .forge/features/homepage-memory/status.md
  • .forge/features/homepage-memory/test-cases.md
  • apps/2026/public/media/homepage/extended-front-mobile.webp
  • apps/2026/public/media/homepage/extended-front.webp
  • apps/2026/public/media/homepage/faq-static/cave-ceiling-primary.webp
  • apps/2026/public/media/homepage/faq-static/cave-ceiling-secondary.webp
  • apps/2026/public/media/homepage/hero-static/hero-desktop-composite.avif
  • apps/2026/public/media/homepage/hero-static/hero-mobile-7bg.webp
  • apps/2026/public/media/homepage/hero-static/hero-mobile-composite.webp
  • apps/2026/public/media/homepage/lenny-blink-poster.webp
  • apps/2026/public/media/homepage/sponsor-impressink.webp
  • apps/2026/src/app/_components/AmbientVideo.tsx
  • apps/2026/src/app/_components/ambientVideoSources.ts
  • apps/2026/src/app/_components/footer/CaveBugs.module.css
  • apps/2026/src/app/_components/footer/CaveBugs.tsx
  • apps/2026/src/app/_components/navbar/Navbar.module.css
  • apps/2026/src/app/_components/sections/about/AboutCorruption.module.css
  • apps/2026/src/app/_components/sections/about/AboutGallery.tsx
  • apps/2026/src/app/_components/sections/about/AboutSection.module.css
  • apps/2026/src/app/_components/sections/about/AboutSection.tsx
  • apps/2026/src/app/_components/sections/faq/LennyBlink.module.css
  • apps/2026/src/app/_components/sections/faq/LennyBlink.tsx
  • apps/2026/src/app/_components/sections/faq/faq.module.css
  • apps/2026/src/app/_components/sections/faq/faq.tsx
  • apps/2026/src/app/_components/sections/hero/Hero.module.css
  • apps/2026/src/app/_components/sections/hero/Hero.tsx
  • apps/2026/src/app/_components/sections/hero/HeroLayerImage.tsx
  • apps/2026/src/app/_components/sections/hero/layers.ts
  • apps/2026/src/app/_components/sections/speakers/PondAtmosphere.module.css
  • apps/2026/src/app/_components/sections/speakers/PondAtmosphere.tsx
  • apps/2026/src/app/_components/sections/speakers/SpeakerShowcase.module.css
  • apps/2026/src/app/_components/sections/speakers/SpeakerShowcase.tsx
  • apps/2026/src/app/_components/sections/sponsor-team/DeferredWaterfallArt.tsx
  • apps/2026/src/app/_components/sections/sponsor-team/SponsorTeamSection.module.css
  • apps/2026/src/app/_components/sections/sponsor-team/SponsorTeamSection.tsx
  • apps/2026/src/app/_components/sections/sponsor-team/WaterfallAtmosphere.tsx
  • apps/2026/src/app/_components/sections/tracks/TracksSection.module.css
  • apps/2026/src/app/_components/sections/tracks/TracksSection.tsx
  • apps/2026/src/app/_components/sponsor-showcase/SponsorShowcase.tsx
  • apps/2026/src/app/_components/team-cascade/TeamCascadeClient.tsx
  • apps/2026/src/app/_components/useViewportActivity.ts
  • apps/2026/src/app/page.module.css
💤 Files with no reviewable changes (3)
  • apps/2026/src/app/_components/sections/tracks/TracksSection.tsx
  • apps/2026/src/app/_components/sections/hero/layers.ts
  • apps/2026/src/app/_components/sections/hero/HeroLayerImage.tsx

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.

Comment on lines 96 to 97
fetchPriority={index === activeImageIndex ? "high" : "low"}
loading="eager"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚀 Performance & Scalability | 🟠 Major | ⚡ Quick win

🔎 Supported by static analysis

🏁 Script executed:

#!/bin/bash
set -eu
file="apps/2026/src/app/_components/sections/about/AboutGallery.tsx"
printf '%s\n' '--- component ---'
cat -n "$file"
printf '%s\n' '--- Image imports and related usage ---'
rg -n -C 3 'next/image|<Image|loadedImageIndexes|activeImageIndex|AboutGallery' apps/2026/src/app/_components/sections/about apps/2026/package.json package.json 2>/dev/null || true

Repository: KnightHacks/forge

Length of output: 16965


🤖 get_repo_knowledge executed:

get_repo_knowledge KnightHacks/forge /tmp/coderabbit-repo-knowledge/knighthacks-forge-24c72cfe/conventions /tmp/coderabbit-repo-knowledge/knighthacks-forge-24c72cfe/learnings

Length of output: 19278


🏁 Script executed:

#!/bin/bash
set -eu
printf '%s\n' '--- parent section ---'
cat -n apps/2026/src/app/_components/sections/about/AboutSection.tsx
printf '%s\n' '--- viewport hook ---'
cat -n apps/2026/src/app/_components/useViewportActivity.ts 2>/dev/null || rg -l 'function useViewportActivity|const useViewportActivity' apps/2026/src/app/_components | head -1 | xargs -r cat -n
printf '%s\n' '--- relevant CSS ---'
cat -n apps/2026/src/app/_components/sections/about/AboutSection.module.css | sed -n '1,260p'
printf '%s\n' '--- Next version ---'
rg -n '"next"|next@' apps/2026/package.json package.json pnpm-lock.yaml | head -20

Repository: KnightHacks/forge

Length of output: 17525


🌐 Web query:

Next.js Image component loading eager lazy fetchPriority official documentation

💡 Result:

In Next.js, the next/image component manages image loading behavior through several props. As of September 2026, there have been updates to how these are defined [1]. The loading attribute The loading prop accepts 'lazy' or 'eager' [2][3]. By default, next/image uses loading="lazy" [2][4]. - 'lazy': The browser waits to load the image until it nears the viewport [4]. - 'eager': The image is loaded immediately upon discovery [2]. Using loading="eager" is generally recommended for images above the fold to improve Largest Contentful Paint (LCP) performance; using it for images outside the viewport can negatively impact performance [2]. The priority and preload props The priority prop has been the standard way to opt-in to eager loading and browser preloading for critical images [2]. However, recent updates have introduced a preload prop as a more explicit alternative, with the priority prop now deprecated [1]. When priority (or preload) is used, the image is automatically treated as loading="eager" and is preloaded by the browser, rendering the loading prop redundant or invalid if both are provided [2][3]. The fetchPriority attribute The fetchPriority prop (which maps to the standard HTML fetchpriority attribute) can be used to provide a hint to the browser regarding the relative priority of the image download [4]. While loading determines if an image should be fetched based on viewport position, fetchPriority influences the urgency of the download once the browser has decided to fetch it [4]. For critical images where you wish to signal higher importance, you can set fetchPriority="high" [2][4]. Summary of recommendations: - For LCP/Above-the-fold images: Use the preload prop (or priority if on an older version) and consider fetchPriority="high" to optimize loading speed [4][1]. - For below-the-fold images: Allow the default loading="lazy" behavior to persist to save bandwidth and improve page performance [2][4].

Citations:


Defer gallery image requests.

loadedImageIndexes renders images 0 and 1 on the initial render, before isGalleryActive becomes true. Both use loading="eager", and image 0 receives fetchPriority="high". Use loading="lazy" or viewport-gated rendering, and reserve high priority for the hero image.

Source: Coding guidelines

Comment thread apps/2026/src/app/_components/sections/faq/faq.tsx
alt=""
fill
sizes="100vw"
unoptimized

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚀 Performance & Scalability | 🟠 Major | ⚡ Quick win

🔎 Supported by static analysis

🏁 Script executed:

#!/bin/bash
set -eu
printf '%s\n' '--- Hero imports and image context ---'
sed -n '1,130p' apps/2026/src/app/_components/sections/hero/Hero.tsx
printf '%s\n' '--- FAQ imports and image context ---'
sed -n '1,45p' apps/2026/src/app/_components/sections/faq/faq.tsx
sed -n '720,780p' apps/2026/src/app/_components/sections/faq/faq.tsx
printf '%s\n' '--- package/version bindings ---'
rg -n '"next"|from ["'\'']next/image["'\'']|<Image|unoptimized' apps/2026/package.json apps/2026/src/app/_components/sections/hero/Hero.tsx apps/2026/src/app/_components/sections/faq/faq.tsx

Repository: KnightHacks/forge

Length of output: 8206


🤖 get_repo_knowledge executed:

get_repo_knowledge KnightHacks/forge /tmp/coderabbit-repo-knowledge/knighthacks-forge-24c72cfe/conventions

Length of output: 7088


🏁 Script executed:

#!/bin/bash
set -eu
printf '%s\n' '--- FAQ asset definitions ---'
rg -n -A24 -B6 'type FloatingAsset|const .*assets|src:|sizes:' apps/2026/src/app/_components/sections/faq/faq.tsx
printf '%s\n' '--- image-related CSS ---'
rg -n -A12 -B6 'mobileHeroCompositeLayer|floatingAsset|img|object-fit|width:|height:' apps/2026/src/app/_components/sections/hero/Hero.module.css apps/2026/src/app/_components/sections/faq/faq.module.css
printf '%s\n' '--- local image files and metadata ---'
find apps/2026/public/media -type f \\( -iname '*.webp' -o -iname '*.png' -o -iname '*.jpg' -o -iname '*.jpeg' \\) -print | sort | head -80
find apps/2026/public/media -type f \\( -iname '*.webp' -o -iname '*.png' -o -iname '*.jpg' -o -iname '*.jpeg' \\) -print0 | xargs -0 file | rg 'hero|faq|cave|gem' | head -80

Repository: KnightHacks/forge

Length of output: 50373


🌐 Web query:

Next.js 16 Image unoptimized prop official documentation

💡 Result:

In Next.js 16, the unoptimized prop remains a standard feature of the next/image component, used to disable automatic image optimization [1][2]. When the unoptimized prop is set to true on an Image component, the source image is served as-is, bypassing any transformation of quality, size, or format [1][3][2]. This is particularly useful for: - Vector images (SVG): Next.js typically recommends using unoptimized for SVGs to ensure they retain their lossless vector properties [1][2]. - Small images: Images that do not benefit significantly from optimization (e.g., those under 1KB) [1][2]. - Animated images: While Next.js makes a best-effort attempt to automatically bypass optimization for animated files (such as GIF, APNG, and WebP), the unoptimized prop can be used to explicitly force this behavior for a specific image [1][2]. - Authenticated images: The default Image Optimization API does not forward request headers when fetching a source image. If an image requires authentication to be accessed, using the unoptimized prop allows it to be served directly [4][1]. Global Configuration You can also disable Image Optimization for all images in your application by updating your configuration file (next.config.js or next.config.ts) [5][1][2]: module.exports = { images: { unoptimized: true, }, } If both the component-level prop and the global configuration are used, the global configuration acts as a master setting that overrides individual component props [5].

Citations:


🏁 Script executed:

#!/bin/bash
set -eu
printf '%s\n' '--- FAQ local asset declarations ---'
sed -n '249,340p' apps/2026/src/app/_components/sections/faq/faq.tsx
printf '%s\n' '--- FAQ floating asset layout ---'
rg -n -A30 -B5 '^\.floatingAsset|floatingAsset' apps/2026/src/app/_components/sections/faq/faq.module.css
printf '%s\n' '--- Hero and FAQ local image metadata ---'
for f in \
  apps/2026/public/media/homepage/hero-static/hero-mobile-composite.webp \
  apps/2026/public/media/homepage/faq-static/cave-ceiling-primary.webp \
  apps/2026/public/media/homepage/faq-static/cave-ceiling-secondary.webp
do
  if [ -f "$f" ]; then
    file "$f"
    wc -c "$f"
  else
    printf 'missing: %s\n' "$f"
  fi
done

Repository: KnightHacks/forge

Length of output: 5704


Remove unoptimized from both local next/image usages. These responsive images use fill/sizes or responsive CSS widths, but unoptimized serves the original files without size or format optimization. Let next/image optimize them, or provide explicit responsive sources.

📍 Affects 2 files
  • apps/2026/src/app/_components/sections/hero/Hero.tsx#L94-L94 (this comment)
  • apps/2026/src/app/_components/sections/faq/faq.tsx#L759-L759

@GodlyDonuts

Copy link
Copy Markdown
Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Sep 12, 2026

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@GodlyDonuts

Copy link
Copy Markdown
Author

coderabbit when it has to do something useful

nonono

…memory

# Conflicts:
#	apps/2026/src/app/_components/sections/sponsor-team/SponsorTeamSection.module.css
#	apps/2026/src/app/_components/sections/sponsor-team/SponsorTeamSection.tsx
#	apps/2026/src/app/_components/sponsor-showcase/SponsorShowcase.tsx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Reduce KHIX homepage memory usage

1 participant