Ryan Editraj

Handoff

23 October 2026. Branch cursor/personal-internet-fa6c. Nothing was deployed. The previous site is gone from this branch and still in git history (main and earlier commits).

What was built

A new Next.js 15 App Router site in TypeScript. Content is JSON in content/, checked with Zod on every read. Public pages show status: "published" only. Drafts 404. There is no database.

The design is the hybrid described in docs/design-direction.md: editorial paper and serif type, a Swiss numbered spine, one stamp-red action. Three prototypes were screenshotted before this choice. Production CSS does not import those files.

Pages

One identity, shared content, no second thin copy of a page.

Path Role
/ Who he is, what he builds, how to collaborate, now
/about Longer account, with sources
/links Phone bio. Short list, light footer
/work, /work/[slug] Featured projects
/lab, /lab/[slug] Lab pieces. Featured lab work redirects to /work/[slug]
/past-projects, /building Finished and active, plus related public sites
/tools Empty on purpose. No first-party tool URL returned HTTP 200
/open-source Original repos, stars as fetched 23 October 2026, lane filter
/notes, /notes/[slug] Only the colophon, bylined as the site
/resources Empty shelf
/bookmarks His public properties, not a reading list. Category and tag filters
/uses Linux verified. Editor, terminal, hardware are blanks
/playbooks, /playbooks/[slug] How to use the collaboration form
/dispatches Signup disabled until Resend is configured
/journey Dated public facts, including the school-bio conflict
/now Placeholder quoting the profile README
/press Empty
/media-kit, /media-kit/download One metric, sourced. Markdown download
/services Two services, no fees
/collaborate Inquiry. Validated. Not sent without Resend
/mentorship, /mentorship/book Not open. Example slots. Button disabled
/contact Switchboard. Not a second form
/community, /portal Refusal pages. No fake activity
/directory Full index
/privacy, /terms Practical descriptions. Lawyer-review banners
/admin Server-gated. Unconfigured without env
404 Designed

Also: sitemap.xml, robots.txt, llms.txt, generated Open Graph and Twitter images, POST /api/webhooks/stripe, POST /api/webhooks/razorpay.

Projects that are listed

Verified from the GitHub API and repository pages on 23 October 2026. Dates are created_at, not pushed_at (many repos were touched in bulk that day). Stars are low and dated; they are on the open-source table, not in the media kit.

Featured, with a page under /work: Indiquant, trading-ai, TuitionOS, CBSE Physics Predictor, helmet detection, LayoverBuddy.

Lab, under /lab unless also featured: KL-ctf (one sentence, no procedure), Keeb keyboard, Exam Strategy Studio, Travel Personality Analyzer, Space 3D site.

Archive or open source only, linking to GitHub, no detail page: waffles-site, The CLI Restaurant, Word Counter, Restaurant Flask (description only; README 404), Stock Profit Calculator, Letter Game, Number Guessing Game, Old-Portfolio.

Not listed: placement-karo, roomgpt, Coducher, forks (including esp32-deauther), Hacktoberfest dumps, the profile-readme repo, this github.io repo, John-Doe-Portfolio, essentials. See docs/needs-ryan-input.md.

Helmet detection and KL-ctf stay high-level. No deployment guide, no challenge steps.

Forms and money

SEO

Documented in docs/seo.md. SITE_URL defaults to http://localhost:3000. The production domain is not hardcoded. ryaneditraj.tech did not resolve on this date.

Tests that were run

After the shell stopped calling headers(), on 23 October 2026:

Playwright covered: home headings, designed 404, /gallery.html redirect to /, collaborate empty-field errors and a valid submit that says nothing was sent, disabled dispatches, /admin redirect to a not-configured login, disabled booking control, robots.txt containing GPTBot and Googlebot and a sitemap line, sitemap containing /work/indiquant and omitting /admin and /portal, axe with zero violations on /, /about, /links, /work, /collaborate, /directory, /media-kit, /mentorship/book, /open-source, and horizontal overflow of at most 1px at 360, 390, 768, 1280, and 1600 on the representative set. Below 768 the inline nav is hidden and the menu button is visible; at 768 and above the reverse is true.

Lighthouse

Lighthouse 12.8.2, Playwright Chromium (chromium-1248), production next start on 127.0.0.1:3000, mobile default, 23 October 2026. Measured after the description was confirmed inside the initial <head> (curl of / shows <title> and <meta name="description"> before </head>).

Page Performance Accessibility Best practices SEO FCP LCP TBT CLS Speed index TTI
/ 95 100 100 100 1.4 s 2.9 s 90 ms 0 1.4 s 3.0 s
/links 97 100 100 100 1.4 s 2.4 s 80 ms 0 1.4 s 2.8 s
/collaborate 95 100 100 100 1.4 s 2.8 s 80 ms 0 1.4 s 3.0 s

An earlier run on the same day, before that change, scored SEO 91 on all three pages. The only failing audit was meta-description. The tag was in the response but streamed outside <head>, because the shell called headers(). No other SEO audit failed in that run. JSON for the remeasure was written to /tmp/lh/{home,links,collaborate}.json on the build machine and is not in git.

Visual QA

Playwright wrote full-page screenshots to /opt/cursor/artifacts/visual/ for home, links, work, collaborate, directory, mentorship book, media kit, and about, at 360, 390, 768, 1280, and 1600, plus menu-390.png and collaborate-reduced-motion-390.png. Prototype comparisons are in docs/design/ and /opt/cursor/artifacts/design/.

The screenshot set was regenerated by the passing Playwright run after the nav change. The mobile menu lists the primary nav only. “Index” already goes to /directory, so the menu does not add a second “Full index” row. The footer still links to the full index.

What was checked in code and by the assertions, not only by looking at pictures: no horizontal overflow beyond 1px, nav swap at 768, menu dialog Escape, reduced-motion screenshot of the form, stacked tables below 64rem with data-labels, errors outside form labels.

Known limits

Deploy

docs/deployment.md and docs/seo.md. Short version: Vercel or another Node host, set SITE_URL, do not static-export, do not point GitHub Pages at this app, submit the sitemap only after the origin is real.