Conversation
BREAKING / MIGRATION - Rename all .js/.jsx source files to .ts/.tsx with full type annotations - Remove jsconfig.json; add tsconfig.json (strict mode, Next.js plugin) - Rename proxy.js → proxy.ts (CSP middleware) FEATURES - Add floating background icons (hardware: microchip/server/memory/HDD/ database/network; trading: chart-line/bar/area/bitcoin; physics: atom) as fixed, GPU-composited, pointer-events-none layer (opacity 0.10–0.15) - Add physics easter egg in footer (responsive font via clamp()) - Add RUNTIME_ENV: MEC Kochi line to footer terminal - Add Galaxy Watch 4 to THE_ARSENAL panel CI/CD - Add Lighthouse CI job (guard → lighthouse → audit → build-push-sign) with lighthouserc.json: accessibility ≥0.9 error, perf/BP/SEO ≥0.9 warn - Update dependabot: unified groups (all-dependencies / all-actions), ignore eslint ≥ 10 to keep v9 pinned for eslint-config-next compat PERFORMANCE - Reduce SCROLL_LOCK_DURATION 1100ms → 800ms (less input lag) - Add will-change:transform + contain:layout style paint to FloatingBgIcons (promotes to own GPU compositor tile, prevents scroll paint invalidation) - Add contain:layout style to .scroll-snap-section (isolates reflow) - Restore production caching: remove force-dynamic/revalidate=0/fetchCache exports from layout.tsx (was disabling all caching in production) SECURITY / DEPENDENCIES - Add minimatch override ^10.2.2 (fixes 5 high CVEs in eslint-config-next dependency tree); npm audit now reports 0 vulnerabilities - Pin eslint@9.39.1 (eslint@10 breaks eslint-config-next@16 plugin stack) BUG FIXES - Fix React hydration mismatch: move md:auto-rows-[minmax(18rem,1fr)] from JSX className to .explorer-grid CSS class (arbitrary Tailwind values with parens/commas were dropped inconsistently between SSR and client) - Revert explorer card inner scrollbars (panels now expand naturally) - Fix footer UTC+05:30 / deployed UTC suffix to stay single-line on mobile - Fix min-h-[44px]/min-w-[44px] → min-h-11/min-w-11; h-[28rem]/w-[28rem] → h-112/w-md (eliminate Tailwind arbitrary-value lint warnings) - Fix bare email links in README.md and SECURITY.md (MD034) - Fix project structure code fence missing language tag (MD040) - Fix bold-as-heading in README.md contact section (MD036) DOCS - Update README: version badge (v1.1.1), TypeScript 5.9 badge, React Icons badge; add floating icons feature; update file tree (.ts/.tsx, proxy.ts, tsconfig.json, lighthouserc.json, ErrorHandler.tsx); update tech stack; bump Last Updated to February 25 2026
* Initial plan * fix: reformat layout.tsx with single quotes per Prettier config Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com>
… legal route layout (#93) * Initial plan * SEO improvements: layout.tsx, sitemap.ts, legal/layout.tsx Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com> --------- Signed-off-by: Devanarayanan <fusion@devakesu.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com> Co-authored-by: Devanarayanan <fusion@devakesu.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Devanarayanan <fusion@devakesu.com>
Signed-off-by: Devanarayanan <fusion@devakesu.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Devanarayanan <fusion@devakesu.com>
… CI to mobile preset (#94) * Initial plan * fix: remove global devNoCacheHeaders from /:path* and switch Lighthouse CI to mobile preset Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com>
* Initial plan * fix: change Lighthouse CI preset from 'mobile' to 'desktop' to fix GH Actions job failure Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com> * feat: add Lighthouse CI mobile testing alongside existing desktop testing Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com> * fix: lower mobile Lighthouse performance threshold to 0.7 and document both config files in README Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com> * fix: use distinct artifact names for desktop and mobile Lighthouse CI steps to prevent 409 conflict Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: devakesu <61821107+devakesu@users.noreply.github.com>
- disable custom touch scroll interception on coarse-pointer devices - keep mobile/tablet on native smooth scrolling - harden desktop wheel/trackpad section snapping with cooldown + inertia handling - preserve keyboard-based section navigation - remove CSS/JS snap conflicts by disabling global CSS snap mode chore(release): bump to v1.1.2 and refresh dependencies/docs - bump project version to 1.1.2 - update dependencies - update README and SECURITY metadata/version dates
…ge.tsx - resolve eslint no-unused-vars errors - keep behavior unchanged; cleanup only fix(deps): update eslint, autoprefixer, and @types/node versions
Signed-off-by: Devanarayanan <fusion@devakesu.com>
There was a problem hiding this comment.
Pull request overview
Release-focused PR that updates the site to v1.1.2 while improving scroll section snapping behavior across desktop/mobile, tightening analytics typing/validation, and refreshing project metadata/tooling (Lighthouse CI, docs, deps).
Changes:
- Reworked section snapping logic (desktop wheel/trackpad cooldown + inertia handling; coarse-pointer devices use native scrolling; removed CSS snap conflicts).
- Added/updated release + tooling assets (v1.1.2 version bump, Lighthouse CI configs + workflow job, docs/security metadata updates).
- TypeScript/ESLint hardening across analytics, proxy middleware, and UI components.
Reviewed changes
Copilot reviewed 6 out of 7 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| tsconfig.json | Adds/standardizes TS compiler configuration. |
| proxy.ts | Types the proxy middleware request/response. |
| package.json | Bumps version/deps; updates dev scripts; adds overrides. |
| package-lock.json | Locks updated dependency graph. |
| next.config.mjs | Refines headers/caching behavior with production toggle. |
| lighthouserc.json | Adds Lighthouse CI desktop config. |
| lighthouserc.mobile.json | Adds Lighthouse CI mobile config. |
| lib/legal.ts | Introduces legal policy/terms/cookie notice content/constants. |
| lib/analytics.ts | Adds TS typings for analytics event pipeline/helpers. |
| lib/analytics-config.ts | Types isAnalyticsEnabled() return value. |
| jsconfig.json | Removes JS path config (replaced by TS config). |
| eslint.config.mjs | Adds typescript-eslint recommended rules + ignores. |
| components/ErrorHandler.tsx | Types unhandled rejection event. |
| components/Analytics.tsx | Tightens TS typings and error handling; typed hook return. |
| app/sitemap.ts | Adds typed sitemap with stable lastModified dates. |
| app/sitemap.js | Removes old JS sitemap implementation. |
| app/page.tsx | Major scroll snap changes + UI/layout updates + background icons. |
| app/not-found.tsx | Adds custom 404 page. |
| app/legal/page.tsx | Improves markdown rendering typings for legal content. |
| app/legal/layout.tsx | Adds route-level metadata for the legal page. |
| app/layout.tsx | Updates global metadata + icon declarations + RootLayout typing. |
| app/globals.css | Disables global CSS snap; tweaks layout containment/styles. |
| app/api/analytics/route.ts | Strengthens TS types, origin/IP validation, and rate limiting types. |
| SECURITY.md | Updates security contact formatting + version/date. |
| README.md | Updates badges/docs for v1.1.2 + TS/Lighthouse/tooling notes. |
| .github/workflows/deploy.yml | Adds Lighthouse CI job (desktop + mobile). |
| .github/dependabot.yml | Changes Dependabot cadence/grouping/ignore rules. |
Comments suppressed due to low confidence (7)
app/page.tsx:883
handlePanelKeyDownuses theReact.KeyboardEventtype, but this file only imports named hooks fromreactand does not import theReactnamespace. Withtsconfig.jsonusing module syntax, this will fail type-checking with "Cannot find namespace 'React'". Prefer importing the needed event type fromreact(e.g.,KeyboardEvent/ReactKeyboardEvent) orimport type * as React from 'react'before referencingReact.*types.
const handlePanelKeyDown = useCallback(
(event: React.KeyboardEvent<HTMLDivElement>, nodeId: NodeId) => {
// Only handle keyboard events on the panel container itself, not on interactive children
if (
(event.key === "Enter" || event.key === " ") &&
app/page.tsx:923
- The Tailwind classes
h-112andw-mdare not part of Tailwind's default utilities, and this repo doesn't define custom spacing tokens intailwind.config.js. This will result in these styles being silently ignored. Use arbitrary values (e.g.,h-[28rem] w-[28rem]) or valid built-in sizing utilities instead.
className="absolute -bottom-24 -right-24 h-112 w-md rounded-full bg-cyan-400/20 blur-3xl parallax-layer pointer-events-none hidden md:block"
data-depth="0.25"
>
app/page.tsx:937
- Same issue here:
h-112/w-mdare not valid Tailwind utilities in this codebase, so the glow blob will lose its intended sizing. Use valid Tailwind sizing (orh-[...]/w-[...]).
<div className="absolute -top-24 -left-24 h-72 w-72 rounded-full bg-cyan-400/20 blur-3xl pointer-events-none">
</div>
<div className="absolute -bottom-24 -right-24 h-112 w-md rounded-full bg-cyan-400/20 blur-3xl pointer-events-none">
</div>
app/page.tsx:793
- This effect sets
wheelLockTimeoutRefandscrollEndTimeoutRef, but the cleanup only clearsunlockTimeoutRef. Those timeouts can still fire after unmount and keep references alive unnecessarily. Clear and null outwheelLockTimeoutRef.currentandscrollEndTimeoutRef.currentin the cleanup as well.
return () => {
window.removeEventListener("wheel", handleWheel);
window.removeEventListener("keydown", handleKeyDown);
window.removeEventListener("scroll", handleScroll);
window.removeEventListener("resize", handleResize);
if (unlockTimeoutRef.current) {
clearTimeout(unlockTimeoutRef.current);
unlockTimeoutRef.current = null;
}
package.json:7
engine-strict=trueis enabled in.npmrc, butpackage-lock.jsonnow includes transitive deps that require Node^20.19.0(e.g.,eslint-visitor-keys@5.0.1). Withengines.nodecurrently set to>=20.9.0, installs will fail for users on 20.9–20.18. Bump the minimum Node engine to>=20.19.0(and consider aligning CI/runtime docs accordingly).
"engines": {
"node": ">=20.9.0"
},
README.md:16
- The README still advertises Tailwind CSS
4.1.18, butpackage.jsonin this PR bumps Tailwind to4.2.1. Update this badge/version text to match the actual dependency version so docs stay accurate.
[](https://nextjs.org)
[](https://react.dev)
[](https://tailwindcss.com)
[](https://nodejs.org)
[](https://www.typescriptlang.org)
[](https://react-icons.github.io/react-icons/)
README.md:77
- Tech stack section still says Tailwind CSS
4.1.18, but dependencies were updated to4.2.1in this PR. Update the version here as well to avoid drift.
- **Framework**: Next.js 16.1.6 (App Router)
- **Language**: TypeScript 5.9 (strict mode, full coverage)
- **Styling**: Tailwind CSS 4.1.18 (CSS-based configuration)
- **Fonts**: Space Grotesk, JetBrains Mono
- **Icons**: React Icons 5.5.0 (hardware, trading, physics, social)
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 6 out of 7 changed files in this pull request and generated 1 comment.
Comments suppressed due to low confidence (1)
app/page.tsx:793
- The effect cleanup clears
unlockTimeoutRef, but it doesn't clearwheelLockTimeoutRefandscrollEndTimeoutRef. Those timeouts can still fire after the listener is removed/unmount happens, mutating refs and potentially causing unexpected scroll-state resets. Please clear both timeouts in the cleanup and set the refs back tonull.
return () => {
window.removeEventListener("wheel", handleWheel);
window.removeEventListener("keydown", handleKeyDown);
window.removeEventListener("scroll", handleScroll);
window.removeEventListener("resize", handleResize);
if (unlockTimeoutRef.current) {
clearTimeout(unlockTimeoutRef.current);
unlockTimeoutRef.current = null;
}
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Devanarayanan <fusion@devakesu.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 6 out of 7 changed files in this pull request and generated 2 comments.
Comments suppressed due to low confidence (1)
app/page.tsx:796
- The new scroll timers (
wheelLockTimeoutRef/scrollEndTimeoutRef) are never cleared on effect cleanup. If the component unmounts while a timeout is pending, those callbacks will still run later (and keep the JS timers alive longer than needed). Clear both timeouts (and null the refs) in the cleanup block alongsideunlockTimeoutRef.
if (unlockTimeoutRef.current) {
clearTimeout(unlockTimeoutRef.current);
unlockTimeoutRef.current = null;
}
isAnimatingRef.current = false;
};
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…avigation in page.tsx
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 6 out of 7 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
app/page.tsx:810
- The section-snap effect sets
wheelLockTimeoutRefandscrollEndTimeoutRef, but the effect cleanup only clearsunlockTimeoutRef. This can leave timers running after the effect is torn down (e.g., route change), which is avoidable and can cause hard-to-trace behavior. Clear both timeouts in the cleanup and set the refs back tonull.
return () => {
window.removeEventListener("wheel", handleWheel);
window.removeEventListener("keydown", handleKeyDown);
window.removeEventListener("scroll", handleScroll);
window.removeEventListener("resize", handleResize);
if (unlockTimeoutRef.current) {
clearTimeout(unlockTimeoutRef.current);
unlockTimeoutRef.current = null;
}
isAnimatingRef.current = false;
};
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
feat(scroll): improve section snap behavior across desktop and mobile
chore(release): bump to v1.1.2 and refresh dependencies/docs
remove unused scroll-related constants and selector block in app/page.tsx
fix(deps): update eslint, autoprefixer, and @types/node versions
@devakesu
devakesu committed 1 minute ago