Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
5515582
docs(claude): add dual-session (local+cloud) block to CLAUDE.md
vkkatariya Jun 30, 2026
f61cc8a
fix(docs): remove worktree paths from CLAUDE.md, use lineage branches
vkkatariya Jun 30, 2026
7913892
chore(local): smoke-test commit on claude/local lineage
vkkatariya Jun 30, 2026
8daabc3
merge: feat/claude-local-smoke → claude/local
vkkatariya Jun 30, 2026
ec30473
chore(cloud): smoke-test commit on claude/cloud lineage
vkkatariya Jun 30, 2026
0068550
merge: feat/claude-cloud-smoke → claude/cloud
vkkatariya Jun 30, 2026
a4c3de6
merge: claude/local → dev (local session lineage)
vkkatariya Jun 30, 2026
bd2acda
merge: claude/cloud → dev (cloud session lineage)
vkkatariya Jun 30, 2026
55ccab2
fix(docs): clarify cloud session is Anthropic container, started from…
vkkatariya Jun 30, 2026
f9dfe47
merge: claude/local → dev (docs: clarify cloud session is browser-sta…
vkkatariya Jun 30, 2026
50bc90d
style(homepage): redesign redirect splash with branded entrance anima…
vkkatariya Jun 30, 2026
3e9c242
Revert "style(homepage): redesign redirect splash with branded entran…
vkkatariya Jun 30, 2026
5c4c2e8
docs(claude): remove dead reference to deleted CLAUDE-CODE-WORKFLOW-R…
vkkatariya Jun 30, 2026
83c8ecc
feat(portfolio): add multi-format favicon from approved glass VK logo
vkkatariya Jun 30, 2026
e5e01a2
docs(tasks): favicon kickoff + identify 3 topbar-logo sub-places
vkkatariya Jun 30, 2026
7ddc388
docs(tasks): favicon kickoff + identify 7 topbar-logo sub-places
vkkatariya Jun 30, 2026
f1fbaf7
merge: favicon assets + multi-format <head> block across 7 HTML files
vkkatariya Jun 30, 2026
ee33fe2
docs(tasks): favicon-borders fix kickoff + flag prior merge regression
vkkatariya Jun 30, 2026
12c994e
docs(lessons): L-068 — don't merge favicon work without visual verifi…
vkkatariya Jun 30, 2026
e6a50c2
fix(favicon): regen all assets with enhanced contrast (option C)
vkkatariya Jun 30, 2026
def271f
Merge pull request #8 from vkkatariya/fix/favicon-borders
vkkatariya Jun 30, 2026
fee0fb9
docs(devlog): add fix/favicon-borders session entry
vkkatariya Jun 30, 2026
3e90314
docs(tasks): kickoff for logo-everywhere (7 sub-places, one shot)
vkkatariya Jun 30, 2026
6660a23
feat(portfolio): add glass VK logo to 7 places (logo-everywhere)
vkkatariya Jun 30, 2026
e2bf547
docs(devlog): add feat/logo-everywhere session entry
vkkatariya Jun 30, 2026
eba7cf1
Merge pull request #9 from vkkatariya/feat/logo-everywhere
vkkatariya Jun 30, 2026
c0d1620
docs(tasks): kickoff for OG banner rebuild + global URL replace
vkkatariya Jun 30, 2026
c841dc2
docs(todo): add Phase 1g latency optimization task (deferred)
vkkatariya Jun 30, 2026
24a1e1b
feat(portfolio): rebuild OG banner as business-card widget + replace …
vkkatariya Jun 30, 2026
b002b09
docs(devlog): add feat/og-banner-rebuild session entry
vkkatariya Jun 30, 2026
fda821e
Merge pull request #10 from vkkatariya/feat/og-banner-rebuild
vkkatariya Jun 30, 2026
ff1f088
chore(cleanup): remove merged branch kickoff files + agent temp
vkkatariya Jun 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,6 @@ playwright-report/

# Local dev workflow symlink (homelab-only, see ~/dev-shared/workflow/)
workflow

# Temporary render templates (used to generate static assets, not shipped)
prototypes/assets/_og-template.html
41 changes: 40 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,39 @@ Before any meaningful work, read these files in order:
3. `tasks/todo.md` — sprint items and phase status
4. `tasks/lessons.md` — active prevention rules (L-001 through L-061+)

**This project runs in the dual-session model** (see `workflow/SESSION-WORKFLOW.md` v2):

- **Local session** (this is normally the one you are): `[portfolio-website]-local`
- Host: athena tmux (`tmux attach -t claude-portfolio-local`)
- Process: Claude CLI on athena, started with `claude --remote-control '[portfolio-website]-local'`
- Branch: `claude/local` (work on `feat/<task>` sub-branches off it)
- Filesystem: full local access (athena's `/home/radxa/...`, Docker, etc.)
- Use for: design iteration, file edits, debugging, `vercel deploy`, dev server, anything needing local FS
- **Cloud session** (sibling, long-lived): `[portfolio-website]-cloud`
- Host: Anthropic cloud container (NOT your machine)
- Process: started from https://claude.ai/code → Code tab → New session → pick repo → pick branch `claude/cloud`
- Branch: `claude/cloud` (work on `feat/<task>-cloud` sub-branches off it)
- Filesystem: **ONLY the GitHub repo** (no `~/dev-shared/`, no Docker, no `.env.local`, no local servers)
- Use for: `npm install`, Playwright runs (29 tests), full e2e audit, builds, anything that needs CPU isolation
- **Cannot do:** `vercel deploy` (no auth), access local servers, run Docker

**One-time setup** (run on first session per project, on athena):
```bash
cd ~/dev-shared/projects/portfolio-website
git branch claude/local dev
git branch claude/cloud dev
git push origin claude/local claude/cloud
```

**How to start the cloud session:** open https://claude.ai/code → Code tab → New session → pick `vkkatariya/vkkatariya.github.io` → pick branch `claude/cloud` → rename to `[portfolio-website]-cloud`. NOT from the CLI — `claude --remote-control` is a relay, not a cloud container.

**Cross-session handoff:** read top 3 of `tasks/DEVLOG.md` on every resume — the cloud and local sessions log to the same DEVLOG with `cloud-session-start` / `cloud-session-end` / `local-session-handoff` markers so the other side knows what happened. Coordination also happens via git branches and PRs.

## Workflow references (symlinked, homelab-only)

The `./workflow/` directory is a symlink to `~/dev-shared/workflow/` — same path on every machine via mutagen sync. **Do not commit it** (already in `.gitignore`). Read workflow files on demand, not at every session start:

- `./workflow/SESSION-WORKFLOW.md` — Claude Code session lifecycle, /remote-control, compaction
- `./workflow/SESSION-WORKFLOW.md` — Claude Code session lifecycle, dual-session (local relay + Anthropic cloud), lineage branches, /remote-control, compaction
- `./workflow/AI-ROUTING.md` — L1/L2/L3 layer model, tool vs agent routing
- `./workflow/GIT-GITHUB-BLUEPRINT.md` — branch/commit/PR conventions
- `./workflow/agents_workflow/AI-AGENTS-ORCHESTRATION.md` — sub-agent dispatch patterns
Expand All @@ -29,6 +57,14 @@ If the symlink is broken on a fresh clone, recreate it:
ln -sf ~/dev-shared/workflow ./workflow
```

## Compaction + /remote-control (project-specific)

- **/remote-control** is the real command (not `/rc` — that's hallucinated)
- **PreCompact hook** is installed in `.claude/settings.json` — auto-writes a marker to `tasks/DEVLOG.md` before context collapses
- **Before manual /compact:** commit, push, append your work-in-progress to `tasks/DEVLOG.md` (the hook handles auto-compact, but manual is your responsibility)
- **After /compact** or /clear: re-read top 3 of `tasks/DEVLOG.md`, re-read this CLAUDE.md, check `git status` to reconstruct in-flight work
- **Pro plan 5hr rolling limit:** dual session uses 2 surfaces in parallel. Heavy days may hit limits. Run heavy CPU work (Playwright, builds) in cloud, not local, to spread load

---

## Commands
Expand Down Expand Up @@ -338,3 +374,6 @@ All icons are **self-contained inline SVG** with class `.ico`. No external CDN.
Agents write to `tasks/DEVLOG.md` (newest entry at top) at the end of every session. Format and required fields are in `AGENTS.md`. This is mandatory — a missing DEVLOG entry breaks the next session's handoff.

Lessons from corrections go in `tasks/lessons.md` (newest at top, numbered L-0NN).

<!-- 2026-06-30 · local-session smoke test · branch feat/claude-local-smoke -->
<!-- 2026-06-30 · cloud-session smoke test · branch feat/claude-cloud-smoke -->
12 changes: 6 additions & 6 deletions CONTEXT.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

## What this is

A personal portfolio web app at `vishalkatariya.dev`.
A personal portfolio web app at `vishal-katariya.com`.

- Public: homepage, project showcase, CS roadmap, about/contact.
- Private (behind auth): `/me/vault`, `/me/docs`.
Expand Down Expand Up @@ -49,7 +49,7 @@ A personal portfolio web app at `vishalkatariya.dev`.
| Finance buddy | `buddy.auxois-wyrm.ts.net` | Private transaction dashboard |

**Hosting split:**
- **Vercel (`vishalkatariya.dev`)** serves all public routes. Repo already connected; domain already configured.
- **Vercel (`vishal-katariya.com`)** serves all public routes. Repo already connected; domain already configured.
- **athena (`auxois-wyrm.ts.net`)** serves anything private or backend-heavy via Tailscale. No public exposure.
- This is a hybrid architecture: public edge CDN for speed + reliability; homelab for private control and self-hosted data.

Expand All @@ -68,7 +68,7 @@ A personal portfolio web app at `vishalkatariya.dev`.
```
With this approach no Caddy `remote_ip` rule is required, but the Caddy reverse-proxy + certificate path is still the recommended production pattern.

3. **Explicitly not allowed:** page-level passwords, client-side auth checks, or exposing `/me` content on `vishalkatariya.dev`.
3. **Explicitly not allowed:** page-level passwords, client-side auth checks, or exposing `/me` content on `vishal-katariya.com`.

The `/me` page in `portfolio-combined.html` is only an informational placeholder used inside the prototype; the real gate lives at the reverse proxy / network layer on athena.

Expand All @@ -78,7 +78,7 @@ The `/me` page in `portfolio-combined.html` is only an informational placeholder

| Layer | Technology | Notes |
|---|---|---|
| Frontend | SvelteKit + TypeScript | Vercel deploy, `vishalkatariya.dev` |
| Frontend | SvelteKit + TypeScript | Vercel deploy, `vishal-katariya.com` |
| Styling | Vanilla CSS with shared tokens | NothingOS + Liquid Glass + Neomorphism + NeoPOP |
| Fonts | Cormorant Garamond + Space Grotesk + Outfit + DM Mono | Google Fonts CDN |
| Backend | None for portfolio itself | Vercel serverless functions for contact form + GitHub contribution grid proxy; private `/me` backend on athena |
Expand All @@ -97,15 +97,15 @@ The `/me` page in `portfolio-combined.html` is only an informational placeholder
| Vercel | Portfolio frontend CDN | public |

**Tailnet:** `auxois-wyrm.ts.net`
**Portfolio deploy:** Vercel → `vishalkatariya.dev`
**Portfolio deploy:** Vercel → `vishal-katariya.com`
**GitHub mirror:** `vkkatariya.github.io`

---

## Repo

- **GitHub:** `vkkatariya/vkkatariya.github.io`
- **Domain:** `vishalkatariya.dev`
- **Domain:** `vishal-katariya.com`
- **GitHub username:** `vkkatariya`

---
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

![CI](https://github.com/vkkatariya/vkkatariya.github.io/actions/workflows/ci.yml/badge.svg)

Personal portfolio web app. Live at `vishalkatariya.dev`.
Personal portfolio web app. Live at `vishal-katariya.com`.

This is a **simple standalone portfolio** — not a monolith. Real projects (homelab dashboard, finance buddy) live on their own private subdomains and are linked from `/projects`. Private notes and tools live behind `/me` auth.

Expand Down Expand Up @@ -53,7 +53,7 @@ Standalone projects:

- **Recommended pattern:** Caddy `remote_ip` matcher that rejects any client outside the Tailscale CGNAT range `100.64.0.0/10` with `403`. See `homelab-configs/me-tailscale-caddy.conf`.
- **Alternative pattern:** bind the static server to the Tailscale IP only, e.g. `python3 -m http.server 8900 --bind "$(tailscale ip -4)"`, so the service has no public listening socket.
- **Not allowed:** page-level passwords, client-side auth checks, or exposing `/me` content on `vishalkatariya.dev`.
- **Not allowed:** page-level passwords, client-side auth checks, or exposing `/me` content on `vishal-katariya.com`.

The `/me` section shown in `portfolio-combined.html` is just a static information card; the real gate lives on athena.

Expand Down
6 changes: 3 additions & 3 deletions docs/mental-model-tree.html
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@
<div class="proj proj-port">
<div class="proj-tag">Project 01</div>
<div class="proj-name">portfolio-website</div>
<div class="proj-url">vishalkatariya.dev · vkkatariya/vkkatariya.github.io</div>
<div class="proj-url">vishal-katariya.com · vkkatariya/vkkatariya.github.io</div>

<div class="l1-grid">

Expand Down Expand Up @@ -329,7 +329,7 @@
<div class="l1-title">Vercel + GitHub Pages</div>
<div class="l1-sub">CDN frontend · VPS backend</div>
<div class="l1-chips">
<span class="chip">Vercel → vishalkatariya.dev</span>
<span class="chip">Vercel → vishal-katariya.com</span>
<span class="chip">GH Pages → vkkatariya.github.io</span>
<span class="chip">Caddy: bind tailscale/&lt;n&gt; plugin</span>
<span class="chip">WS backend on DigitalOcean VPS</span>
Expand Down Expand Up @@ -358,7 +358,7 @@
<div class="proj proj-home">
<div class="proj-tag">Project 02</div>
<div class="proj-name">homelab-dashboard</div>
<div class="proj-url">vishalkatariya.dev/lab · lab.auxois-wyrm.ts.net (private)</div>
<div class="proj-url">vishal-katariya.com/lab · lab.auxois-wyrm.ts.net (private)</div>

<div class="l1-grid">

Expand Down
2 changes: 1 addition & 1 deletion docs/portfolio_architecture_v2.html
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
<h2 class="sr-only">Portfolio website v2 architecture — routes, artifacts, and placement decisions</h2>

<div class="root">
<div class="root-title">vishalkatariya.dev</div>
<div class="root-title">vishal-katariya.com</div>
<div class="root-sub">public · Vercel · SvelteKit</div>
</div>

Expand Down
Binary file added favicon.ico
Binary file not shown.
16 changes: 16 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,22 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vishal Katariya · Portfolio</title>
<!-- Favicon -->
<link rel="icon" href="prototypes/assets/favicon.ico" sizes="any">
<link rel="icon" type="image/svg+xml" href="prototypes/assets/favicon.svg">
<link rel="apple-touch-icon" href="prototypes/assets/apple-touch-icon.png">
<link rel="manifest" href="prototypes/assets/site.webmanifest">
<meta name="theme-color" content="#080808">
<meta name="theme-color" content="#f0f0f0" media="(prefers-color-scheme: light)">
<meta property="og:image" content="prototypes/assets/og-image.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:url" content="https://vishal-katariya.com/">
<meta property="og:title" content="Vishal Katariya — Portfolio">
<meta property="og:description" content="CS student at Hochschule Darmstadt. ML Engineering, Full-Stack, Infrastructure.">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="prototypes/assets/og-image.png">
<link rel="canonical" href="/prototypes/portfolio-combined" />
<meta http-equiv="refresh" content="0; url=/prototypes/portfolio-combined" />
<meta name="description" content="Vishal Katariya — Personal portfolio" />
Expand Down
20 changes: 18 additions & 2 deletions prototypes/about.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,22 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>About — Vishal Katariya</title>
<!-- Favicon -->
<link rel="icon" href="assets/favicon.ico" sizes="any">
<link rel="icon" type="image/svg+xml" href="assets/favicon.svg">
<link rel="apple-touch-icon" href="assets/apple-touch-icon.png">
<link rel="manifest" href="assets/site.webmanifest">
<meta name="theme-color" content="#080808">
<meta name="theme-color" content="#f0f0f0" media="(prefers-color-scheme: light)">
<meta property="og:image" content="assets/og-image.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:url" content="https://vishal-katariya.com/prototypes/about">
<meta property="og:title" content="Vishal Katariya — Portfolio">
<meta property="og:description" content="CS student at Hochschule Darmstadt. ML Engineering, Full-Stack, Infrastructure.">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="assets/og-image.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@1,600;1,700&family=DM+Mono:wght@300;400;500&family=Space+Grotesk:wght@400;500;600;700;800&family=Outfit:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
Expand Down Expand Up @@ -851,13 +867,13 @@ <h1 class="ph-title"><span class="hn-script">A</span>bout</h1>
</div>
</a>

<a class="contact-card" href="https://vishalkatariya.dev" target="_blank">
<a class="contact-card" href="https://vishal-katariya.com" target="_blank">
<div class="cc-icon">
<svg width="18" height="18" viewBox="0 0 16 16" fill="currentColor"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm7.5-6.923c-.67.204-1.335.82-1.887 1.855A7.97 7.97 0 0 0 5.145 4H7.5V1.077zM4.09 4a9.267 9.267 0 0 1 .64-1.539 6.7 6.7 0 0 1 .597-.933A7.025 7.025 0 0 0 2.255 4H4.09zm-.582 3.5c.03-.877.138-1.718.312-2.5H1.674a6.958 6.958 0 0 0-.656 2.5h2.49zM4.847 5a12.5 12.5 0 0 0-.338 2.5H7.5V5H4.847zM8.5 5v2.5h2.99a12.495 12.495 0 0 0-.337-2.5H8.5zM4.51 8.5a12.5 12.5 0 0 0 .337 2.5H7.5V8.5H4.51zm3.99 0V11h2.653c.187-.765.306-1.608.338-2.5H8.5zM5.145 12c.138.386.295.744.468 1.068.552 1.035 1.218 1.65 1.887 1.855V12H5.145zm.182 2.472a6.696 6.696 0 0 1-.597-.933A9.268 9.268 0 0 1 4.09 12H2.255a7.024 7.024 0 0 0 3.072 2.472zM3.82 11a13.652 13.652 0 0 1-.312-2.5h-2.49c.062.89.291 1.733.656 2.5H3.82zm6.853 3.472A7.024 7.024 0 0 0 13.745 12H11.91a9.27 9.27 0 0 1-.64 1.539 6.688 6.688 0 0 1-.597.933zM8.5 12v2.923c.67-.204 1.335-.82 1.887-1.855.173-.324.33-.682.468-1.068H8.5zm3.68-1h2.146c.365-.767.594-1.61.656-2.5h-2.49a13.65 13.65 0 0 1-.312 2.5zm2.802-3.5a6.959 6.959 0 0 0-.656-2.5H12.18c.174.782.282 1.623.312 2.5h2.49zM11.27 2.461c.247.464.462.98.64 1.539h1.835a7.024 7.024 0 0 0-3.072-2.472c.218.284.418.598.597.933zM10.855 4a7.966 7.966 0 0 0-.468-1.068C9.835 1.897 9.17 1.282 8.5 1.077V4h2.355z"/></svg>
</div>
<div>
<div class="cc-label">WEBSITE</div>
<div class="cc-val">vishalkatariya.dev</div>
<div class="cc-val">vishal-katariya.com</div>
</div>
</a>
</div>
Expand Down
Binary file added prototypes/assets/apple-touch-icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added prototypes/assets/favicon-16x16.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added prototypes/assets/favicon-32x32.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added prototypes/assets/favicon.ico
Binary file not shown.
Loading