Skip to content

Add Argus AI project, update resume, and revamp boot screen#2

Open
sisodiajatin wants to merge 2 commits into
mainfrom
feat/argus-project-and-resume-update
Open

Add Argus AI project, update resume, and revamp boot screen#2
sisodiajatin wants to merge 2 commits into
mainfrom
feat/argus-project-and-resume-update

Conversation

@sisodiajatin

@sisodiajatin sisodiajatin commented Feb 26, 2026

Copy link
Copy Markdown
Owner

Summary

  • New project: Added Argus AI Code Review Assistant with project description, GitHub repo link, and screenshot
  • Resume update: Replaced resume PDF with updated Jatin_Sisodia-SE.pdf and fixed download links
  • Boot screen overhaul: Replaced Apple-style loading screen with a retro BIOS/CRT boot animation featuring typewriter text, memory test, and scanline effects
  • Desktop layout: Switched project folder icons from absolute positioning to a flex column layout for better consistency; reordered folder positions

Test plan

  • Verify boot screen animation plays correctly on load
  • Confirm Argus project folder opens with correct description, GitHub link, and image
  • Test resume download button links to the correct updated PDF
  • Check desktop icon layout renders properly at various screen sizes

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Rich animated boot sequence with CRT/retro visuals, per-character typing and memory-test effects.
    • New interactive UI pieces: spotlight effect, reusable card components, and an embedded 3D scene component.
    • Added a showcase card that pairs text with an embedded 3D scene.
  • Updates

    • Live wallpaper replaced with a Spline-based scene; home layout and visuals refined.
    • Project positions updated and Argus AI project added.
    • Resume PDF and dark background updated.

- Add Argus AI Code Review Assistant as a new project with description,
  GitHub link, and screenshot
- Update resume PDF to Jatin_Sisodia-SE.pdf and wire up download link
- Replace Apple-style boot screen with retro BIOS/CRT boot animation
- Switch desktop icons from absolute positioning to flex column layout
- Reorder project folder positions on desktop

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@vercel

vercel Bot commented Feb 26, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
mac-os-portfolio Ready Ready Preview, Comment Mar 4, 2026 11:31pm

@coderabbitai

coderabbitai Bot commented Feb 26, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

Replaces the boot UI with a staged, per-character animated boot sequence; adds Spline-based live wallpaper, new UI primitives (Card, Spotlight, SplineSceneBasic, Spline loader), Tailwind class utilities and CRT-style CSS, adds Argus project entry, updates dependencies and resume PDF reference, and minor Home component class changes.

Changes

Cohort / File(s) Summary
Deps & HTML
package.json, index.html
Added dependencies framer-motion and tailwind-merge, devDependency baseline-browser-mapping; set body background to dark inline style.
Boot screen & CSS
src/components/BootScreen.jsx, src/index.css
Full rewrite of BootScreen to a multi-phase, per-character typing boot flow (poweron→bios→memtest→post→final→fade) with cursor, scrolling refs, abortable async typing, and GSAP fade; extensive CRT/retro styling, animations, scanlines, glow classes, and dark-mode adjustments in CSS.
Live wallpaper & 3D UI
src/components/LiveWallpaper.jsx, src/components/ui/splite.jsx, src/components/ui/SplineSceneBasic.jsx
Replaced shader wallpaper with SplineScene-based scene; added lazy Spline loader and a new SplineSceneBasic Card component embedding a Spline scene.
UI primitives
src/components/ui/card.jsx, src/components/ui/spotlight.jsx, src/lib/utils.js
Added composable Card components (Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter); introduced Spotlight (framer-motion mouse-follow) and cn util combining clsx + twMerge.
App & Home adjustments
src/App.jsx, src/components/Home.jsx
Removed darkMode prop from LiveWallpaper; main element opacity tied to boot completion; removed clsx import in Home and replaced dynamic windowPosition-based class with static group folder.
Content & Resume
src/constants/index.js, src/windows/Resume.jsx
Inserted Argus AI project (id 8) and adjusted project position entries; updated resume href to /files/Jatin_Sisodia-SE.pdf and Resume component references.

Sequence Diagram(s)

sequenceDiagram
  participant App
  participant BootScreen
  participant DOM as ScreenRef
  participant GSAP
  participant Main as AppMain

  App->>BootScreen: mount + start boot sequence
  BootScreen->>DOM: render phased lines (typing per-character)
  BootScreen->>DOM: update memtest progress & scroll
  BootScreen-->>BootScreen: detect sequence complete
  BootScreen->>GSAP: trigger fade animation on ScreenRef
  GSAP->>DOM: animate opacity/fade-out
  GSAP->>App: onComplete callback
  App->>Main: set main opacity → 1 (reveal UI)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • Feat/welcome #1: Overlaps changes to package.json, index.html, src/App.jsx, src/components/Home.jsx, and src/index.css; strong code-level overlap with styling and layout edits.

Poem

🐰
I typed each boot line with a twitching ear,
CRT sparks and memtests shining clear,
Argus hops in with a clever review,
Cards and spotlights dance in a spline-y view,
Hooray — the rabbit fades the screen to cheer!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the three main changes: adding the Argus AI project, updating the resume, and revamping the boot screen with retro BIOS/CRT animations.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/argus-project-and-resume-update

Tip

Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs).
Share your feedback on Discord.


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 and usage tips.

}
}, [completedLines, typingLine, memValue]);

const sleep = useCallback(

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Potential Memory Leak in sleep Function

⚡ Performance | Severity: warning

The sleep function uses setTimeout and setInterval, which can cause memory leaks if not properly cleared. Although clearInterval and clearTimeout are used, it's essential to ensure they are always called to prevent potential issues.

Suggested fix:
Consider using a more modern approach to handle asynchronous delays, such as using async/await with Promises.

const bottomRef = useRef(null);
const abortRef = useRef(false);

useEffect(() => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Interval Not Cleared in Error Cases

⚡ Performance | Severity: warning

The interval for toggling the cursor is not cleared in case of an error or when the component is unmounted. This could lead to memory leaks or unexpected behavior.

Suggested fix:
Ensure that the interval is cleared in all cases, including when the component is unmounted or an error occurs.

Comment thread src/constants/index.js
},

// ▶ Project 3
{

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 Potential Information Disclosure

🔒 Security | Severity: suggestion

The addition of a new project with a link to a GitHub repository may potentially disclose sensitive information if the repository is not properly secured.

Suggested fix:
Ensure that the linked repository does not contain sensitive information and is properly secured.

Comment thread src/constants/index.js
fileType: "pdf",
// you can add `href` if you want to open a hosted resume
// href: "/your/resume/path.pdf",
href: "/files/Jatin_Sisodia-SE.pdf",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 Resume File Link

🔒 Security | Severity: suggestion

The resume file link is now hosted locally. Ensure that the file does not contain sensitive information and is properly secured.

Suggested change
href: "/files/Jatin_Sisodia-SE.pdf",
Review the resume file for sensitive information and consider hosting it securely or using a different method for sharing it.

Comment thread src/index.css
@apply fixed top-12 left-4 bottom-20 z-0 max-sm:hidden;

ul {
@apply flex flex-col gap-2 h-full content-start;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 CSS Class Naming Convention

✨ Style | Severity: suggestion

The CSS class names could be more descriptive and follow a consistent naming convention. For example, instead of .bios-gray, consider using a more descriptive name like .bios-text-gray.

Suggested fix:
Consider renaming CSS classes to follow a consistent naming convention, e.g., .bios-text-gray instead of .bios-gray.

Comment thread src/index.css
@apply fixed inset-0 z-[9999] bg-black flex flex-col items-center justify-center gap-8;
@apply fixed inset-0 z-[9999];
background: #0a0a0e;
animation: crt-flicker 0.15s ease-in-out 0.3s 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.

🟡 Animation Performance

⚡ Performance | Severity: warning

The animation crt-flicker may cause performance issues if not optimized properly. Consider using will-change property or optimizing the animation to reduce the number of repaints.

Suggested fix:
Add will-change property to the animated element or optimize the animation to reduce the number of repaints.

Comment thread src/windows/Resume.jsx
<h2>Resume.pdf</h2>

<a href="files/Jatin_Sisodia.pdf" download className="cursor-pointer" title="Download Resume">
<a href="files/Jatin_Sisodia-SE.pdf" download className="cursor-pointer" title="Download Resume">

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Potential Download Link Issue

🐛 Bug | Severity: warning

The download link may not work as expected if the file path is incorrect. Consider using a more robust way to handle file downloads.

Suggested fix:
Verify the file path and consider using a library or a more robust way to handle file downloads.

Comment thread src/components/Home.jsx
<li
key={project.id}
className={clsx("group folder", project.windowPosition)}
className="group folder"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 Class Name Removal

✨ Style | Severity: suggestion

The clsx import is removed, but the className attribute is still used. Consider removing or replacing the className attribute to avoid confusion.

Suggested fix:
Remove or replace the className attribute to avoid confusion.

Comment thread package.json
"@types/react": "^19.2.5",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^5.1.1",
"baseline-browser-mapping": "^2.10.0",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 Unused Dependency

✨ Style | Severity: suggestion

The baseline-browser-mapping dependency may not be used in the project. Consider removing unused dependencies to keep the project clean.

Suggested fix:
Remove unused dependencies to keep the project clean.

@ai-codereview-assistant

ai-codereview-assistant Bot commented Feb 26, 2026

Copy link
Copy Markdown

👁️ Argus Code Review

PR Summary

What this PR does

This PR introduces a new Argus AI project, updates the resume, and revamps the boot screen to mimic a retro BIOS boot sequence. The boot screen now displays a simulated boot process with various system checks and loading animations. The changes aim to enhance the overall user experience and add a unique touch to the portfolio.

Key changes

  • Introduces a new Argus AI project
  • Updates the resume with latest information
  • Revamps the boot screen with a retro BIOS boot sequence
  • Adds a simulated system check and loading animation to the boot screen
  • Implements a typing effect for the boot sequence text
  • Includes a memory test and system initialization simulation
  • Updates the UI components to support the new boot screen design
  • Modifies the package.json and index.html files to reflect the changes

Notable decisions

The decision to use a retro BIOS boot sequence as the new boot screen design is notable, as it adds a unique and nostalgic touch to the portfolio. The use of a simulated system check and loading animation also enhances the overall user experience.

Status: 🟡 Minor issues found

Severity Count
🟡 Warning 3
🟢 Suggestion 6

Top Findings

  • 🟡 Potential Memory Leak in sleep Function (⚡ Performance) — src/components/BootScreen.jsx:102
  • 🟡 Removed darkMode prop (🐛 Bug) — src/components/LiveWallpaper.jsx:3
  • 🟡 Lazy loading of Spline component (⚡ Performance) — src/components/ui/splite.jsx:6

Summary

Code Review Summary

The pull request introduces significant changes to the codebase, including the addition of the Argus AI project, updates to the resume, and a revamp of the boot screen. Overall, the changes are substantial, but there are several issues that need to be addressed to ensure the code is maintainable, efficient, and reliable.

Key Issues

  • 🔴 Bug: The removal of the darkMode prop from the LiveWallpaper component may cause functionality issues and should be investigated.
  • 🟡 Warnings:
    • Potential memory leak in the sleep function due to improper clearance of setTimeout and setInterval.
    • Lazy loading of the Spline component may cause performance issues if not properly optimized.

Suggestions for Improvement

  • 🟢 Performance:
    • Optimize the interval for cursor blinking to improve performance or consistency with typical terminal experiences.
    • Consider extracting a function for adding and removing event listeners to prevent code duplication.
  • 🟢 Code Style:
    • Flatten deeply nested objects in constants for better readability and maintainability.
    • Add error handling for the new SplineScene component.
    • Avoid using inline styles and instead use CSS classes.
    • Add comments for complex CSS code, such as the new keyframes animation.

Positive Observations

  • ✅ The addition of the Argus AI project and updates to the resume are significant improvements to the codebase.
  • ✅ The revamp of the boot screen is a notable enhancement to the user experience.

Reviewed commit a6db0f7 • 17 files • 9 findings • 46.0s • Powered by Argus

@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

🧹 Nitpick comments (1)
src/components/BootScreen.jsx (1)

204-204: Consider stabilizing onComplete to prevent boot sequence restarts.

If the parent component doesn't memoize onComplete, every parent re-render creates a new function reference, causing this effect to re-run and restart the entire boot sequence from the beginning.

♻️ Option 1: Use a ref to store the callback
+    const onCompleteRef = useRef(onComplete);
+    useEffect(() => {
+        onCompleteRef.current = onComplete;
+    }, [onComplete]);

     useEffect(() => {
         abortRef.current = false;
         // ... rest of effect
         gsap.to(screenRef.current, {
             opacity: 0,
             duration: 0.4,
             ease: "power2.inOut",
-            onComplete: () => onComplete?.(),
+            onComplete: () => onCompleteRef.current?.(),
         });
         // ...
-    }, [onComplete, sleep]);
+    }, [sleep]);
♻️ Option 2: Document that parent should memoize the callback

Add a comment at the component definition:

/**
 * `@param` {Object} props
 * `@param` {() => void} props.onComplete - Called when boot animation completes.
 *   Should be memoized (useCallback) to prevent animation restarts on parent re-renders.
 */
const BootScreen = ({ onComplete }) => {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/BootScreen.jsx` at line 204, The effect in BootScreen re-runs
when the parent passes a new onComplete reference; fix by stabilizing the
callback: inside BootScreen create a ref (e.g., onCompleteRef) and update it in
a small useEffect when the onComplete prop changes, then use
onCompleteRef.current inside the boot sequence effect so the effect's dependency
list can omit onComplete (keep sleep if needed); reference the BootScreen
component, the effect that currently lists [onComplete, sleep], and the new
onCompleteRef to locate and change the code.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@package.json`:
- Line 38: Remove the redundant devDependency "baseline-browser-mapping" from
package.json (the entry "baseline-browser-mapping": "^2.10.0") because it is
provided transitively by browserslist; delete that dependency entry from the
devDependencies block, then update the lockfile by running your package manager
(e.g., npm install or npm ci) and run the test/build pipeline to verify nothing
breaks; keep a note that browserslist is the transitive provider so no code
changes are required.

In `@src/components/BootScreen.jsx`:
- Around line 102-115: The sleep function (useCallback named sleep) leaks
intervals because cid is only cleared when abortRef.current is true; update the
Promise executor to always clear the interval and timeout when resolving: on
normal timeout resolution clearInterval(cid) and clearTimeout(tid) before
resolve, and in the abort branch also clear both; ensure both tid and cid are
referenced in both paths so the interval is not left running after the Promise
resolves in BootScreen.jsx (sleep, abortRef, tid, cid).

In `@src/windows/Resume.jsx`:
- Around line 21-25: Update the resume file paths to use the absolute path with
a leading slash to match RESUME_LOCATION; specifically change the anchor href
(the <a> with title "Download Resume") and the Document component's file prop
(Document file="...") from "files/Jatin_Sisodia-SE.pdf" to
"/files/Jatin_Sisodia-SE.pdf" so links work reliably across routes and
deployments.

---

Nitpick comments:
In `@src/components/BootScreen.jsx`:
- Line 204: The effect in BootScreen re-runs when the parent passes a new
onComplete reference; fix by stabilizing the callback: inside BootScreen create
a ref (e.g., onCompleteRef) and update it in a small useEffect when the
onComplete prop changes, then use onCompleteRef.current inside the boot sequence
effect so the effect's dependency list can omit onComplete (keep sleep if
needed); reference the BootScreen component, the effect that currently lists
[onComplete, sleep], and the new onCompleteRef to locate and change the code.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 651f99b and da7e55e.

⛔ Files ignored due to path filters (3)
  • package-lock.json is excluded by !**/package-lock.json
  • public/files/Jatin_Sisodia-SE.pdf is excluded by !**/*.pdf
  • public/images/argus.png is excluded by !**/*.png
📒 Files selected for processing (6)
  • package.json
  • src/components/BootScreen.jsx
  • src/components/Home.jsx
  • src/constants/index.js
  • src/index.css
  • src/windows/Resume.jsx

Comment thread package.json
"@types/react": "^19.2.5",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^5.1.1",
"baseline-browser-mapping": "^2.10.0",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# Search for any direct imports or usage of baseline-browser-mapping
rg "baseline-browser-mapping" --type js --type ts --type json --type mjs --type cjs -g '!node_modules' -g '!dist' -g '!build'

Repository: sisodiajatin/MacOS_Portfolio

Length of output: 99


🏁 Script executed:

# Also search for patterns that might reference it indirectly
rg "baseline" --type js --type ts --type json -g '!node_modules' -g '!dist' -g '!build'

Repository: sisodiajatin/MacOS_Portfolio

Length of output: 520


🏁 Script executed:

# Check the package.json file structure to understand context
cat package.json | head -60

Repository: sisodiajatin/MacOS_Portfolio

Length of output: 1277


🏁 Script executed:

# Check for vite and eslint config files that might use this
fd -e "config.js" -e "config.ts" -e "eslintrc*" -e ".eslintrc*" -e "vite.config.*" | head -20

Repository: sisodiajatin/MacOS_Portfolio

Length of output: 103


🏁 Script executed:

# Check if baseline-browser-mapping is a peer dependency of any installed package
rg "baseline-browser-mapping" package-lock.json -A 5 -B 5 | head -100

Repository: sisodiajatin/MacOS_Portfolio

Length of output: 1374


🏁 Script executed:

# Look for any config files in the root
ls -la | grep -E "vite|eslint|prettier|tsconfig"

Repository: sisodiajatin/MacOS_Portfolio

Length of output: 205


🏁 Script executed:

# Check eslint.config.js for browserslist usage
cat eslint.config.js

Repository: sisodiajatin/MacOS_Portfolio

Length of output: 829


🏁 Script executed:

# Check vite.config.js for browserslist usage
cat vite.config.js

Repository: sisodiajatin/MacOS_Portfolio

Length of output: 1445


🏁 Script executed:

# Search for browserslist usage in the codebase
rg "browserslist" --type js --type ts --type json -g '!node_modules'

Repository: sisodiajatin/MacOS_Portfolio

Length of output: 1107


Remove the redundant baseline-browser-mapping devDependency.

This package is not directly used anywhere in the codebase and is already installed as a transitive dependency of browserslist. Explicitly listing it in devDependencies is unnecessary since modern npm automatically installs transitive dependencies. Removing it will simplify the dependency tree and reduce the package.json footprint.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@package.json` at line 38, Remove the redundant devDependency
"baseline-browser-mapping" from package.json (the entry
"baseline-browser-mapping": "^2.10.0") because it is provided transitively by
browserslist; delete that dependency entry from the devDependencies block, then
update the lockfile by running your package manager (e.g., npm install or npm
ci) and run the test/build pipeline to verify nothing breaks; keep a note that
browserslist is the transitive provider so no code changes are required.

Comment on lines +102 to +115
const sleep = useCallback(
(ms) =>
new Promise((resolve) => {
const tid = setTimeout(resolve, ms);
const cid = setInterval(() => {
if (abortRef.current) {
clearTimeout(tid);
clearInterval(cid);
resolve();
}
}, 50);
}),
[]
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Memory leak: interval not cleared on normal promise resolution.

The sleep function creates an interval (cid) that checks for abort every 50ms, but this interval is only cleared when abortRef.current becomes true. On normal timeout completion, the interval continues running until the component unmounts, accumulating leaked intervals.

🐛 Proposed fix
     const sleep = useCallback(
         (ms) =>
             new Promise((resolve) => {
-                const tid = setTimeout(resolve, ms);
+                const tid = setTimeout(() => {
+                    clearInterval(cid);
+                    resolve();
+                }, ms);
                 const cid = setInterval(() => {
                     if (abortRef.current) {
                         clearTimeout(tid);
                         clearInterval(cid);
                         resolve();
                     }
                 }, 50);
             }),
         []
     );
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/BootScreen.jsx` around lines 102 - 115, The sleep function
(useCallback named sleep) leaks intervals because cid is only cleared when
abortRef.current is true; update the Promise executor to always clear the
interval and timeout when resolving: on normal timeout resolution
clearInterval(cid) and clearTimeout(tid) before resolve, and in the abort branch
also clear both; ensure both tid and cid are referenced in both paths so the
interval is not left running after the Promise resolves in BootScreen.jsx
(sleep, abortRef, tid, cid).

Comment thread src/windows/Resume.jsx
Comment on lines +21 to +25
<a href="files/Jatin_Sisodia-SE.pdf" download className="cursor-pointer" title="Download Resume">
<Download className="icon"/>
</a>
</div>
<Document file="files/Jatin_Sisodia.pdf" >
<Document file="files/Jatin_Sisodia-SE.pdf" >

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Add leading slash to file paths for consistency and reliability.

The paths files/Jatin_Sisodia-SE.pdf are relative, but RESUME_LOCATION in constants uses the absolute path /files/Jatin_Sisodia-SE.pdf. Relative paths can break when navigating from different routes or if the app is deployed to a subdirectory.

🔧 Proposed fix
-            <a href="files/Jatin_Sisodia-SE.pdf" download className="cursor-pointer" title="Download Resume">
+            <a href="/files/Jatin_Sisodia-SE.pdf" download className="cursor-pointer" title="Download Resume">
                 <Download className="icon"/>
             </a>
         </div>
-            <Document file="files/Jatin_Sisodia-SE.pdf" >
+            <Document file="/files/Jatin_Sisodia-SE.pdf" >
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<a href="files/Jatin_Sisodia-SE.pdf" download className="cursor-pointer" title="Download Resume">
<Download className="icon"/>
</a>
</div>
<Document file="files/Jatin_Sisodia.pdf" >
<Document file="files/Jatin_Sisodia-SE.pdf" >
<a href="/files/Jatin_Sisodia-SE.pdf" download className="cursor-pointer" title="Download Resume">
<Download className="icon"/>
</a>
</div>
<Document file="/files/Jatin_Sisodia-SE.pdf" >
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/windows/Resume.jsx` around lines 21 - 25, Update the resume file paths to
use the absolute path with a leading slash to match RESUME_LOCATION;
specifically change the anchor href (the <a> with title "Download Resume") and
the Document component's file prop (Document file="...") from
"files/Jatin_Sisodia-SE.pdf" to "/files/Jatin_Sisodia-SE.pdf" so links work
reliably across routes and deployments.

Swap shader-based background for a Spline 3D scene, add UI components
(card, spotlight), smooth boot-to-desktop transition with opacity fade,
and adjust CSS animations for the new background.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
}
}, [completedLines, typingLine, memValue]);

const sleep = useCallback(

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Potential Memory Leak in sleep Function

⚡ Performance | Severity: warning

The sleep function uses setTimeout and setInterval which can cause memory leaks if not properly cleared. Although clearInterval and clearTimeout are used, it's essential to ensure they are always called to prevent potential memory leaks.

Suggested fix:
Ensure that clearInterval and clearTimeout are always called, even in error cases. Consider using a try-finally block to guarantee cleanup.

const bottomRef = useRef(null);
const abortRef = useRef(false);

useEffect(() => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 Interval for Cursor Blinking Could Be Optimized

⚡ Performance | Severity: suggestion

The interval for blinking the cursor is set to 530ms. This could potentially be optimized for better performance or to make the blinking more consistent with typical terminal experiences.

Suggested change
useEffect(() => {
Consider adjusting the interval for better consistency or performance. For example, using a more standard blink rate like 500ms could improve the user experience.

const spotlightLeft = useTransform(mouseX, (x) => `${x - size / 2}px`);
const spotlightTop = useTransform(mouseY, (y) => `${y - size / 2}px`);

useEffect(() => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 Potential for Code Duplication in useEffect

✨ Style | Severity: suggestion

The useEffect hook sets up event listeners and then removes them. While this is good practice, there's a potential for code duplication if similar setups are needed elsewhere. Consider extracting a function for adding and removing event listeners.

Suggested change
useEffect(() => {
Extract a separate function for adding and removing event listeners to avoid potential duplication and improve maintainability.

Comment thread src/constants/index.js
},

// ▶ Project 3
{

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 Deeply Nested Objects in Constants

✨ Style | Severity: suggestion

The constants file contains deeply nested objects which can be hard to read and maintain. Consider flattening the structure or breaking it into smaller, more manageable pieces.

Suggested fix:
Consider breaking down deeply nested objects into smaller constants or using a data structure that is easier to manage and extend.

import { SplineScene } from '#components/ui/splite';

const LiveWallpaper = ({ darkMode }) => {
const LiveWallpaper = () => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Removed darkMode prop

🐛 Bug | Severity: warning

The darkMode prop has been removed from the LiveWallpaper component. This might cause issues if the component relies on this prop for its functionality.

Suggested change
const LiveWallpaper = () => {
Add the darkMode prop back to the LiveWallpaper component if it's still needed:
```jsx
const LiveWallpaper = ({ darkMode }) => {

enableTransition={false}
/>
</ShaderGradientCanvas>
<div className="live-wallpaper spline-bg">

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 New SplineScene component

✨ Style | Severity: suggestion

The new SplineScene component is used without any error handling. It's a good practice to add error handling for third-party components.

Suggested change
<div className="live-wallpaper spline-bg">
Add error handling for the SplineScene component:
```jsx
try {
return <SplineScene scene="https://prod.spline.design/kZDDjO5HuC9GJUM2/scene.splinecode" className="w-full h-full" />
} catch (error) {
console.error(error)
return <div>Error loading SplineScene</div>
}

import { Suspense, lazy } from 'react'
const Spline = lazy(() => import('@splinetool/react-spline'))

export function SplineScene({ scene, className }) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Lazy loading of Spline component

⚡ Performance | Severity: warning

The Spline component is lazy loaded using the Suspense component. This might cause performance issues if the component is not properly optimized.

Suggested change
export function SplineScene({ scene, className }) {
Optimize the Spline component for lazy loading:
```jsx
const Spline = lazy(() => import('@splinetool/react-spline'))

Comment thread src/index.css

@import "tailwindcss";

@keyframes spotlight {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 New CSS keyframes animation

✨ Style | Severity: suggestion

The new CSS keyframes animation is added without any comments or explanations. It's a good practice to add comments for complex CSS code.

Suggested fix:
Add comments to explain the purpose of the keyframes animation:

/* Spotlight animation */
@keyframes spotlight {
  /* ... */
}

Comment thread src/App.jsx

<main
className={darkMode ? "dark-mode" : ""}
style={{

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 New inline styles

✨ Style | Severity: suggestion

The new inline styles are added to the main element. It's a good practice to avoid using inline styles and instead use CSS classes.

Suggested fix:
Replace the inline styles with a CSS class:

<main className="main" onContextMenu={handleContextMenu}>
  /* ... */
</main>

@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: 1

♻️ Duplicate comments (1)
src/components/BootScreen.jsx (1)

102-113: ⚠️ Potential issue | 🔴 Critical

sleep still leaks intervals on normal completion.

The interval is cleared only when abortRef.current becomes true. On normal timeout resolution it keeps running, and this accumulates quickly during the boot sequence.

🐛 Suggested fix
 const sleep = useCallback(
   (ms) =>
     new Promise((resolve) => {
-      const tid = setTimeout(resolve, ms);
-      const cid = setInterval(() => {
-        if (abortRef.current) {
-          clearTimeout(tid);
-          clearInterval(cid);
-          resolve();
-        }
-      }, 50);
+      let settled = false;
+      const finish = () => {
+        if (settled) return;
+        settled = true;
+        clearTimeout(tid);
+        clearInterval(cid);
+        resolve();
+      };
+      const tid = setTimeout(finish, ms);
+      const cid = setInterval(() => {
+        if (abortRef.current) finish();
+      }, 50);
     }),
   []
 );
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/BootScreen.jsx` around lines 102 - 113, The sleep function's
interval (cid) isn't cleared when the timeout completes normally, leaking
intervals; update the useCallback sleep implementation so that before resolving
on normal timeout it clears the interval (clearInterval(cid)) and also ensure
both the timeout (tid) and interval (cid) are cleared when abortRef.current is
true; locate the sleep function (the useCallback using abortRef and
setTimeout/setInterval) and add clearInterval(cid) in the normal resolution path
and keep the existing clearTimeout/clearInterval in the abort branch.
🧹 Nitpick comments (3)
src/components/ui/spotlight.jsx (1)

21-30: Avoid permanent parent style mutation from inside Spotlight.

This mutates the parent container’s layout/clipping and never restores previous values on unmount, which can cause side effects outside this component.

♻️ Suggested fix
 useEffect(() => {
-  if (containerRef.current) {
-    const parent = containerRef.current.parentElement;
-    if (parent) {
-      parent.style.position = 'relative';
-      parent.style.overflow = 'hidden';
-      setParentElement(parent);
-    }
-  }
+  if (!containerRef.current) return;
+  const parent = containerRef.current.parentElement;
+  if (!parent) return;
+
+  const prevPosition = parent.style.position;
+  const prevOverflow = parent.style.overflow;
+
+  if (!parent.style.position) parent.style.position = 'relative';
+  if (!parent.style.overflow) parent.style.overflow = 'hidden';
+  setParentElement(parent);
+
+  return () => {
+    parent.style.position = prevPosition;
+    parent.style.overflow = prevOverflow;
+  };
 }, []);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/ui/spotlight.jsx` around lines 21 - 30, Spotlight's useEffect
mutates parent DOM styles (position and overflow) permanently; capture the
parent's previous style values when setting parent.style.position and
parent.style.overflow in the effect (using containerRef.current.parentElement),
then in the effect cleanup restore those previous values (and clear
setParentElement if needed); only set the styles if parent exists and ensure
cleanup runs to revert to original position/overflow to avoid leaking
layout/clipping changes outside the Spotlight component.
src/components/ui/SplineSceneBasic.jsx (2)

7-36: Consider accepting props for reusability.

The component has a generic name suggesting reuse, but all content (title, description, scene URL) is hardcoded. If this is a one-off demo, that's fine. Otherwise, accepting props would make it more flexible.

♻️ Suggested props interface for reusability
-export function SplineSceneBasic() {
+export function SplineSceneBasic({
+  title = "Interactive 3D",
+  description = "Bring your UI to life with beautiful 3D scenes. Create immersive experiences that capture attention and enhance your design.",
+  sceneUrl = "https://prod.spline.design/kZDDjO5HuC9GJUM2/scene.splinecode",
+  className,
+}) {
   return (
-    <Card className="w-full h-[500px] bg-black/[0.96] relative overflow-hidden">
+    <Card className={cn("w-full h-[500px] bg-black/[0.96] relative overflow-hidden", className)}>
       <Spotlight
         className="-top-40 left-0 md:left-60 md:-top-20"
         fill="white"
       />

       <div className="flex h-full">
         {/* Left content */}
         <div className="flex-1 p-8 relative z-10 flex flex-col justify-center">
           <h1 className="text-4xl md:text-5xl font-bold bg-clip-text text-transparent bg-gradient-to-b from-neutral-50 to-neutral-400">
-            Interactive 3D
+            {title}
           </h1>
           <p className="mt-4 text-neutral-300 max-w-lg">
-            Bring your UI to life with beautiful 3D scenes. Create immersive experiences
-            that capture attention and enhance your design.
+            {description}
           </p>
         </div>

         {/* Right content */}
         <div className="flex-1 relative">
           <SplineScene
-            scene="https://prod.spline.design/kZDDjO5HuC9GJUM2/scene.splinecode"
+            scene={sceneUrl}
             className="w-full h-full"
           />
         </div>
       </div>
     </Card>
   )
 }

You'll also need to import cn from #lib/utils if you add the className prop.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/ui/SplineSceneBasic.jsx` around lines 7 - 36, The
SplineSceneBasic component currently hardcodes title, description and scene URL;
make it reusable by adding props (e.g., title, description, scene, className) to
the SplineSceneBasic function signature, provide sensible defaults for each
prop, replace the hardcoded strings/URL with those props inside the JSX, and
merge incoming className with the existing Card/SplineScene classes (import and
use cn from '#lib/utils' if you accept className). Ensure the prop names are
exported/typed if using TypeScript and preserve existing layout and
accessibility.

3-3: Consider renaming splite.jsx to spline.jsx for clarity.

The file src/components/ui/splite.jsx exists and is consistently imported across the codebase (used in 2 places). However, the naming appears unusual and doesn't align with the actual Spline 3D library. Renaming to spline.jsx would improve maintainability and reduce confusion for future developers.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/ui/SplineSceneBasic.jsx` at line 3, Rename the component file
currently named splite.jsx to spline.jsx and update all imports accordingly:
change the import in SplineSceneBasic.jsx from "#components/ui/splite" to
"#components/ui/spline" (and update the other two places that import
splite.jsx), then ensure the component's default export name (if any) inside the
file remains unchanged so consumers continue to work; commit the file rename so
version control records the move and run the app/tests to verify no import paths
remain referencing "splite".
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/App.jsx`:
- Around line 96-104: Right-clicks on the background miss handleContextMenu
because the <main> element is non-hit-testable while the LiveWallpaper layer is
hit-testable; fix by either moving the onContextMenu={handleContextMenu} up to
the enclosing wrapper (the root div that contains <LiveWallpaper /> and <main>)
so it receives background right-clicks, or make the <main> actually hit-testable
(remove pointer-events: none in the CSS rule that targets main or add
pointer-events: auto) so the existing onContextMenu on <main> fires; update the
App.jsx to attach the handler to the wrapper or adjust the CSS, and keep
handleContextMenu and LiveWallpaper references unchanged.

---

Duplicate comments:
In `@src/components/BootScreen.jsx`:
- Around line 102-113: The sleep function's interval (cid) isn't cleared when
the timeout completes normally, leaking intervals; update the useCallback sleep
implementation so that before resolving on normal timeout it clears the interval
(clearInterval(cid)) and also ensure both the timeout (tid) and interval (cid)
are cleared when abortRef.current is true; locate the sleep function (the
useCallback using abortRef and setTimeout/setInterval) and add
clearInterval(cid) in the normal resolution path and keep the existing
clearTimeout/clearInterval in the abort branch.

---

Nitpick comments:
In `@src/components/ui/SplineSceneBasic.jsx`:
- Around line 7-36: The SplineSceneBasic component currently hardcodes title,
description and scene URL; make it reusable by adding props (e.g., title,
description, scene, className) to the SplineSceneBasic function signature,
provide sensible defaults for each prop, replace the hardcoded strings/URL with
those props inside the JSX, and merge incoming className with the existing
Card/SplineScene classes (import and use cn from '#lib/utils' if you accept
className). Ensure the prop names are exported/typed if using TypeScript and
preserve existing layout and accessibility.
- Line 3: Rename the component file currently named splite.jsx to spline.jsx and
update all imports accordingly: change the import in SplineSceneBasic.jsx from
"#components/ui/splite" to "#components/ui/spline" (and update the other two
places that import splite.jsx), then ensure the component's default export name
(if any) inside the file remains unchanged so consumers continue to work; commit
the file rename so version control records the move and run the app/tests to
verify no import paths remain referencing "splite".

In `@src/components/ui/spotlight.jsx`:
- Around line 21-30: Spotlight's useEffect mutates parent DOM styles (position
and overflow) permanently; capture the parent's previous style values when
setting parent.style.position and parent.style.overflow in the effect (using
containerRef.current.parentElement), then in the effect cleanup restore those
previous values (and clear setParentElement if needed); only set the styles if
parent exists and ensure cleanup runs to revert to original position/overflow to
avoid leaking layout/clipping changes outside the Spotlight component.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 982e0af2-bed4-4204-b93d-a64ab26ff37d

📥 Commits

Reviewing files that changed from the base of the PR and between da7e55e and a6db0f7.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (11)
  • index.html
  • package.json
  • src/App.jsx
  • src/components/BootScreen.jsx
  • src/components/LiveWallpaper.jsx
  • src/components/ui/SplineSceneBasic.jsx
  • src/components/ui/card.jsx
  • src/components/ui/splite.jsx
  • src/components/ui/spotlight.jsx
  • src/index.css
  • src/lib/utils.js
🚧 Files skipped from review as they are similar to previous changes (1)
  • package.json

Comment thread src/App.jsx
Comment on lines +96 to 104
<LiveWallpaper />

<main
className={darkMode ? "dark-mode" : ""}
style={{
opacity: isBooting ? 0 : 1,
transition: "opacity 0.6s ease-in-out",
}}
onContextMenu={handleContextMenu}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Desktop context menu can miss empty-background right-clicks.

onContextMenu is attached to <main> (Line 104), but main is non-hit-testable in CSS (src/index.css Line 70) while the Spline wallpaper is hit-testable (src/index.css Lines 39-46). Result: right-clicks on empty desktop/background bypass this handler.

💡 Suggested fix
--- a/src/App.jsx
+++ b/src/App.jsx
@@
-            <LiveWallpaper />
+            <LiveWallpaper onContextMenu={handleContextMenu} />
--- a/src/components/LiveWallpaper.jsx
+++ b/src/components/LiveWallpaper.jsx
@@
-const LiveWallpaper = () => {
+const LiveWallpaper = ({ onContextMenu }) => {
@@
-        <div className="live-wallpaper spline-bg">
+        <div className="live-wallpaper spline-bg" onContextMenu={onContextMenu}>
             <SplineScene
                 scene="https://prod.spline.design/kZDDjO5HuC9GJUM2/scene.splinecode"
                 className="w-full h-full"
             />
         </div>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/App.jsx` around lines 96 - 104, Right-clicks on the background miss
handleContextMenu because the <main> element is non-hit-testable while the
LiveWallpaper layer is hit-testable; fix by either moving the
onContextMenu={handleContextMenu} up to the enclosing wrapper (the root div that
contains <LiveWallpaper /> and <main>) so it receives background right-clicks,
or make the <main> actually hit-testable (remove pointer-events: none in the CSS
rule that targets main or add pointer-events: auto) so the existing
onContextMenu on <main> fires; update the App.jsx to attach the handler to the
wrapper or adjust the CSS, and keep handleContextMenu and LiveWallpaper
references unchanged.

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.

1 participant