Skip to content

[#553] Add Saicharan Ramineni developer application - #554

Open
GodlyDonuts wants to merge 3 commits into
KnightHacks:mainfrom
GodlyDonuts:blade/saicharan-ramineni
Open

[#553] Add Saicharan Ramineni developer application#554
GodlyDonuts wants to merge 3 commits into
KnightHacks:mainfrom
GodlyDonuts:blade/saicharan-ramineni

Conversation

@GodlyDonuts

@GodlyDonuts GodlyDonuts commented Sep 9, 2026

Copy link
Copy Markdown

Why

Submit Saicharan Ramineni's developer application as a public Blade route.

What

Closes: #553

  • Adds /saicharan-ramineni: a custom 3D Tech Knight is pulled into a black hole, revealing the live portfolio.
  • Includes skip, reduced-motion, loading, and WebGL-failure states.
  • Adds a fixed-source bridge because the portfolio blocks direct iframe embedding.
Opening Transition Portfolio
Tech Knight Black-hole transition Portfolio

Test Plan

  • pnpm format
  • NODE_OPTIONS=--max-old-space-size=8192 pnpm lint
  • NODE_OPTIONS=--max-old-space-size=8192 pnpm typecheck
  • pnpm analyze:react:changed
  • pnpm --filter=@forge/blade build
  • Browser QA at desktop and 320px; route and bridge return HTTP 200.

Checklist

  • Database: No schema changes, OR I ran pnpm db:generate and committed the generated files in packages/db/drizzle/
  • Environment Variables: No environment variables changed, OR I have contacted the Development Lead to modify them on Coolify BEFORE merging.

GodlyDonuts and others added 3 commits September 8, 2026 21:54
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
@GodlyDonuts
GodlyDonuts marked this pull request as ready for review September 9, 2026 09:36
@GodlyDonuts
GodlyDonuts requested a review from a team as a code owner September 9, 2026 09:36
@coderabbitai

coderabbitai Bot commented Sep 9, 2026

Copy link
Copy Markdown

Review Change StackReview Change Stack

📝 Walkthrough

Walkthrough

Adds the public /saicharan-ramineni Blade route. The route renders a generated Tech Knight GLB in a Three.js black-hole sequence. It supports responsive layouts, reduced motion, skip behavior, and WebGL or model failure fallback. A sandboxed iframe loads the personal portfolio through a cached server bridge that rewrites external HTML and scripts. Blender scripts reproduce the GLB asset. Feature specifications and test cases document the implementation.

Priority: ➖ Normal

Merge Risk: 🟠 High · up to 0178f

A compromised portfolio dependency could access Blade-origin state, and upstream or WebGL failures can leave visitors with blank or inaccessible content. These issues should be corrected before merge.

🚥 Pre-merge checks | ✅ 6 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 48 functions across 10 files. (7 skipped: … Write docstrings for the functions missing them to satisfy the coverage threshold.
Validated Env Access ⚠️ Warning apps/blade/scripts/generate-tech-knight-model.mjs:6 directly reads process.env.BLENDER_BIN. The file is a new pull-request file and is neither env.ts nor a *.config.* file. Move the environmen… Remove the direct process.env.BLENDER_BIN access from generate-tech-knight-model.mjs. Put the BLENDER_BIN lookup in a *.config.* file or expose it through the validated env import, then use that value in the generator script.
✅ Passed checks (6 passed)
Check name Status Explanation
Title check ✅ Passed The title starts with [#553], describes the developer application, and is 51 characters long.
Description check ✅ Passed The description directly explains the route, 3D experience, portfolio bridge, fallback states, and validation plan.
Linked Issues check ✅ Passed The changes implement issue #553: the public route, reproducible Blender and GLB generation, Three.js entrance, portfolio iframe handoff, reduced-motion and WebGL-failure handling, and Blade-scoped de…
Out of Scope Changes check ✅ Passed The changes remain within Blade, feature documentation, generator scripts, and required Three.js dependencies. No unrelated scope is evident.
No Hardcoded Secrets ✅ Passed No hardcoded API key, password, token, or secret appears in the feature changes. The only URL literals are public portfolio and résumé URLs. The feature uses no credential literals or secret-shaped va…
No Typescript Escape Hatches ✅ Passed No introduced TypeScript escape hatches were found. The PR diff contains no any type, @ts-ignore, @ts-expect-error, or non-null assertion. The only any token is the existing API method call `A…
Full details: Docstring Coverage

Explanation

Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 48 functions across 10 files. (7 skipped: 7 unsupported.)

Full details: Validated Env Access

Explanation

apps/blade/scripts/generate-tech-knight-model.mjs:6 directly reads process.env.BLENDER_BIN. The file is a new pull-request file and is neither env.ts nor a *.config.* file. Move the environment read into an allowed config file or access it through the validated env module.

  • 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/blade/package.json

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

apps/blade/scripts/generate-tech-knight-model.mjs

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

apps/blade/src/app/_components/applications/saicharan-portfolio-gate.tsx

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

  • 9 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: 4

Note

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

🟡 Other comments (3)
apps/blade/src/app/_components/applications/tech-knight-arrival-shaders.ts-54-54 (1)

54-54: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use an increasing edge order for smoothstep.

smoothstep(0.96, 0.24, discRadius) has undefined results in GLSL ES. Replace it with (1.0 - smoothstep(0.24, 0.96, discRadius)).

apps/blade/scripts/generate-tech-knight-model.py-94-96 (1)

94-96: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Reverse the prism_xz side-face winding.

For counter-clockwise x-z points such as Faceplate, (index, following, following + count, index + count) produces inward-facing side normals. Use the outward-facing order:

🐛 Proposed fix for the side winding
     for index in range(count):
         following = (index + 1) % count
-        faces.append((index, following, following + count, index + count))
+        faces.append((index, index + count, following + count, following))
.forge/features/saicharan-blade-portfolio/test-cases.md-7-7 (1)

7-7: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Keep the server bridge in the test scope.

test-cases.md is the behavioral source for implementation and test-generation workflows. TC-005 exercises GET /saicharan-ramineni/site, so the exclusion of backend behavior can omit or reject these bridge checks. Exclude authentication and unrelated backend behavior instead, or remove the bridge checks from TC-005.

🧹 Nitpick comments (1)
apps/blade/src/app/_components/applications/tech-knight-journey.module.css (1)

11-11: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Map the scene palette to design-system tokens.

This module introduces a new palette of raw hex and rgb() literals (#010207, #7fe9ff, rgb(185 207 218 / 72%)). The Blade guidelines require using apps/blade/DESIGN_SYSTEM.md tokens before adding new design decisions. Define the scene-specific values as local custom properties derived from existing tokens, or document the exception.

Source: Coding guidelines


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: QUIET

Plan: Advanced

Run ID: 8b11021c-51c3-46b4-9057-bd03d8baeda7

📥 Commits

Reviewing files that changed from the base of the PR and between d22c913 and 0178f3d.

⛔ Files ignored due to path filters (4)
  • .forge/features/saicharan-blade-portfolio/portfolio-handoff.jpg is excluded by !**/*.jpg
  • .forge/features/saicharan-blade-portfolio/tech-knight-extraction.jpg is excluded by !**/*.jpg
  • .forge/features/saicharan-blade-portfolio/tech-knight-preview.jpg is excluded by !**/*.jpg
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml, !pnpm-lock.yaml
📒 Files selected for processing (18)
  • .forge/features/saicharan-blade-portfolio/spec.md
  • .forge/features/saicharan-blade-portfolio/srd.md
  • .forge/features/saicharan-blade-portfolio/status.md
  • .forge/features/saicharan-blade-portfolio/test-cases.md
  • apps/blade/package.json
  • apps/blade/public/saicharan/tech-knight.glb
  • apps/blade/scripts/generate-tech-knight-model.mjs
  • apps/blade/scripts/generate-tech-knight-model.py
  • apps/blade/src/app/_components/applications/saicharan-portfolio-gate.tsx
  • apps/blade/src/app/_components/applications/saicharan-portfolio.module.css
  • apps/blade/src/app/_components/applications/tech-knight-arrival-shaders.ts
  • apps/blade/src/app/_components/applications/tech-knight-black-hole-effects.ts
  • apps/blade/src/app/_components/applications/tech-knight-journey-markup.tsx
  • apps/blade/src/app/_components/applications/tech-knight-journey.module.css
  • apps/blade/src/app/_components/applications/tech-knight-journey.tsx
  • apps/blade/src/app/_components/applications/tech-knight-model-materials.ts
  • apps/blade/src/app/saicharan-ramineni/page.tsx
  • apps/blade/src/app/saicharan-ramineni/site/route.ts

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


The App Router page renders a Blade-local client gate. Its cinematic component initializes Three.js, loads and normalizes the Blender-authored `.glb` Tech Knight, and begins with the real model fully visible at a viewport-filling scale. A time-based sequence holds that hero composition, forms a shader-driven accretion disc and event horizon behind the model, bends stars and particle trails toward the core, then moves, stretches, rotates, dims, and shrinks the live GLB into the singularity. Dynamic rim lights, spatial rings, lensing geometry, a terminal energy flash, and Unreal bloom support the departure without a raster placeholder.

The full-viewport sandboxed iframe begins loading behind the cinematic layer. Once the model reaches the event horizon and the iframe is ready, the gate expands a circular clip from the singularity's screen position until the personal site occupies the viewport; the Three.js layer fades only after the reveal is established. `GET /saicharan-ramineni/site` fetches only the fixed personal-site origin, injects a base URL for remote assets, omits the upstream `X-Frame-Options: DENY` header, and returns cached HTML. Because Cloudflare Rocket Loader rewrites the portfolio's scripts to request-scoped inert MIME types, the bridge restores those scripts to `text/javascript`, removes their loader metadata, and omits the redundant Rocket Loader script. A narrow history guard retries cross-origin `pushState` and `replaceState` calls without a URL, preventing Next.js from resolving the local bridge path against the remote base URL. This lets the original portfolio hydrate and run its Gargantua WebGL renderer unchanged. Hash navigation stays inside the frame; route links open on the personal-site origin. The fixed-source frame grants scripts and same-origin access so its runtime can use the browser APIs it requires.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🛡️ Analyzed with Security Review | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

sed -n '1,140p' apps/blade/src/app/_components/applications/saicharan-portfolio-gate.tsx
printf '\n--- route ---\n'
sed -n '1,120p' apps/blade/src/app/saicharan-ramineni/site/route.ts

Repository: KnightHacks/forge

Length of output: 5797


🤖 get_repo_knowledge executed:

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

Length of output: 3924


🏁 Script executed:

sed -n '1,140p' apps/blade/src/app/_components/applications/saicharan-portfolio-gate.tsx
sed -n '1,120p' apps/blade/src/app/saicharan-ramineni/site/route.ts

Repository: KnightHacks/forge

Length of output: 5782


Security Misconfiguration

Reachability: External
Exploitability: Moderate
CWE: CWE-829 — Inclusion of Functionality from Untrusted Control Sphere

Serve the bridged portfolio from a separate origin.

allow-scripts with allow-same-origin lets a compromised portfolio script access same-origin Blade state through window.parent.

const revealPortfolio = revealRequested && portfolioReady;

useEffect(() => {
const timeout = window.setTimeout(() => setPortfolioReady(true), 3000);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Do not mark the portfolio ready before it loads.

  • apps/blade/src/app/_components/applications/saicharan-portfolio-gate.tsx#L17-L17: Set portfolioReady only from iframe.onLoad. Use the deadline for a visible failure state, not readiness.
  • apps/blade/src/app/saicharan-ramineni/site/route.ts#L68-L68: Apply a fetch deadline and return unavailableResponse() when the upstream does not respond.
📍 Affects 2 files
  • apps/blade/src/app/_components/applications/saicharan-portfolio-gate.tsx#L17-L17 (this comment)
  • apps/blade/src/app/saicharan-ramineni/site/route.ts#L68-L68

Comment on lines +16 to +18
.journey[data-model-ready="true"] {
opacity: 1;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Reveal the journey on the failure paths.

.journey stays at opacity: 0 unless data-model-ready="true" is set. tech-knight-journey.tsx never sets that attribute when the model fails to load (it sets data-model-error) or when createRenderer returns undefined. In both cases the section stays invisible while it remains mounted, so the h1, the identity text, and the focusable header links are hidden but still reachable by keyboard.

♻️ Proposed change
 .journey[data-model-ready="true"] {
   opacity: 1;
 }
+
+.journey[data-model-error="true"],
+.journey[data-webgl-error="true"] {
+  opacity: 1;
+}

In tech-knight-journey.tsx, set the matching flag in the WebGL failure branch:

   const renderer = createRenderer(canvas);
   if (!renderer) {
+    journey.dataset.webglError = "true";
     options.onFailure();
     return;
   }

Source: Path instructions

});
if (!response.ok) return unavailableResponse();
const document = injectFrameBridge(await response.text());
return new Response(document, {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🛡️ Analyzed with Security Review | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -eu
printf '%s\n' '--- route.ts ---'
sed -n '1,130p' apps/blade/src/app/saicharan-ramineni/site/route.ts
printf '%s\n' '--- saicharan-portfolio-gate.tsx ---'
sed -n '1,100p' apps/blade/src/app/_components/applications/saicharan-portfolio-gate.tsx

Repository: KnightHacks/forge

Length of output: 5836


🤖 get_repo_knowledge executed:

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

Length of output: 19543


XSS

Reachability: External
Exploitability: Difficult
CWE: CWE-79 — Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

Isolate the proxied document from the Blade origin.

The route serves external HTML at the Blade origin, and the iframe enables both allow-scripts and allow-same-origin. Remove allow-same-origin, or serve the document from a separate origin before allowing scripts.

📍 Affects 2 files
  • apps/blade/src/app/saicharan-ramineni/site/route.ts#L74-L74 (this comment)
  • apps/blade/src/app/_components/applications/saicharan-portfolio-gate.tsx#L46-L46

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.

Add Saicharan Ramineni developer application to Blade

1 participant