feat(home): personalized dashboard for logged-in users - #58

Merged
agustinkassis merged 1 commit into
mainfrom
claude/festive-yonath-b4e523
Jul 6, 2026
Merged

feat(home): personalized dashboard for logged-in users#58
agustinkassis merged 1 commit into
mainfrom
claude/festive-yonath-b4e523

Conversation

@agustinkassis

@agustinkassisagustinkassis commented Jul 6, 2026

Copy link
Copy Markdown
Member

What

When a user is logged in, the home page (/) now renders a personalized dashboard instead of the marketing page. Logged-out visitors and crawlers still get the exact same server-rendered, indexable marketing home.

Why

The home page was purely marketing with no auth awareness. Returning users benefit from a panel that shows the hackathons they've played and nudges them to keep participating — while preserving SEO for anonymous traffic.

How

Auth lives only in localStorage, so it's unknown during SSR. A small client gate keeps the marketing content as the SSR default and swaps in the dashboard on the client once useAuth reports ready && auth. Because the server and first client render both show the marketing content, there's no hydration mismatch and no SEO regression.

New files

  • components/home/HomeGate.tsx — client gate: renders the marketing children until logged in, then swaps to the dashboard.
  • components/home/HomeDashboard.tsx — the logged-in view:
    • greeting band with avatar, name and stats (hackatones / proyectos)
    • an engagement CTA that adapts to the featured hackathon's state (active → sumate / seguí puliendo; upcoming → preparate; none → creá / explorá)
    • Mis hackatones — hackathons played, grouped into cards with status badges and project rows, plus an encouraging empty state
    • quick-action tiles (proyectos, perfil, explorar, soldados) and the existing newsletter CTA
  • lib/useUserHackathons.ts — shared hook that loads a user's Nostr projects (cache-first, then relays) and groups the hackathon ones.

Edited

  • app/page.tsx — wraps the marketing content in <HomeGate>.
  • app/dashboard/hackathones/MisHackatonesClient.tsx — refactored onto the shared hook (dedupes the fetch + grouping logic the new dashboard also needs).

Testing

  • tsc --noEmit → clean.
  • Logged-out home: marketing page unchanged.
  • Logged-in, no projects: greeting, 0/0 stats, upcoming-hackathon CTA, empty-state card.
  • Logged-in, with projects (seeded cache): stats/subtitle update to 2/2, hackathon cards render with correct icons, status badges (PRÓXIMO / CERRADO) and project rows linking to /projects/<slug>.
  • Refactored /dashboard/hackathones still works via the shared hook.

Reviewer notes

  • There is no /home route in this app — the home page is /, which is what changed.
  • Logged-in users see a brief one-frame flash of the marketing home before the client swap. This is unavoidable given auth is client-only, and is consistent with how the rest of the app reads auth. Crawlers and logged-out users never see the dashboard.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • The home page now shows a personalized dashboard after sign-in, including featured hackathons, project groups, quick action cards, and newsletter signup.
    • Added faster loading for your hackathon projects with cached data and smoother refreshes.
  • Bug Fixes
    • Improved home-page rendering during sign-in so the right view appears without layout flicker.
    • Updated hackathon grouping and sorting for more consistent display.

Logged-in visitors now see a personalized dashboard on `/` instead of the
marketing home. Logged-out visitors and crawlers still get the same
server-rendered, indexable marketing page.
Auth lives only in localStorage, so it's unknown during SSR. HomeGate keeps
the marketing content as the SSR default and swaps in the dashboard on the
client once `useAuth` reports `ready && auth` — no hydration mismatch, no SEO
regression.
The dashboard surfaces:
- greeting band with avatar, name and stats (hackatones / proyectos)
- an engagement CTA that adapts to the featured hackathon's state
(active / upcoming / none) to nudge continued participation
- "Mis hackatones" — hackathons played, grouped into cards with status
badges and project rows, plus an encouraging empty state
- quick-action tiles (proyectos, perfil, explorar, soldados) and the
existing newsletter CTA
Extracts the user-projects fetch + hackathon grouping into a shared
`useUserHackathons` hook, reused by both the new dashboard and the existing
`/dashboard/hackathones` page (which is refactored onto it).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 6, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentJul 6, 2026 4:24am

Request Review

@coderabbitai

coderabbitaiBot commented Jul 6, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

A shared useUserHackathons hook was introduced to load and group user hackathon projects, replacing duplicate logic in MisHackatonesClient. A new HomeDashboard component was added, rendering hackathon stats and actions, and gated behind auth readiness via a new HomeGate wrapper used on the home page.

Changes

Hackathon Hook and Home Dashboard

Layer / File(s)Summary
Shared hackathon grouping hook
lib/useUserHackathons.ts
New hook loads cached/fresh user projects, groups them by hackathon (sorted alphabetically), and exposes hackathonName, HackathonGroup, and { projects, groups, loading }.
MisHackatonesClient refactor
app/dashboard/hackathones/MisHackatonesClient.tsx
Removes local project fetching/caching and grouping logic, replacing it with groups/loading from useUserHackathons.
Home dashboard UI
components/home/HomeDashboard.tsx
New client component computing featured hackathon, stats, and rendering avatar, stat cards, featured action card, hackathon list/empty state, action tiles, and status badges.
Auth gate and home page wiring
components/home/HomeGate.tsx, app/page.tsx
New HomeGate renders children until auth is ready, then swaps to HomeDashboard; app/page.tsx wraps its content in HomeGate.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
participant Page as app/page.tsx
participant HomeGate
participant useAuth
participant HomeDashboard
participant useUserHackathons
participant fetchUserProjects
Page->>HomeGate: render(children)
HomeGate->>useAuth: check ready/auth
useAuth-->>HomeGate: { ready, auth }
alt ready && auth
HomeGate->>HomeDashboard: render
HomeDashboard->>useUserHackathons: call(readPubkey)
useUserHackathons->>fetchUserProjects: fetch projects
fetchUserProjects-->>useUserHackathons: projects
useUserHackathons-->>HomeDashboard: { groups, loading }
HomeDashboard-->>Page: rendered dashboard
else not authenticated
HomeGate-->>Page: render children
end
Loading

Suggested labels: frontend, refactor, feature

Suggested reviewers: none identified

🐰 Hopping through hooks, both new and old,
Grouping hackathons, stories untold,
A gate now guards the homepage door,
Dashboard blooms where fragments were before.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly summarizes the main change: a personalized home dashboard for authenticated users.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/festive-yonath-b4e523

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.

@coderabbitaicoderabbitaiBot 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.

🧹 Nitpick comments (1)
app/page.tsx (1)

34-49: 🚀 Performance & Scalability | 🔵 Trivial

Full marketing tree — including data-fetching components — still renders server-side for authenticated users before being discarded.

HomeVotingHero (with "use cache", plus getCachedVotingPeriod) and other marketing children are always rendered on the server inside HomeGate's children, even though logged-in users will immediately swap to HomeDashboard client-side and never see them. This is an accepted tradeoff per the PR's hydration-safety design, but worth flagging: every authenticated home-page load pays the cost of computing/streaming content that's thrown away client-side. Since HomeVotingHero is cached ("use cache") the marginal per-request cost is likely low, but it's worth confirming the other marketing children (GamingHackathonBanner, HomeBenefits, HomeScroll) don't do uncached per-request work.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/page.tsx` around lines 34 - 49, The authenticated home path still renders
the full marketing tree inside HomeGate on the server before swapping to
HomeDashboard client-side, so review the marketing children for avoidable
per-request work. Check HomeVotingHero, GamingHackathonBanner, HomeBenefits, and
HomeScroll for any uncached data fetching or expensive server-side computation,
and move or cache that work if needed while preserving the current
hydration-safety behavior in HomeGate and app/page.tsx.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@app/page.tsx`:
- Around line 34-49: The authenticated home path still renders the full
marketing tree inside HomeGate on the server before swapping to HomeDashboard
client-side, so review the marketing children for avoidable per-request work.
Check HomeVotingHero, GamingHackathonBanner, HomeBenefits, and HomeScroll for
any uncached data fetching or expensive server-side computation, and move or
cache that work if needed while preserving the current hydration-safety behavior
in HomeGate and app/page.tsx.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2e83f1b6-e2fb-484d-af6e-5e6b4c3a03fe

📥 Commits

Reviewing files that changed from the base of the PR and between 5fb0e6e and bde9588.

📒 Files selected for processing (5)
  • app/dashboard/hackathones/MisHackatonesClient.tsx
  • app/page.tsx
  • components/home/HomeDashboard.tsx
  • components/home/HomeGate.tsx
  • lib/useUserHackathons.ts

@agustinkassis
agustinkassis merged commit 2e7213f into mainJul 6, 2026
3 checks passed
@agustinkassis
agustinkassis deleted the claude/festive-yonath-b4e523 branch July 6, 2026 04:33
Sign up for freeto 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

@agustinkassis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(home): personalized dashboard for logged-in users - #58

Merged
agustinkassis merged 1 commit into
mainfrom
claude/festive-yonath-b4e523
Jul 6, 2026
Merged

feat(home): personalized dashboard for logged-in users#58
agustinkassis merged 1 commit into
mainfrom
claude/festive-yonath-b4e523

Conversation

@agustinkassis

@agustinkassisagustinkassis commented Jul 6, 2026

Copy link
Copy Markdown
Member

What

When a user is logged in, the home page (/) now renders a personalized dashboard instead of the marketing page. Logged-out visitors and crawlers still get the exact same server-rendered, indexable marketing home.

Why

The home page was purely marketing with no auth awareness. Returning users benefit from a panel that shows the hackathons they've played and nudges them to keep participating — while preserving SEO for anonymous traffic.

How

Auth lives only in localStorage, so it's unknown during SSR. A small client gate keeps the marketing content as the SSR default and swaps in the dashboard on the client once useAuth reports ready && auth. Because the server and first client render both show the marketing content, there's no hydration mismatch and no SEO regression.

New files

  • components/home/HomeGate.tsx — client gate: renders the marketing children until logged in, then swaps to the dashboard.
  • components/home/HomeDashboard.tsx — the logged-in view:
    • greeting band with avatar, name and stats (hackatones / proyectos)
    • an engagement CTA that adapts to the featured hackathon's state (active → sumate / seguí puliendo; upcoming → preparate; none → creá / explorá)
    • Mis hackatones — hackathons played, grouped into cards with status badges and project rows, plus an encouraging empty state
    • quick-action tiles (proyectos, perfil, explorar, soldados) and the existing newsletter CTA
  • lib/useUserHackathons.ts — shared hook that loads a user's Nostr projects (cache-first, then relays) and groups the hackathon ones.

Edited

  • app/page.tsx — wraps the marketing content in <HomeGate>.
  • app/dashboard/hackathones/MisHackatonesClient.tsx — refactored onto the shared hook (dedupes the fetch + grouping logic the new dashboard also needs).

Testing

  • tsc --noEmit → clean.
  • Logged-out home: marketing page unchanged.
  • Logged-in, no projects: greeting, 0/0 stats, upcoming-hackathon CTA, empty-state card.
  • Logged-in, with projects (seeded cache): stats/subtitle update to 2/2, hackathon cards render with correct icons, status badges (PRÓXIMO / CERRADO) and project rows linking to /projects/<slug>.
  • Refactored /dashboard/hackathones still works via the shared hook.

Reviewer notes

  • There is no /home route in this app — the home page is /, which is what changed.
  • Logged-in users see a brief one-frame flash of the marketing home before the client swap. This is unavoidable given auth is client-only, and is consistent with how the rest of the app reads auth. Crawlers and logged-out users never see the dashboard.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • The home page now shows a personalized dashboard after sign-in, including featured hackathons, project groups, quick action cards, and newsletter signup.
    • Added faster loading for your hackathon projects with cached data and smoother refreshes.
  • Bug Fixes
    • Improved home-page rendering during sign-in so the right view appears without layout flicker.
    • Updated hackathon grouping and sorting for more consistent display.

Logged-in visitors now see a personalized dashboard on `/` instead of the
marketing home. Logged-out visitors and crawlers still get the same
server-rendered, indexable marketing page.
Auth lives only in localStorage, so it's unknown during SSR. HomeGate keeps
the marketing content as the SSR default and swaps in the dashboard on the
client once `useAuth` reports `ready && auth` — no hydration mismatch, no SEO
regression.
The dashboard surfaces:
- greeting band with avatar, name and stats (hackatones / proyectos)
- an engagement CTA that adapts to the featured hackathon's state
(active / upcoming / none) to nudge continued participation
- "Mis hackatones" — hackathons played, grouped into cards with status
badges and project rows, plus an encouraging empty state
- quick-action tiles (proyectos, perfil, explorar, soldados) and the
existing newsletter CTA
Extracts the user-projects fetch + hackathon grouping into a shared
`useUserHackathons` hook, reused by both the new dashboard and the existing
`/dashboard/hackathones` page (which is refactored onto it).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 6, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentJul 6, 2026 4:24am

Request Review

@coderabbitai

coderabbitaiBot commented Jul 6, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

A shared useUserHackathons hook was introduced to load and group user hackathon projects, replacing duplicate logic in MisHackatonesClient. A new HomeDashboard component was added, rendering hackathon stats and actions, and gated behind auth readiness via a new HomeGate wrapper used on the home page.

Changes

Hackathon Hook and Home Dashboard

Layer / File(s)Summary
Shared hackathon grouping hook
lib/useUserHackathons.ts
New hook loads cached/fresh user projects, groups them by hackathon (sorted alphabetically), and exposes hackathonName, HackathonGroup, and { projects, groups, loading }.
MisHackatonesClient refactor
app/dashboard/hackathones/MisHackatonesClient.tsx
Removes local project fetching/caching and grouping logic, replacing it with groups/loading from useUserHackathons.
Home dashboard UI
components/home/HomeDashboard.tsx
New client component computing featured hackathon, stats, and rendering avatar, stat cards, featured action card, hackathon list/empty state, action tiles, and status badges.
Auth gate and home page wiring
components/home/HomeGate.tsx, app/page.tsx
New HomeGate renders children until auth is ready, then swaps to HomeDashboard; app/page.tsx wraps its content in HomeGate.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
participant Page as app/page.tsx
participant HomeGate
participant useAuth
participant HomeDashboard
participant useUserHackathons
participant fetchUserProjects
Page->>HomeGate: render(children)
HomeGate->>useAuth: check ready/auth
useAuth-->>HomeGate: { ready, auth }
alt ready && auth
HomeGate->>HomeDashboard: render
HomeDashboard->>useUserHackathons: call(readPubkey)
useUserHackathons->>fetchUserProjects: fetch projects
fetchUserProjects-->>useUserHackathons: projects
useUserHackathons-->>HomeDashboard: { groups, loading }
HomeDashboard-->>Page: rendered dashboard
else not authenticated
HomeGate-->>Page: render children
end
Loading

Suggested labels: frontend, refactor, feature

Suggested reviewers: none identified

🐰 Hopping through hooks, both new and old,
Grouping hackathons, stories untold,
A gate now guards the homepage door,
Dashboard blooms where fragments were before.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly summarizes the main change: a personalized home dashboard for authenticated users.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/festive-yonath-b4e523

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.

@coderabbitaicoderabbitaiBot 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.

🧹 Nitpick comments (1)
app/page.tsx (1)

34-49: 🚀 Performance & Scalability | 🔵 Trivial

Full marketing tree — including data-fetching components — still renders server-side for authenticated users before being discarded.

HomeVotingHero (with "use cache", plus getCachedVotingPeriod) and other marketing children are always rendered on the server inside HomeGate's children, even though logged-in users will immediately swap to HomeDashboard client-side and never see them. This is an accepted tradeoff per the PR's hydration-safety design, but worth flagging: every authenticated home-page load pays the cost of computing/streaming content that's thrown away client-side. Since HomeVotingHero is cached ("use cache") the marginal per-request cost is likely low, but it's worth confirming the other marketing children (GamingHackathonBanner, HomeBenefits, HomeScroll) don't do uncached per-request work.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/page.tsx` around lines 34 - 49, The authenticated home path still renders
the full marketing tree inside HomeGate on the server before swapping to
HomeDashboard client-side, so review the marketing children for avoidable
per-request work. Check HomeVotingHero, GamingHackathonBanner, HomeBenefits, and
HomeScroll for any uncached data fetching or expensive server-side computation,
and move or cache that work if needed while preserving the current
hydration-safety behavior in HomeGate and app/page.tsx.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@app/page.tsx`:
- Around line 34-49: The authenticated home path still renders the full
marketing tree inside HomeGate on the server before swapping to HomeDashboard
client-side, so review the marketing children for avoidable per-request work.
Check HomeVotingHero, GamingHackathonBanner, HomeBenefits, and HomeScroll for
any uncached data fetching or expensive server-side computation, and move or
cache that work if needed while preserving the current hydration-safety behavior
in HomeGate and app/page.tsx.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2e83f1b6-e2fb-484d-af6e-5e6b4c3a03fe

📥 Commits

Reviewing files that changed from the base of the PR and between 5fb0e6e and bde9588.

📒 Files selected for processing (5)
  • app/dashboard/hackathones/MisHackatonesClient.tsx
  • app/page.tsx
  • components/home/HomeDashboard.tsx
  • components/home/HomeGate.tsx
  • lib/useUserHackathons.ts

@agustinkassis
agustinkassis merged commit 2e7213f into mainJul 6, 2026
3 checks passed
@agustinkassis
agustinkassis deleted the claude/festive-yonath-b4e523 branch July 6, 2026 04:33
Sign up for freeto 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

@agustinkassis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(home): personalized dashboard for logged-in users - #58

Merged
agustinkassis merged 1 commit into
mainfrom
claude/festive-yonath-b4e523
Jul 6, 2026
Merged

feat(home): personalized dashboard for logged-in users#58
agustinkassis merged 1 commit into
mainfrom
claude/festive-yonath-b4e523

Conversation

@agustinkassis

@agustinkassisagustinkassis commented Jul 6, 2026

Copy link
Copy Markdown
Member

What

When a user is logged in, the home page (/) now renders a personalized dashboard instead of the marketing page. Logged-out visitors and crawlers still get the exact same server-rendered, indexable marketing home.

Why

The home page was purely marketing with no auth awareness. Returning users benefit from a panel that shows the hackathons they've played and nudges them to keep participating — while preserving SEO for anonymous traffic.

How

Auth lives only in localStorage, so it's unknown during SSR. A small client gate keeps the marketing content as the SSR default and swaps in the dashboard on the client once useAuth reports ready && auth. Because the server and first client render both show the marketing content, there's no hydration mismatch and no SEO regression.

New files

  • components/home/HomeGate.tsx — client gate: renders the marketing children until logged in, then swaps to the dashboard.
  • components/home/HomeDashboard.tsx — the logged-in view:
    • greeting band with avatar, name and stats (hackatones / proyectos)
    • an engagement CTA that adapts to the featured hackathon's state (active → sumate / seguí puliendo; upcoming → preparate; none → creá / explorá)
    • Mis hackatones — hackathons played, grouped into cards with status badges and project rows, plus an encouraging empty state
    • quick-action tiles (proyectos, perfil, explorar, soldados) and the existing newsletter CTA
  • lib/useUserHackathons.ts — shared hook that loads a user's Nostr projects (cache-first, then relays) and groups the hackathon ones.

Edited

  • app/page.tsx — wraps the marketing content in <HomeGate>.
  • app/dashboard/hackathones/MisHackatonesClient.tsx — refactored onto the shared hook (dedupes the fetch + grouping logic the new dashboard also needs).

Testing

  • tsc --noEmit → clean.
  • Logged-out home: marketing page unchanged.
  • Logged-in, no projects: greeting, 0/0 stats, upcoming-hackathon CTA, empty-state card.
  • Logged-in, with projects (seeded cache): stats/subtitle update to 2/2, hackathon cards render with correct icons, status badges (PRÓXIMO / CERRADO) and project rows linking to /projects/<slug>.
  • Refactored /dashboard/hackathones still works via the shared hook.

Reviewer notes

  • There is no /home route in this app — the home page is /, which is what changed.
  • Logged-in users see a brief one-frame flash of the marketing home before the client swap. This is unavoidable given auth is client-only, and is consistent with how the rest of the app reads auth. Crawlers and logged-out users never see the dashboard.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • The home page now shows a personalized dashboard after sign-in, including featured hackathons, project groups, quick action cards, and newsletter signup.
    • Added faster loading for your hackathon projects with cached data and smoother refreshes.
  • Bug Fixes
    • Improved home-page rendering during sign-in so the right view appears without layout flicker.
    • Updated hackathon grouping and sorting for more consistent display.

Logged-in visitors now see a personalized dashboard on `/` instead of the
marketing home. Logged-out visitors and crawlers still get the same
server-rendered, indexable marketing page.
Auth lives only in localStorage, so it's unknown during SSR. HomeGate keeps
the marketing content as the SSR default and swaps in the dashboard on the
client once `useAuth` reports `ready && auth` — no hydration mismatch, no SEO
regression.
The dashboard surfaces:
- greeting band with avatar, name and stats (hackatones / proyectos)
- an engagement CTA that adapts to the featured hackathon's state
(active / upcoming / none) to nudge continued participation
- "Mis hackatones" — hackathons played, grouped into cards with status
badges and project rows, plus an encouraging empty state
- quick-action tiles (proyectos, perfil, explorar, soldados) and the
existing newsletter CTA
Extracts the user-projects fetch + hackathon grouping into a shared
`useUserHackathons` hook, reused by both the new dashboard and the existing
`/dashboard/hackathones` page (which is refactored onto it).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 6, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentJul 6, 2026 4:24am

Request Review

@coderabbitai

coderabbitaiBot commented Jul 6, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

A shared useUserHackathons hook was introduced to load and group user hackathon projects, replacing duplicate logic in MisHackatonesClient. A new HomeDashboard component was added, rendering hackathon stats and actions, and gated behind auth readiness via a new HomeGate wrapper used on the home page.

Changes

Hackathon Hook and Home Dashboard

Layer / File(s)Summary
Shared hackathon grouping hook
lib/useUserHackathons.ts
New hook loads cached/fresh user projects, groups them by hackathon (sorted alphabetically), and exposes hackathonName, HackathonGroup, and { projects, groups, loading }.
MisHackatonesClient refactor
app/dashboard/hackathones/MisHackatonesClient.tsx
Removes local project fetching/caching and grouping logic, replacing it with groups/loading from useUserHackathons.
Home dashboard UI
components/home/HomeDashboard.tsx
New client component computing featured hackathon, stats, and rendering avatar, stat cards, featured action card, hackathon list/empty state, action tiles, and status badges.
Auth gate and home page wiring
components/home/HomeGate.tsx, app/page.tsx
New HomeGate renders children until auth is ready, then swaps to HomeDashboard; app/page.tsx wraps its content in HomeGate.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
participant Page as app/page.tsx
participant HomeGate
participant useAuth
participant HomeDashboard
participant useUserHackathons
participant fetchUserProjects
Page->>HomeGate: render(children)
HomeGate->>useAuth: check ready/auth
useAuth-->>HomeGate: { ready, auth }
alt ready && auth
HomeGate->>HomeDashboard: render
HomeDashboard->>useUserHackathons: call(readPubkey)
useUserHackathons->>fetchUserProjects: fetch projects
fetchUserProjects-->>useUserHackathons: projects
useUserHackathons-->>HomeDashboard: { groups, loading }
HomeDashboard-->>Page: rendered dashboard
else not authenticated
HomeGate-->>Page: render children
end
Loading

Suggested labels: frontend, refactor, feature

Suggested reviewers: none identified

🐰 Hopping through hooks, both new and old,
Grouping hackathons, stories untold,
A gate now guards the homepage door,
Dashboard blooms where fragments were before.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly summarizes the main change: a personalized home dashboard for authenticated users.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/festive-yonath-b4e523

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.

@coderabbitaicoderabbitaiBot 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.

🧹 Nitpick comments (1)
app/page.tsx (1)

34-49: 🚀 Performance & Scalability | 🔵 Trivial

Full marketing tree — including data-fetching components — still renders server-side for authenticated users before being discarded.

HomeVotingHero (with "use cache", plus getCachedVotingPeriod) and other marketing children are always rendered on the server inside HomeGate's children, even though logged-in users will immediately swap to HomeDashboard client-side and never see them. This is an accepted tradeoff per the PR's hydration-safety design, but worth flagging: every authenticated home-page load pays the cost of computing/streaming content that's thrown away client-side. Since HomeVotingHero is cached ("use cache") the marginal per-request cost is likely low, but it's worth confirming the other marketing children (GamingHackathonBanner, HomeBenefits, HomeScroll) don't do uncached per-request work.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/page.tsx` around lines 34 - 49, The authenticated home path still renders
the full marketing tree inside HomeGate on the server before swapping to
HomeDashboard client-side, so review the marketing children for avoidable
per-request work. Check HomeVotingHero, GamingHackathonBanner, HomeBenefits, and
HomeScroll for any uncached data fetching or expensive server-side computation,
and move or cache that work if needed while preserving the current
hydration-safety behavior in HomeGate and app/page.tsx.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@app/page.tsx`:
- Around line 34-49: The authenticated home path still renders the full
marketing tree inside HomeGate on the server before swapping to HomeDashboard
client-side, so review the marketing children for avoidable per-request work.
Check HomeVotingHero, GamingHackathonBanner, HomeBenefits, and HomeScroll for
any uncached data fetching or expensive server-side computation, and move or
cache that work if needed while preserving the current hydration-safety behavior
in HomeGate and app/page.tsx.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2e83f1b6-e2fb-484d-af6e-5e6b4c3a03fe

📥 Commits

Reviewing files that changed from the base of the PR and between 5fb0e6e and bde9588.

📒 Files selected for processing (5)
  • app/dashboard/hackathones/MisHackatonesClient.tsx
  • app/page.tsx
  • components/home/HomeDashboard.tsx
  • components/home/HomeGate.tsx
  • lib/useUserHackathons.ts

@agustinkassis
agustinkassis merged commit 2e7213f into mainJul 6, 2026
3 checks passed
@agustinkassis
agustinkassis deleted the claude/festive-yonath-b4e523 branch July 6, 2026 04:33
Sign up for freeto 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

@agustinkassis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(home): personalized dashboard for logged-in users - #58

Merged
agustinkassis merged 1 commit into
mainfrom
claude/festive-yonath-b4e523
Jul 6, 2026
Merged

feat(home): personalized dashboard for logged-in users#58
agustinkassis merged 1 commit into
mainfrom
claude/festive-yonath-b4e523

Conversation

@agustinkassis

@agustinkassisagustinkassis commented Jul 6, 2026

Copy link
Copy Markdown
Member

What

When a user is logged in, the home page (/) now renders a personalized dashboard instead of the marketing page. Logged-out visitors and crawlers still get the exact same server-rendered, indexable marketing home.

Why

The home page was purely marketing with no auth awareness. Returning users benefit from a panel that shows the hackathons they've played and nudges them to keep participating — while preserving SEO for anonymous traffic.

How

Auth lives only in localStorage, so it's unknown during SSR. A small client gate keeps the marketing content as the SSR default and swaps in the dashboard on the client once useAuth reports ready && auth. Because the server and first client render both show the marketing content, there's no hydration mismatch and no SEO regression.

New files

  • components/home/HomeGate.tsx — client gate: renders the marketing children until logged in, then swaps to the dashboard.
  • components/home/HomeDashboard.tsx — the logged-in view:
    • greeting band with avatar, name and stats (hackatones / proyectos)
    • an engagement CTA that adapts to the featured hackathon's state (active → sumate / seguí puliendo; upcoming → preparate; none → creá / explorá)
    • Mis hackatones — hackathons played, grouped into cards with status badges and project rows, plus an encouraging empty state
    • quick-action tiles (proyectos, perfil, explorar, soldados) and the existing newsletter CTA
  • lib/useUserHackathons.ts — shared hook that loads a user's Nostr projects (cache-first, then relays) and groups the hackathon ones.

Edited

  • app/page.tsx — wraps the marketing content in <HomeGate>.
  • app/dashboard/hackathones/MisHackatonesClient.tsx — refactored onto the shared hook (dedupes the fetch + grouping logic the new dashboard also needs).

Testing

  • tsc --noEmit → clean.
  • Logged-out home: marketing page unchanged.
  • Logged-in, no projects: greeting, 0/0 stats, upcoming-hackathon CTA, empty-state card.
  • Logged-in, with projects (seeded cache): stats/subtitle update to 2/2, hackathon cards render with correct icons, status badges (PRÓXIMO / CERRADO) and project rows linking to /projects/<slug>.
  • Refactored /dashboard/hackathones still works via the shared hook.

Reviewer notes

  • There is no /home route in this app — the home page is /, which is what changed.
  • Logged-in users see a brief one-frame flash of the marketing home before the client swap. This is unavoidable given auth is client-only, and is consistent with how the rest of the app reads auth. Crawlers and logged-out users never see the dashboard.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • The home page now shows a personalized dashboard after sign-in, including featured hackathons, project groups, quick action cards, and newsletter signup.
    • Added faster loading for your hackathon projects with cached data and smoother refreshes.
  • Bug Fixes
    • Improved home-page rendering during sign-in so the right view appears without layout flicker.
    • Updated hackathon grouping and sorting for more consistent display.

Logged-in visitors now see a personalized dashboard on `/` instead of the
marketing home. Logged-out visitors and crawlers still get the same
server-rendered, indexable marketing page.
Auth lives only in localStorage, so it's unknown during SSR. HomeGate keeps
the marketing content as the SSR default and swaps in the dashboard on the
client once `useAuth` reports `ready && auth` — no hydration mismatch, no SEO
regression.
The dashboard surfaces:
- greeting band with avatar, name and stats (hackatones / proyectos)
- an engagement CTA that adapts to the featured hackathon's state
(active / upcoming / none) to nudge continued participation
- "Mis hackatones" — hackathons played, grouped into cards with status
badges and project rows, plus an encouraging empty state
- quick-action tiles (proyectos, perfil, explorar, soldados) and the
existing newsletter CTA
Extracts the user-projects fetch + hackathon grouping into a shared
`useUserHackathons` hook, reused by both the new dashboard and the existing
`/dashboard/hackathones` page (which is refactored onto it).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 6, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentJul 6, 2026 4:24am

Request Review

@coderabbitai

coderabbitaiBot commented Jul 6, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

A shared useUserHackathons hook was introduced to load and group user hackathon projects, replacing duplicate logic in MisHackatonesClient. A new HomeDashboard component was added, rendering hackathon stats and actions, and gated behind auth readiness via a new HomeGate wrapper used on the home page.

Changes

Hackathon Hook and Home Dashboard

Layer / File(s)Summary
Shared hackathon grouping hook
lib/useUserHackathons.ts
New hook loads cached/fresh user projects, groups them by hackathon (sorted alphabetically), and exposes hackathonName, HackathonGroup, and { projects, groups, loading }.
MisHackatonesClient refactor
app/dashboard/hackathones/MisHackatonesClient.tsx
Removes local project fetching/caching and grouping logic, replacing it with groups/loading from useUserHackathons.
Home dashboard UI
components/home/HomeDashboard.tsx
New client component computing featured hackathon, stats, and rendering avatar, stat cards, featured action card, hackathon list/empty state, action tiles, and status badges.
Auth gate and home page wiring
components/home/HomeGate.tsx, app/page.tsx
New HomeGate renders children until auth is ready, then swaps to HomeDashboard; app/page.tsx wraps its content in HomeGate.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
participant Page as app/page.tsx
participant HomeGate
participant useAuth
participant HomeDashboard
participant useUserHackathons
participant fetchUserProjects
Page->>HomeGate: render(children)
HomeGate->>useAuth: check ready/auth
useAuth-->>HomeGate: { ready, auth }
alt ready && auth
HomeGate->>HomeDashboard: render
HomeDashboard->>useUserHackathons: call(readPubkey)
useUserHackathons->>fetchUserProjects: fetch projects
fetchUserProjects-->>useUserHackathons: projects
useUserHackathons-->>HomeDashboard: { groups, loading }
HomeDashboard-->>Page: rendered dashboard
else not authenticated
HomeGate-->>Page: render children
end
Loading

Suggested labels: frontend, refactor, feature

Suggested reviewers: none identified

🐰 Hopping through hooks, both new and old,
Grouping hackathons, stories untold,
A gate now guards the homepage door,
Dashboard blooms where fragments were before.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly summarizes the main change: a personalized home dashboard for authenticated users.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/festive-yonath-b4e523

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.

@coderabbitaicoderabbitaiBot 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.

🧹 Nitpick comments (1)
app/page.tsx (1)

34-49: 🚀 Performance & Scalability | 🔵 Trivial

Full marketing tree — including data-fetching components — still renders server-side for authenticated users before being discarded.

HomeVotingHero (with "use cache", plus getCachedVotingPeriod) and other marketing children are always rendered on the server inside HomeGate's children, even though logged-in users will immediately swap to HomeDashboard client-side and never see them. This is an accepted tradeoff per the PR's hydration-safety design, but worth flagging: every authenticated home-page load pays the cost of computing/streaming content that's thrown away client-side. Since HomeVotingHero is cached ("use cache") the marginal per-request cost is likely low, but it's worth confirming the other marketing children (GamingHackathonBanner, HomeBenefits, HomeScroll) don't do uncached per-request work.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/page.tsx` around lines 34 - 49, The authenticated home path still renders
the full marketing tree inside HomeGate on the server before swapping to
HomeDashboard client-side, so review the marketing children for avoidable
per-request work. Check HomeVotingHero, GamingHackathonBanner, HomeBenefits, and
HomeScroll for any uncached data fetching or expensive server-side computation,
and move or cache that work if needed while preserving the current
hydration-safety behavior in HomeGate and app/page.tsx.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@app/page.tsx`:
- Around line 34-49: The authenticated home path still renders the full
marketing tree inside HomeGate on the server before swapping to HomeDashboard
client-side, so review the marketing children for avoidable per-request work.
Check HomeVotingHero, GamingHackathonBanner, HomeBenefits, and HomeScroll for
any uncached data fetching or expensive server-side computation, and move or
cache that work if needed while preserving the current hydration-safety behavior
in HomeGate and app/page.tsx.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2e83f1b6-e2fb-484d-af6e-5e6b4c3a03fe

📥 Commits

Reviewing files that changed from the base of the PR and between 5fb0e6e and bde9588.

📒 Files selected for processing (5)
  • app/dashboard/hackathones/MisHackatonesClient.tsx
  • app/page.tsx
  • components/home/HomeDashboard.tsx
  • components/home/HomeGate.tsx
  • lib/useUserHackathons.ts

@agustinkassis
agustinkassis merged commit 2e7213f into mainJul 6, 2026
3 checks passed
@agustinkassis
agustinkassis deleted the claude/festive-yonath-b4e523 branch July 6, 2026 04:33
Sign up for freeto 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

@agustinkassis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(home): personalized dashboard for logged-in users - #58

Merged
agustinkassis merged 1 commit into
mainfrom
claude/festive-yonath-b4e523
Jul 6, 2026
Merged

feat(home): personalized dashboard for logged-in users#58
agustinkassis merged 1 commit into
mainfrom
claude/festive-yonath-b4e523

Conversation

@agustinkassis

@agustinkassisagustinkassis commented Jul 6, 2026

Copy link
Copy Markdown
Member

What

When a user is logged in, the home page (/) now renders a personalized dashboard instead of the marketing page. Logged-out visitors and crawlers still get the exact same server-rendered, indexable marketing home.

Why

The home page was purely marketing with no auth awareness. Returning users benefit from a panel that shows the hackathons they've played and nudges them to keep participating — while preserving SEO for anonymous traffic.

How

Auth lives only in localStorage, so it's unknown during SSR. A small client gate keeps the marketing content as the SSR default and swaps in the dashboard on the client once useAuth reports ready && auth. Because the server and first client render both show the marketing content, there's no hydration mismatch and no SEO regression.

New files

  • components/home/HomeGate.tsx — client gate: renders the marketing children until logged in, then swaps to the dashboard.
  • components/home/HomeDashboard.tsx — the logged-in view:
    • greeting band with avatar, name and stats (hackatones / proyectos)
    • an engagement CTA that adapts to the featured hackathon's state (active → sumate / seguí puliendo; upcoming → preparate; none → creá / explorá)
    • Mis hackatones — hackathons played, grouped into cards with status badges and project rows, plus an encouraging empty state
    • quick-action tiles (proyectos, perfil, explorar, soldados) and the existing newsletter CTA
  • lib/useUserHackathons.ts — shared hook that loads a user's Nostr projects (cache-first, then relays) and groups the hackathon ones.

Edited

  • app/page.tsx — wraps the marketing content in <HomeGate>.
  • app/dashboard/hackathones/MisHackatonesClient.tsx — refactored onto the shared hook (dedupes the fetch + grouping logic the new dashboard also needs).

Testing

  • tsc --noEmit → clean.
  • Logged-out home: marketing page unchanged.
  • Logged-in, no projects: greeting, 0/0 stats, upcoming-hackathon CTA, empty-state card.
  • Logged-in, with projects (seeded cache): stats/subtitle update to 2/2, hackathon cards render with correct icons, status badges (PRÓXIMO / CERRADO) and project rows linking to /projects/<slug>.
  • Refactored /dashboard/hackathones still works via the shared hook.

Reviewer notes

  • There is no /home route in this app — the home page is /, which is what changed.
  • Logged-in users see a brief one-frame flash of the marketing home before the client swap. This is unavoidable given auth is client-only, and is consistent with how the rest of the app reads auth. Crawlers and logged-out users never see the dashboard.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • The home page now shows a personalized dashboard after sign-in, including featured hackathons, project groups, quick action cards, and newsletter signup.
    • Added faster loading for your hackathon projects with cached data and smoother refreshes.
  • Bug Fixes
    • Improved home-page rendering during sign-in so the right view appears without layout flicker.
    • Updated hackathon grouping and sorting for more consistent display.

Logged-in visitors now see a personalized dashboard on `/` instead of the
marketing home. Logged-out visitors and crawlers still get the same
server-rendered, indexable marketing page.
Auth lives only in localStorage, so it's unknown during SSR. HomeGate keeps
the marketing content as the SSR default and swaps in the dashboard on the
client once `useAuth` reports `ready && auth` — no hydration mismatch, no SEO
regression.
The dashboard surfaces:
- greeting band with avatar, name and stats (hackatones / proyectos)
- an engagement CTA that adapts to the featured hackathon's state
(active / upcoming / none) to nudge continued participation
- "Mis hackatones" — hackathons played, grouped into cards with status
badges and project rows, plus an encouraging empty state
- quick-action tiles (proyectos, perfil, explorar, soldados) and the
existing newsletter CTA
Extracts the user-projects fetch + hackathon grouping into a shared
`useUserHackathons` hook, reused by both the new dashboard and the existing
`/dashboard/hackathones` page (which is refactored onto it).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 6, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentJul 6, 2026 4:24am

Request Review

@coderabbitai

coderabbitaiBot commented Jul 6, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

A shared useUserHackathons hook was introduced to load and group user hackathon projects, replacing duplicate logic in MisHackatonesClient. A new HomeDashboard component was added, rendering hackathon stats and actions, and gated behind auth readiness via a new HomeGate wrapper used on the home page.

Changes

Hackathon Hook and Home Dashboard

Layer / File(s)Summary
Shared hackathon grouping hook
lib/useUserHackathons.ts
New hook loads cached/fresh user projects, groups them by hackathon (sorted alphabetically), and exposes hackathonName, HackathonGroup, and { projects, groups, loading }.
MisHackatonesClient refactor
app/dashboard/hackathones/MisHackatonesClient.tsx
Removes local project fetching/caching and grouping logic, replacing it with groups/loading from useUserHackathons.
Home dashboard UI
components/home/HomeDashboard.tsx
New client component computing featured hackathon, stats, and rendering avatar, stat cards, featured action card, hackathon list/empty state, action tiles, and status badges.
Auth gate and home page wiring
components/home/HomeGate.tsx, app/page.tsx
New HomeGate renders children until auth is ready, then swaps to HomeDashboard; app/page.tsx wraps its content in HomeGate.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
participant Page as app/page.tsx
participant HomeGate
participant useAuth
participant HomeDashboard
participant useUserHackathons
participant fetchUserProjects
Page->>HomeGate: render(children)
HomeGate->>useAuth: check ready/auth
useAuth-->>HomeGate: { ready, auth }
alt ready && auth
HomeGate->>HomeDashboard: render
HomeDashboard->>useUserHackathons: call(readPubkey)
useUserHackathons->>fetchUserProjects: fetch projects
fetchUserProjects-->>useUserHackathons: projects
useUserHackathons-->>HomeDashboard: { groups, loading }
HomeDashboard-->>Page: rendered dashboard
else not authenticated
HomeGate-->>Page: render children
end
Loading

Suggested labels: frontend, refactor, feature

Suggested reviewers: none identified

🐰 Hopping through hooks, both new and old,
Grouping hackathons, stories untold,
A gate now guards the homepage door,
Dashboard blooms where fragments were before.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly summarizes the main change: a personalized home dashboard for authenticated users.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/festive-yonath-b4e523

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.

@coderabbitaicoderabbitaiBot 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.

🧹 Nitpick comments (1)
app/page.tsx (1)

34-49: 🚀 Performance & Scalability | 🔵 Trivial

Full marketing tree — including data-fetching components — still renders server-side for authenticated users before being discarded.

HomeVotingHero (with "use cache", plus getCachedVotingPeriod) and other marketing children are always rendered on the server inside HomeGate's children, even though logged-in users will immediately swap to HomeDashboard client-side and never see them. This is an accepted tradeoff per the PR's hydration-safety design, but worth flagging: every authenticated home-page load pays the cost of computing/streaming content that's thrown away client-side. Since HomeVotingHero is cached ("use cache") the marginal per-request cost is likely low, but it's worth confirming the other marketing children (GamingHackathonBanner, HomeBenefits, HomeScroll) don't do uncached per-request work.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/page.tsx` around lines 34 - 49, The authenticated home path still renders
the full marketing tree inside HomeGate on the server before swapping to
HomeDashboard client-side, so review the marketing children for avoidable
per-request work. Check HomeVotingHero, GamingHackathonBanner, HomeBenefits, and
HomeScroll for any uncached data fetching or expensive server-side computation,
and move or cache that work if needed while preserving the current
hydration-safety behavior in HomeGate and app/page.tsx.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@app/page.tsx`:
- Around line 34-49: The authenticated home path still renders the full
marketing tree inside HomeGate on the server before swapping to HomeDashboard
client-side, so review the marketing children for avoidable per-request work.
Check HomeVotingHero, GamingHackathonBanner, HomeBenefits, and HomeScroll for
any uncached data fetching or expensive server-side computation, and move or
cache that work if needed while preserving the current hydration-safety behavior
in HomeGate and app/page.tsx.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2e83f1b6-e2fb-484d-af6e-5e6b4c3a03fe

📥 Commits

Reviewing files that changed from the base of the PR and between 5fb0e6e and bde9588.

📒 Files selected for processing (5)
  • app/dashboard/hackathones/MisHackatonesClient.tsx
  • app/page.tsx
  • components/home/HomeDashboard.tsx
  • components/home/HomeGate.tsx
  • lib/useUserHackathons.ts

@agustinkassis
agustinkassis merged commit 2e7213f into mainJul 6, 2026
3 checks passed
@agustinkassis
agustinkassis deleted the claude/festive-yonath-b4e523 branch July 6, 2026 04:33
Sign up for freeto 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

@agustinkassis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(home): personalized dashboard for logged-in users - #58

Merged
agustinkassis merged 1 commit into
mainfrom
claude/festive-yonath-b4e523
Jul 6, 2026
Merged

feat(home): personalized dashboard for logged-in users#58
agustinkassis merged 1 commit into
mainfrom
claude/festive-yonath-b4e523

Conversation

@agustinkassis

@agustinkassisagustinkassis commented Jul 6, 2026

Copy link
Copy Markdown
Member

What

When a user is logged in, the home page (/) now renders a personalized dashboard instead of the marketing page. Logged-out visitors and crawlers still get the exact same server-rendered, indexable marketing home.

Why

The home page was purely marketing with no auth awareness. Returning users benefit from a panel that shows the hackathons they've played and nudges them to keep participating — while preserving SEO for anonymous traffic.

How

Auth lives only in localStorage, so it's unknown during SSR. A small client gate keeps the marketing content as the SSR default and swaps in the dashboard on the client once useAuth reports ready && auth. Because the server and first client render both show the marketing content, there's no hydration mismatch and no SEO regression.

New files

  • components/home/HomeGate.tsx — client gate: renders the marketing children until logged in, then swaps to the dashboard.
  • components/home/HomeDashboard.tsx — the logged-in view:
    • greeting band with avatar, name and stats (hackatones / proyectos)
    • an engagement CTA that adapts to the featured hackathon's state (active → sumate / seguí puliendo; upcoming → preparate; none → creá / explorá)
    • Mis hackatones — hackathons played, grouped into cards with status badges and project rows, plus an encouraging empty state
    • quick-action tiles (proyectos, perfil, explorar, soldados) and the existing newsletter CTA
  • lib/useUserHackathons.ts — shared hook that loads a user's Nostr projects (cache-first, then relays) and groups the hackathon ones.

Edited

  • app/page.tsx — wraps the marketing content in <HomeGate>.
  • app/dashboard/hackathones/MisHackatonesClient.tsx — refactored onto the shared hook (dedupes the fetch + grouping logic the new dashboard also needs).

Testing

  • tsc --noEmit → clean.
  • Logged-out home: marketing page unchanged.
  • Logged-in, no projects: greeting, 0/0 stats, upcoming-hackathon CTA, empty-state card.
  • Logged-in, with projects (seeded cache): stats/subtitle update to 2/2, hackathon cards render with correct icons, status badges (PRÓXIMO / CERRADO) and project rows linking to /projects/<slug>.
  • Refactored /dashboard/hackathones still works via the shared hook.

Reviewer notes

  • There is no /home route in this app — the home page is /, which is what changed.
  • Logged-in users see a brief one-frame flash of the marketing home before the client swap. This is unavoidable given auth is client-only, and is consistent with how the rest of the app reads auth. Crawlers and logged-out users never see the dashboard.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • The home page now shows a personalized dashboard after sign-in, including featured hackathons, project groups, quick action cards, and newsletter signup.
    • Added faster loading for your hackathon projects with cached data and smoother refreshes.
  • Bug Fixes
    • Improved home-page rendering during sign-in so the right view appears without layout flicker.
    • Updated hackathon grouping and sorting for more consistent display.

Logged-in visitors now see a personalized dashboard on `/` instead of the
marketing home. Logged-out visitors and crawlers still get the same
server-rendered, indexable marketing page.
Auth lives only in localStorage, so it's unknown during SSR. HomeGate keeps
the marketing content as the SSR default and swaps in the dashboard on the
client once `useAuth` reports `ready && auth` — no hydration mismatch, no SEO
regression.
The dashboard surfaces:
- greeting band with avatar, name and stats (hackatones / proyectos)
- an engagement CTA that adapts to the featured hackathon's state
(active / upcoming / none) to nudge continued participation
- "Mis hackatones" — hackathons played, grouped into cards with status
badges and project rows, plus an encouraging empty state
- quick-action tiles (proyectos, perfil, explorar, soldados) and the
existing newsletter CTA
Extracts the user-projects fetch + hackathon grouping into a shared
`useUserHackathons` hook, reused by both the new dashboard and the existing
`/dashboard/hackathones` page (which is refactored onto it).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 6, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentJul 6, 2026 4:24am

Request Review

@coderabbitai

coderabbitaiBot commented Jul 6, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

A shared useUserHackathons hook was introduced to load and group user hackathon projects, replacing duplicate logic in MisHackatonesClient. A new HomeDashboard component was added, rendering hackathon stats and actions, and gated behind auth readiness via a new HomeGate wrapper used on the home page.

Changes

Hackathon Hook and Home Dashboard

Layer / File(s)Summary
Shared hackathon grouping hook
lib/useUserHackathons.ts
New hook loads cached/fresh user projects, groups them by hackathon (sorted alphabetically), and exposes hackathonName, HackathonGroup, and { projects, groups, loading }.
MisHackatonesClient refactor
app/dashboard/hackathones/MisHackatonesClient.tsx
Removes local project fetching/caching and grouping logic, replacing it with groups/loading from useUserHackathons.
Home dashboard UI
components/home/HomeDashboard.tsx
New client component computing featured hackathon, stats, and rendering avatar, stat cards, featured action card, hackathon list/empty state, action tiles, and status badges.
Auth gate and home page wiring
components/home/HomeGate.tsx, app/page.tsx
New HomeGate renders children until auth is ready, then swaps to HomeDashboard; app/page.tsx wraps its content in HomeGate.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
participant Page as app/page.tsx
participant HomeGate
participant useAuth
participant HomeDashboard
participant useUserHackathons
participant fetchUserProjects
Page->>HomeGate: render(children)
HomeGate->>useAuth: check ready/auth
useAuth-->>HomeGate: { ready, auth }
alt ready && auth
HomeGate->>HomeDashboard: render
HomeDashboard->>useUserHackathons: call(readPubkey)
useUserHackathons->>fetchUserProjects: fetch projects
fetchUserProjects-->>useUserHackathons: projects
useUserHackathons-->>HomeDashboard: { groups, loading }
HomeDashboard-->>Page: rendered dashboard
else not authenticated
HomeGate-->>Page: render children
end
Loading

Suggested labels: frontend, refactor, feature

Suggested reviewers: none identified

🐰 Hopping through hooks, both new and old,
Grouping hackathons, stories untold,
A gate now guards the homepage door,
Dashboard blooms where fragments were before.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly summarizes the main change: a personalized home dashboard for authenticated users.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/festive-yonath-b4e523

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.

@coderabbitaicoderabbitaiBot 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.

🧹 Nitpick comments (1)
app/page.tsx (1)

34-49: 🚀 Performance & Scalability | 🔵 Trivial

Full marketing tree — including data-fetching components — still renders server-side for authenticated users before being discarded.

HomeVotingHero (with "use cache", plus getCachedVotingPeriod) and other marketing children are always rendered on the server inside HomeGate's children, even though logged-in users will immediately swap to HomeDashboard client-side and never see them. This is an accepted tradeoff per the PR's hydration-safety design, but worth flagging: every authenticated home-page load pays the cost of computing/streaming content that's thrown away client-side. Since HomeVotingHero is cached ("use cache") the marginal per-request cost is likely low, but it's worth confirming the other marketing children (GamingHackathonBanner, HomeBenefits, HomeScroll) don't do uncached per-request work.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/page.tsx` around lines 34 - 49, The authenticated home path still renders
the full marketing tree inside HomeGate on the server before swapping to
HomeDashboard client-side, so review the marketing children for avoidable
per-request work. Check HomeVotingHero, GamingHackathonBanner, HomeBenefits, and
HomeScroll for any uncached data fetching or expensive server-side computation,
and move or cache that work if needed while preserving the current
hydration-safety behavior in HomeGate and app/page.tsx.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@app/page.tsx`:
- Around line 34-49: The authenticated home path still renders the full
marketing tree inside HomeGate on the server before swapping to HomeDashboard
client-side, so review the marketing children for avoidable per-request work.
Check HomeVotingHero, GamingHackathonBanner, HomeBenefits, and HomeScroll for
any uncached data fetching or expensive server-side computation, and move or
cache that work if needed while preserving the current hydration-safety behavior
in HomeGate and app/page.tsx.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2e83f1b6-e2fb-484d-af6e-5e6b4c3a03fe

📥 Commits

Reviewing files that changed from the base of the PR and between 5fb0e6e and bde9588.

📒 Files selected for processing (5)
  • app/dashboard/hackathones/MisHackatonesClient.tsx
  • app/page.tsx
  • components/home/HomeDashboard.tsx
  • components/home/HomeGate.tsx
  • lib/useUserHackathons.ts

@agustinkassis
agustinkassis merged commit 2e7213f into mainJul 6, 2026
3 checks passed
@agustinkassis
agustinkassis deleted the claude/festive-yonath-b4e523 branch July 6, 2026 04:33
Sign up for freeto 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

@agustinkassis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(home): personalized dashboard for logged-in users - #58

Merged
agustinkassis merged 1 commit into
mainfrom
claude/festive-yonath-b4e523
Jul 6, 2026
Merged

feat(home): personalized dashboard for logged-in users#58
agustinkassis merged 1 commit into
mainfrom
claude/festive-yonath-b4e523

Conversation

@agustinkassis

@agustinkassisagustinkassis commented Jul 6, 2026

Copy link
Copy Markdown
Member

What

When a user is logged in, the home page (/) now renders a personalized dashboard instead of the marketing page. Logged-out visitors and crawlers still get the exact same server-rendered, indexable marketing home.

Why

The home page was purely marketing with no auth awareness. Returning users benefit from a panel that shows the hackathons they've played and nudges them to keep participating — while preserving SEO for anonymous traffic.

How

Auth lives only in localStorage, so it's unknown during SSR. A small client gate keeps the marketing content as the SSR default and swaps in the dashboard on the client once useAuth reports ready && auth. Because the server and first client render both show the marketing content, there's no hydration mismatch and no SEO regression.

New files

  • components/home/HomeGate.tsx — client gate: renders the marketing children until logged in, then swaps to the dashboard.
  • components/home/HomeDashboard.tsx — the logged-in view:
    • greeting band with avatar, name and stats (hackatones / proyectos)
    • an engagement CTA that adapts to the featured hackathon's state (active → sumate / seguí puliendo; upcoming → preparate; none → creá / explorá)
    • Mis hackatones — hackathons played, grouped into cards with status badges and project rows, plus an encouraging empty state
    • quick-action tiles (proyectos, perfil, explorar, soldados) and the existing newsletter CTA
  • lib/useUserHackathons.ts — shared hook that loads a user's Nostr projects (cache-first, then relays) and groups the hackathon ones.

Edited

  • app/page.tsx — wraps the marketing content in <HomeGate>.
  • app/dashboard/hackathones/MisHackatonesClient.tsx — refactored onto the shared hook (dedupes the fetch + grouping logic the new dashboard also needs).

Testing

  • tsc --noEmit → clean.
  • Logged-out home: marketing page unchanged.
  • Logged-in, no projects: greeting, 0/0 stats, upcoming-hackathon CTA, empty-state card.
  • Logged-in, with projects (seeded cache): stats/subtitle update to 2/2, hackathon cards render with correct icons, status badges (PRÓXIMO / CERRADO) and project rows linking to /projects/<slug>.
  • Refactored /dashboard/hackathones still works via the shared hook.

Reviewer notes

  • There is no /home route in this app — the home page is /, which is what changed.
  • Logged-in users see a brief one-frame flash of the marketing home before the client swap. This is unavoidable given auth is client-only, and is consistent with how the rest of the app reads auth. Crawlers and logged-out users never see the dashboard.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • The home page now shows a personalized dashboard after sign-in, including featured hackathons, project groups, quick action cards, and newsletter signup.
    • Added faster loading for your hackathon projects with cached data and smoother refreshes.
  • Bug Fixes
    • Improved home-page rendering during sign-in so the right view appears without layout flicker.
    • Updated hackathon grouping and sorting for more consistent display.

Logged-in visitors now see a personalized dashboard on `/` instead of the
marketing home. Logged-out visitors and crawlers still get the same
server-rendered, indexable marketing page.
Auth lives only in localStorage, so it's unknown during SSR. HomeGate keeps
the marketing content as the SSR default and swaps in the dashboard on the
client once `useAuth` reports `ready && auth` — no hydration mismatch, no SEO
regression.
The dashboard surfaces:
- greeting band with avatar, name and stats (hackatones / proyectos)
- an engagement CTA that adapts to the featured hackathon's state
(active / upcoming / none) to nudge continued participation
- "Mis hackatones" — hackathons played, grouped into cards with status
badges and project rows, plus an encouraging empty state
- quick-action tiles (proyectos, perfil, explorar, soldados) and the
existing newsletter CTA
Extracts the user-projects fetch + hackathon grouping into a shared
`useUserHackathons` hook, reused by both the new dashboard and the existing
`/dashboard/hackathones` page (which is refactored onto it).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 6, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentJul 6, 2026 4:24am

Request Review

@coderabbitai

coderabbitaiBot commented Jul 6, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

A shared useUserHackathons hook was introduced to load and group user hackathon projects, replacing duplicate logic in MisHackatonesClient. A new HomeDashboard component was added, rendering hackathon stats and actions, and gated behind auth readiness via a new HomeGate wrapper used on the home page.

Changes

Hackathon Hook and Home Dashboard

Layer / File(s)Summary
Shared hackathon grouping hook
lib/useUserHackathons.ts
New hook loads cached/fresh user projects, groups them by hackathon (sorted alphabetically), and exposes hackathonName, HackathonGroup, and { projects, groups, loading }.
MisHackatonesClient refactor
app/dashboard/hackathones/MisHackatonesClient.tsx
Removes local project fetching/caching and grouping logic, replacing it with groups/loading from useUserHackathons.
Home dashboard UI
components/home/HomeDashboard.tsx
New client component computing featured hackathon, stats, and rendering avatar, stat cards, featured action card, hackathon list/empty state, action tiles, and status badges.
Auth gate and home page wiring
components/home/HomeGate.tsx, app/page.tsx
New HomeGate renders children until auth is ready, then swaps to HomeDashboard; app/page.tsx wraps its content in HomeGate.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
participant Page as app/page.tsx
participant HomeGate
participant useAuth
participant HomeDashboard
participant useUserHackathons
participant fetchUserProjects
Page->>HomeGate: render(children)
HomeGate->>useAuth: check ready/auth
useAuth-->>HomeGate: { ready, auth }
alt ready && auth
HomeGate->>HomeDashboard: render
HomeDashboard->>useUserHackathons: call(readPubkey)
useUserHackathons->>fetchUserProjects: fetch projects
fetchUserProjects-->>useUserHackathons: projects
useUserHackathons-->>HomeDashboard: { groups, loading }
HomeDashboard-->>Page: rendered dashboard
else not authenticated
HomeGate-->>Page: render children
end
Loading

Suggested labels: frontend, refactor, feature

Suggested reviewers: none identified

🐰 Hopping through hooks, both new and old,
Grouping hackathons, stories untold,
A gate now guards the homepage door,
Dashboard blooms where fragments were before.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly summarizes the main change: a personalized home dashboard for authenticated users.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/festive-yonath-b4e523

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.

@coderabbitaicoderabbitaiBot 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.

🧹 Nitpick comments (1)
app/page.tsx (1)

34-49: 🚀 Performance & Scalability | 🔵 Trivial

Full marketing tree — including data-fetching components — still renders server-side for authenticated users before being discarded.

HomeVotingHero (with "use cache", plus getCachedVotingPeriod) and other marketing children are always rendered on the server inside HomeGate's children, even though logged-in users will immediately swap to HomeDashboard client-side and never see them. This is an accepted tradeoff per the PR's hydration-safety design, but worth flagging: every authenticated home-page load pays the cost of computing/streaming content that's thrown away client-side. Since HomeVotingHero is cached ("use cache") the marginal per-request cost is likely low, but it's worth confirming the other marketing children (GamingHackathonBanner, HomeBenefits, HomeScroll) don't do uncached per-request work.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/page.tsx` around lines 34 - 49, The authenticated home path still renders
the full marketing tree inside HomeGate on the server before swapping to
HomeDashboard client-side, so review the marketing children for avoidable
per-request work. Check HomeVotingHero, GamingHackathonBanner, HomeBenefits, and
HomeScroll for any uncached data fetching or expensive server-side computation,
and move or cache that work if needed while preserving the current
hydration-safety behavior in HomeGate and app/page.tsx.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@app/page.tsx`:
- Around line 34-49: The authenticated home path still renders the full
marketing tree inside HomeGate on the server before swapping to HomeDashboard
client-side, so review the marketing children for avoidable per-request work.
Check HomeVotingHero, GamingHackathonBanner, HomeBenefits, and HomeScroll for
any uncached data fetching or expensive server-side computation, and move or
cache that work if needed while preserving the current hydration-safety behavior
in HomeGate and app/page.tsx.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2e83f1b6-e2fb-484d-af6e-5e6b4c3a03fe

📥 Commits

Reviewing files that changed from the base of the PR and between 5fb0e6e and bde9588.

📒 Files selected for processing (5)
  • app/dashboard/hackathones/MisHackatonesClient.tsx
  • app/page.tsx
  • components/home/HomeDashboard.tsx
  • components/home/HomeGate.tsx
  • lib/useUserHackathons.ts

@agustinkassis
agustinkassis merged commit 2e7213f into mainJul 6, 2026
3 checks passed
@agustinkassis
agustinkassis deleted the claude/festive-yonath-b4e523 branch July 6, 2026 04:33
Sign up for freeto 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

@agustinkassis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(home): personalized dashboard for logged-in users - #58

Merged
agustinkassis merged 1 commit into
mainfrom
claude/festive-yonath-b4e523
Jul 6, 2026
Merged

feat(home): personalized dashboard for logged-in users#58
agustinkassis merged 1 commit into
mainfrom
claude/festive-yonath-b4e523

Conversation

@agustinkassis

@agustinkassisagustinkassis commented Jul 6, 2026

Copy link
Copy Markdown
Member

What

When a user is logged in, the home page (/) now renders a personalized dashboard instead of the marketing page. Logged-out visitors and crawlers still get the exact same server-rendered, indexable marketing home.

Why

The home page was purely marketing with no auth awareness. Returning users benefit from a panel that shows the hackathons they've played and nudges them to keep participating — while preserving SEO for anonymous traffic.

How

Auth lives only in localStorage, so it's unknown during SSR. A small client gate keeps the marketing content as the SSR default and swaps in the dashboard on the client once useAuth reports ready && auth. Because the server and first client render both show the marketing content, there's no hydration mismatch and no SEO regression.

New files

  • components/home/HomeGate.tsx — client gate: renders the marketing children until logged in, then swaps to the dashboard.
  • components/home/HomeDashboard.tsx — the logged-in view:
    • greeting band with avatar, name and stats (hackatones / proyectos)
    • an engagement CTA that adapts to the featured hackathon's state (active → sumate / seguí puliendo; upcoming → preparate; none → creá / explorá)
    • Mis hackatones — hackathons played, grouped into cards with status badges and project rows, plus an encouraging empty state
    • quick-action tiles (proyectos, perfil, explorar, soldados) and the existing newsletter CTA
  • lib/useUserHackathons.ts — shared hook that loads a user's Nostr projects (cache-first, then relays) and groups the hackathon ones.

Edited

  • app/page.tsx — wraps the marketing content in <HomeGate>.
  • app/dashboard/hackathones/MisHackatonesClient.tsx — refactored onto the shared hook (dedupes the fetch + grouping logic the new dashboard also needs).

Testing

  • tsc --noEmit → clean.
  • Logged-out home: marketing page unchanged.
  • Logged-in, no projects: greeting, 0/0 stats, upcoming-hackathon CTA, empty-state card.
  • Logged-in, with projects (seeded cache): stats/subtitle update to 2/2, hackathon cards render with correct icons, status badges (PRÓXIMO / CERRADO) and project rows linking to /projects/<slug>.
  • Refactored /dashboard/hackathones still works via the shared hook.

Reviewer notes

  • There is no /home route in this app — the home page is /, which is what changed.
  • Logged-in users see a brief one-frame flash of the marketing home before the client swap. This is unavoidable given auth is client-only, and is consistent with how the rest of the app reads auth. Crawlers and logged-out users never see the dashboard.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • The home page now shows a personalized dashboard after sign-in, including featured hackathons, project groups, quick action cards, and newsletter signup.
    • Added faster loading for your hackathon projects with cached data and smoother refreshes.
  • Bug Fixes
    • Improved home-page rendering during sign-in so the right view appears without layout flicker.
    • Updated hackathon grouping and sorting for more consistent display.

Logged-in visitors now see a personalized dashboard on `/` instead of the
marketing home. Logged-out visitors and crawlers still get the same
server-rendered, indexable marketing page.
Auth lives only in localStorage, so it's unknown during SSR. HomeGate keeps
the marketing content as the SSR default and swaps in the dashboard on the
client once `useAuth` reports `ready && auth` — no hydration mismatch, no SEO
regression.
The dashboard surfaces:
- greeting band with avatar, name and stats (hackatones / proyectos)
- an engagement CTA that adapts to the featured hackathon's state
(active / upcoming / none) to nudge continued participation
- "Mis hackatones" — hackathons played, grouped into cards with status
badges and project rows, plus an encouraging empty state
- quick-action tiles (proyectos, perfil, explorar, soldados) and the
existing newsletter CTA
Extracts the user-projects fetch + hackathon grouping into a shared
`useUserHackathons` hook, reused by both the new dashboard and the existing
`/dashboard/hackathones` page (which is refactored onto it).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 6, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentJul 6, 2026 4:24am

Request Review

@coderabbitai

coderabbitaiBot commented Jul 6, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

A shared useUserHackathons hook was introduced to load and group user hackathon projects, replacing duplicate logic in MisHackatonesClient. A new HomeDashboard component was added, rendering hackathon stats and actions, and gated behind auth readiness via a new HomeGate wrapper used on the home page.

Changes

Hackathon Hook and Home Dashboard

Layer / File(s)Summary
Shared hackathon grouping hook
lib/useUserHackathons.ts
New hook loads cached/fresh user projects, groups them by hackathon (sorted alphabetically), and exposes hackathonName, HackathonGroup, and { projects, groups, loading }.
MisHackatonesClient refactor
app/dashboard/hackathones/MisHackatonesClient.tsx
Removes local project fetching/caching and grouping logic, replacing it with groups/loading from useUserHackathons.
Home dashboard UI
components/home/HomeDashboard.tsx
New client component computing featured hackathon, stats, and rendering avatar, stat cards, featured action card, hackathon list/empty state, action tiles, and status badges.
Auth gate and home page wiring
components/home/HomeGate.tsx, app/page.tsx
New HomeGate renders children until auth is ready, then swaps to HomeDashboard; app/page.tsx wraps its content in HomeGate.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
participant Page as app/page.tsx
participant HomeGate
participant useAuth
participant HomeDashboard
participant useUserHackathons
participant fetchUserProjects
Page->>HomeGate: render(children)
HomeGate->>useAuth: check ready/auth
useAuth-->>HomeGate: { ready, auth }
alt ready && auth
HomeGate->>HomeDashboard: render
HomeDashboard->>useUserHackathons: call(readPubkey)
useUserHackathons->>fetchUserProjects: fetch projects
fetchUserProjects-->>useUserHackathons: projects
useUserHackathons-->>HomeDashboard: { groups, loading }
HomeDashboard-->>Page: rendered dashboard
else not authenticated
HomeGate-->>Page: render children
end
Loading

Suggested labels: frontend, refactor, feature

Suggested reviewers: none identified

🐰 Hopping through hooks, both new and old,
Grouping hackathons, stories untold,
A gate now guards the homepage door,
Dashboard blooms where fragments were before.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly summarizes the main change: a personalized home dashboard for authenticated users.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/festive-yonath-b4e523

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.

@coderabbitaicoderabbitaiBot 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.

🧹 Nitpick comments (1)
app/page.tsx (1)

34-49: 🚀 Performance & Scalability | 🔵 Trivial

Full marketing tree — including data-fetching components — still renders server-side for authenticated users before being discarded.

HomeVotingHero (with "use cache", plus getCachedVotingPeriod) and other marketing children are always rendered on the server inside HomeGate's children, even though logged-in users will immediately swap to HomeDashboard client-side and never see them. This is an accepted tradeoff per the PR's hydration-safety design, but worth flagging: every authenticated home-page load pays the cost of computing/streaming content that's thrown away client-side. Since HomeVotingHero is cached ("use cache") the marginal per-request cost is likely low, but it's worth confirming the other marketing children (GamingHackathonBanner, HomeBenefits, HomeScroll) don't do uncached per-request work.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/page.tsx` around lines 34 - 49, The authenticated home path still renders
the full marketing tree inside HomeGate on the server before swapping to
HomeDashboard client-side, so review the marketing children for avoidable
per-request work. Check HomeVotingHero, GamingHackathonBanner, HomeBenefits, and
HomeScroll for any uncached data fetching or expensive server-side computation,
and move or cache that work if needed while preserving the current
hydration-safety behavior in HomeGate and app/page.tsx.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@app/page.tsx`:
- Around line 34-49: The authenticated home path still renders the full
marketing tree inside HomeGate on the server before swapping to HomeDashboard
client-side, so review the marketing children for avoidable per-request work.
Check HomeVotingHero, GamingHackathonBanner, HomeBenefits, and HomeScroll for
any uncached data fetching or expensive server-side computation, and move or
cache that work if needed while preserving the current hydration-safety behavior
in HomeGate and app/page.tsx.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2e83f1b6-e2fb-484d-af6e-5e6b4c3a03fe

📥 Commits

Reviewing files that changed from the base of the PR and between 5fb0e6e and bde9588.

📒 Files selected for processing (5)
  • app/dashboard/hackathones/MisHackatonesClient.tsx
  • app/page.tsx
  • components/home/HomeDashboard.tsx
  • components/home/HomeGate.tsx
  • lib/useUserHackathons.ts

@agustinkassis
agustinkassis merged commit 2e7213f into mainJul 6, 2026
3 checks passed
@agustinkassis
agustinkassis deleted the claude/festive-yonath-b4e523 branch July 6, 2026 04:33
Sign up for freeto 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

@agustinkassis