Skip to content

feat(web): redesign opensource page with 5 new sections#2143

Merged
ComputelessComputer merged 10 commits intomainfrom
devin/1764923809-opensource-redesign
Dec 6, 2025
Merged

feat(web): redesign opensource page with 5 new sections#2143
ComputelessComputer merged 10 commits intomainfrom
devin/1764923809-opensource-redesign

Conversation

@ComputelessComputer
Copy link
Collaborator

@ComputelessComputer ComputelessComputer commented Dec 5, 2025

Summary

Complete redesign of the /opensource page with a new 6-section structure:

  1. Hero Section - Original hero with stargazers grid animation (preserved per user request)
  2. Letter Section - A philosophical letter explaining why open source is necessary and inevitable in the age of AI
  3. Tech Stack Section - Displays the tech stack (Rust, Tauri, React, Whisper, llama.cpp, SQLite) with sponsorship info (GitHub Sponsors, Open Collective)
  4. Progress Section - GitHub stats (stars, forks, contributors, countries) with a milestone timeline
  5. Join Movement Section - 6 contribution options (star, contribute code, report issues, translate, share, join community)
  6. CTA Section - Simplified call-to-action with download button and GitHub link

Removed the previous WhyOpenSourceSection, TransparencySection, GitHubOpenSource component, and ContributeSection in favor of the new content-focused sections.

Updates since last revision

  • Restored the HeroSection with stargazers grid animation per user request
  • Re-added Stargazer type and useGitHubStargazers imports

Review & Testing Checklist for Human

  • Review letter content - The philosophical letter about open source in AI should align with company messaging and tone. This is new marketing copy that needs approval.

  • Verify milestone dates and stats are accurate - The timeline shows hardcoded dates (Jan 2024 first commit, Mar 2024 public beta, Jun 2024 1K stars, Sep 2024 v1.0, Dec 2024 5K stars, 2025 10K stars) and stats (50+ contributors, 30+ countries) that need verification

  • Verify sponsors list is accurate - Lists Tauri, llama.cpp, and whisper.cpp as sponsored projects

  • Verify all external links work - Several new links added:

    • https://github.com/sponsors/fastrepl
    • https://opencollective.com/hyprnote
    • https://discord.gg/Hyprnote (note: capitalization changed from previous hyprnote)
    • Tech stack URLs (rust-lang.org, tauri.app, react.dev, etc.)
  • Visual review on desktop and mobile - Test responsive layouts at various breakpoints. Visit /opensource locally or on deploy preview to verify styling and layout

Notes

  • The bg-linear-to-t class was changed to bg-gradient-to-t per coderabbit review, but bg-linear-to-b was kept as it's a custom utility used throughout the codebase
  • Removed unused imports: Link from tanstack router, GitHubOpenSource component
  • Local visual testing was blocked by missing RESTATE_INGRESS_URL environment variable (unrelated to this PR)

Link to Devin run: https://app.devin.ai/sessions/48c01c87f11748819e789fea4a4b9b55
Requested by: john@hyprnote.com (@ComputelessComputer)

@devin-ai-integration
Copy link
Contributor

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR that start with 'DevinAI' or '@devin'.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

@netlify
Copy link

netlify bot commented Dec 5, 2025

Deploy Preview for hyprnote-storybook ready!

Name Link
🔨 Latest commit 07ec2ef
🔍 Latest deploy log https://app.netlify.com/projects/hyprnote-storybook/deploys/6933e527894d070008bb4d78
😎 Deploy Preview https://deploy-preview-2143--hyprnote-storybook.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@netlify
Copy link

netlify bot commented Dec 5, 2025

Deploy Preview for hyprnote ready!

Name Link
🔨 Latest commit 07ec2ef
🔍 Latest deploy log https://app.netlify.com/projects/hyprnote/deploys/6933e5276be294000972c2ae
😎 Deploy Preview https://deploy-preview-2143--hyprnote.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 5, 2025

Warning

Rate limit exceeded

@ComputelessComputer has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 4 minutes and 8 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between a9e006b and 07ec2ef.

📒 Files selected for processing (1)
  • apps/web/src/routes/_view/opensource.tsx (6 hunks)
📝 Walkthrough

Walkthrough

Replaces several static Open Source page sections with data-driven, reusable components (LetterSection, TechStackSection, SponsorsSection, ProgressSection, JoinMovementSection); adds StatCard and ConfettiIcons, integrates GitHub metrics via useGitHubStats with last-seen fallbacks, and updates CTASection to accept a heroInputRef.

Changes

Cohort / File(s) Change Summary
Open Source view & UI components
apps/web/src/routes/_view/opensource.tsx
Rewrote the Open Source page: removed legacy sections (WhyOpenSourceSection, TransparencySection, ContributeSection) and introduced data-driven components and utilities—LetterSection, TechStackSection, SponsorsSection, ProgressSection, JoinMovementSection, StatCard, ConfettiIcons. Added tech/sponsor/milestone/contribution data structures, integrated useGitHubStats with GITHUB_LAST_SEEN_* fallbacks, updated Hero and Stargazer visuals, and changed CTA usage to accept heroInputRef.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

  • Pay attention to prop/TypeScript typings for new components (StatCard, ConfettiIcons, ProgressSection, CTASection).
  • Verify useGitHubStats usage and fallback constants (GITHUB_LAST_SEEN_STARS, GITHUB_LAST_SEEN_FORKS) and memoization/loading behavior.
  • Check rendering of data arrays (techStack, sponsors, milestones, contributions) for edge cases (missing imageUrl vs icon).
  • Inspect layout/styling changes in Hero/Stargazer for responsive and accessibility issues.

Possibly related PRs

Suggested reviewers

  • yujonglee

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: a complete redesign of the opensource page with new sections (LetterSection, TechStackSection, ProgressSection, JoinMovementSection, ConfettiIcons/StatCard components).
Description check ✅ Passed The description comprehensively outlines the 6-section structure, removed components, updates, and includes a detailed review checklist relevant to the redesign changes.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
apps/web/src/routes/_view/opensource.tsx (1)

370-377: Consider updating milestone dates or making them dynamic.

The milestones array contains hard-coded dates including "Dec 2024" for "5K Stars" and "2025" for "10K Stars". Since we're currently in December 2025, these dates may be outdated or already achieved. Consider either updating these to reflect current progress or implementing a dynamic milestone system that shows actual achievement dates.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 775c138 and 546dcf4.

📒 Files selected for processing (1)
  • apps/web/src/routes/_view/opensource.tsx (4 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx}: Avoid creating a bunch of types/interfaces if they are not shared. Especially for function props, just inline them instead.
Never do manual state management for form/mutation. Use useForm (from tanstack-form) and useQuery/useMutation (from tanstack-query) instead for 99% of cases. Avoid patterns like setError.
If there are many classNames with conditional logic, use cn (import from @hypr/utils). It is similar to clsx. Always pass an array and split by logical grouping.
Use motion/react instead of framer-motion.

Files:

  • apps/web/src/routes/_view/opensource.tsx
🧬 Code graph analysis (1)
apps/web/src/routes/_view/opensource.tsx (5)
apps/web/src/components/slash-separator.tsx (1)
  • SlashSeparator (1-8)
packages/utils/src/cn.ts (1)
  • cn (20-22)
apps/web/src/queries.ts (3)
  • useGitHubStats (9-21)
  • GITHUB_LAST_SEEN_STARS (37-37)
  • GITHUB_LAST_SEEN_FORKS (38-38)
apps/web/src/components/image.tsx (1)
  • Image (4-24)
apps/web/src/components/download-button.tsx (1)
  • DownloadButton (7-56)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: Redirect rules - hyprnote
  • GitHub Check: Header rules - hyprnote
  • GitHub Check: Pages changed - hyprnote
  • GitHub Check: Redirect rules - hyprnote-storybook
  • GitHub Check: Header rules - hyprnote-storybook
  • GitHub Check: Pages changed - hyprnote-storybook
  • GitHub Check: Devin
🔇 Additional comments (1)
apps/web/src/routes/_view/opensource.tsx (1)

607-611: Verify icon.png file exists in public directory.

The Image component references /icon.png which should be served from the public directory. If this file doesn't exist, the icon will fail to load.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/web/src/routes/_view/opensource.tsx (1)

160-165: Align gradient class names with Tailwind utilities mentioned in PR summary

You’re using bg-linear-to-t in the GitHub CTA button and the sponsor CTA:

"bg-linear-to-t from-neutral-800 to-neutral-700 text-white",
...
"bg-linear-to-t from-pink-100 to-white text-stone-700",

The PR notes say bg-linear-to-t was renamed to bg-gradient-to-t while bg-linear-to-b remains a custom utility. To avoid relying on a possibly removed alias, consider switching these to bg-gradient-to-t:

- "bg-linear-to-t from-neutral-800 to-neutral-700 text-white",
+ "bg-gradient-to-t from-neutral-800 to-neutral-700 text-white",
...
- "bg-linear-to-t from-pink-100 to-white text-stone-700",
+ "bg-gradient-to-t from-pink-100 to-white text-stone-700",

Also applies to: 595-599

🧹 Nitpick comments (2)
apps/web/src/routes/_view/opensource.tsx (2)

177-305: LetterSection copy and structure are coherent and accessible

The letter content reads clearly, flows well, and is semantically wrapped in an <article> within a <section>. The signatures and team images are correctly labeled and sized. If you intend the signature image to be purely decorative, you could set alt="" and aria-hidden on it, but that’s optional.


781-825: JoinMovementSection grid works; border logic can be simplified

The contribution options and their external links look good and cover a nice range of actions. The grid/border logic for the cards behaves correctly across breakpoints, but the hasBorderR && "lg:border-r" condition appears twice in the cn array, which is redundant and slightly obscures intent:

className={cn([
  "p-6 border-neutral-100 flex flex-col justify-between",
  hasBorderR && "lg:border-r",
  hasBorderB && "lg:border-b",
  index % 2 === 0 && "sm:border-r lg:border-r-0",
  index > 1 && "border-t sm:border-t-0 lg:border-t-0",
  hasBorderR && "lg:border-r", // duplicate
])}

You can safely drop one of the hasBorderR && "lg:border-r" entries to simplify the class list without changing behavior.

Also applies to: 826-887

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5476165 and 755304c.

📒 Files selected for processing (1)
  • apps/web/src/routes/_view/opensource.tsx (6 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx}: Avoid creating a bunch of types/interfaces if they are not shared. Especially for function props, just inline them instead.
Never do manual state management for form/mutation. Use useForm (from tanstack-form) and useQuery/useMutation (from tanstack-query) instead for 99% of cases. Avoid patterns like setError.
If there are many classNames with conditional logic, use cn (import from @hypr/utils). It is similar to clsx. Always pass an array and split by logical grouping.
Use motion/react instead of framer-motion.

Files:

  • apps/web/src/routes/_view/opensource.tsx
🧠 Learnings (2)
📚 Learning: 2025-11-24T16:32:19.706Z
Learnt from: CR
Repo: fastrepl/hyprnote PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T16:32:19.706Z
Learning: Applies to **/*.{ts,tsx} : Use `motion/react` instead of `framer-motion`.

Applied to files:

  • apps/web/src/routes/_view/opensource.tsx
📚 Learning: 2025-11-24T16:32:23.055Z
Learnt from: CR
Repo: fastrepl/hyprnote PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T16:32:23.055Z
Learning: Applies to **/*.{ts,tsx} : Never do manual state management for form/mutation. Use useForm (from tanstack-form) and useQuery/useMutation (from tanstack-query) instead for 99% of cases. Avoid patterns like setError.

Applied to files:

  • apps/web/src/routes/_view/opensource.tsx
🧬 Code graph analysis (1)
apps/web/src/routes/_view/opensource.tsx (3)
apps/web/src/routes/_view/index.tsx (1)
  • CTASection (2012-2105)
apps/web/src/components/image.tsx (1)
  • Image (4-24)
apps/web/src/queries.ts (2)
  • useGitHubStats (9-21)
  • GITHUB_LAST_SEEN_STARS (37-37)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
  • GitHub Check: Redirect rules - hyprnote
  • GitHub Check: Header rules - hyprnote
  • GitHub Check: Pages changed - hyprnote
  • GitHub Check: fmt
  • GitHub Check: ci
🔇 Additional comments (5)
apps/web/src/routes/_view/opensource.tsx (5)

2-4: CTASection heroInputRef wiring is safe but effectively unused on this page

heroInputRef is created and passed into CTASection, but unlike the index route there is no input bound to this ref in the /opensource tree, so the “waitlist” path in CTASection will only scroll to top and skip focusing/highlighting an input. This is functionally safe (guarded by if (heroInputRef.current)), but worth confirming this UX is intended for this page and not relying on the focus behavior here.

Also applies to: 57-82


90-99: Hero & stargazer grid logic looks solid

The stargazer grid correctly guards against empty data (stargazers.length > 0) before rendering StargazersGrid, so the modulo indexing over stargazers.length is safe from divide-by-zero and undefined access. Overall the hero layout and CTA buttons look consistent and well-structured.

Also applies to: 136-175


402-421: SponsorsSection layout and links look good; just verify external targets

The sponsors grid logic (borders per breakpoint, icon/image handling, and final “Sponsor on GitHub” CTA) is clean and consistent. The external URLs (tauri-apps, MrKai77, jamesgpearce, github.com/sponsors/fastrepl) all look plausible, but since they’re hard-coded, they should be manually clicked once in a browser before release to confirm there are no typos or redirects.

Also applies to: 519-609


611-665: ConfettiIcons + StatCard + ProgressSection implementation is correct; check hard-coded stats

  • useGitHubStats is now correctly used by extracting data and reading data?.stars / data?.forks, with numeric fallbacks to GITHUB_LAST_SEEN_* via toLocaleString(). This resolves the earlier destructuring bug.
  • Confetti icons only render on hover, so the Math.random() usage doesn’t affect SSR hydration (initial render has isHovered === false).
  • The 5-column stats layout and hover confetti trigger all look structurally sound.

Please double-check the static values before merging:

  • Contributors: "17"
  • Downloads: "40k+"
  • Discord Members: "1k+"

and update them if they’re out of date.

Also applies to: 667-711, 713-779


3-4: Good use of motion/react per project guidelines

Using AnimatePresence and motion from "motion/react" instead of framer-motion is exactly in line with the repo’s TSX guidelines and the retrieved learnings. The hover-triggered confetti animation is nicely scoped and doesn’t introduce extra state management.

Also applies to: 611-665

devin-ai-integration bot and others added 8 commits December 6, 2025 16:51
- Add letter section explaining why open source is necessary in AI age
- Add tech stack section with sponsorship info (GitHub Sponsors, Open Collective)
- Add progress section with GitHub stats and milestone timeline
- Add join movement section with contribution options
- Add CTA section following vs/$slug pattern

Sections are separated by SlashSeparator and use consistent styling
with stone color palette, serif fonts, and responsive grid layouts.

Co-Authored-By: john@hyprnote.com <john@hyprnote.com>
Co-Authored-By: john@hyprnote.com <john@hyprnote.com>
Add a faint grid background to the letter section to improve visual texture
and distinguish the letter from the page. The section was made relative and
given a dual linear-gradient background with a 40px grid size, and the
inner content was raised with a z-index so the grid sits behind the text.
Replace inline style background-image and backgroundSize with Tailwind-style utility classes on the section element. This simplifies the markup, reduces inline style usage, and consolidates positioning by moving the relative/z-index adjustments off the inner container. The change keeps the same visual grid background while making the component markup more consistent with project styling conventions.
Make the background grid lines lighter to reduce visual contrast and improve
subtlety of the pattern. Updated the linear-gradient color from #f5f5f5 to
#fafafa in the LetterSection to achieve a softer line appearance.
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/web/src/routes/_view/opensource.tsx (1)

140-171: Replace bg-linear-to-t with bg-gradient-to-t

The utility class bg-linear-to-t does not exist in Tailwind CSS v4. Use the standard Tailwind gradient utility instead:

- "bg-linear-to-t from-neutral-800 to-neutral-700 text-white",
+ "bg-gradient-to-t from-neutral-800 to-neutral-700 text-white",

This applies to all three instances in this file:

  • Line 162
  • Line 596
  • Line 877

Note: bg-linear-to-b used elsewhere in the file should also be replaced with bg-gradient-to-b.

♻️ Duplicate comments (1)
apps/web/src/routes/_view/opensource.tsx (1)

437-513: Fix missing key on fragment in TechStackSection map

techStack.map currently returns a fragment (<>...</>) without a key, while the key is applied only to the header <div>. React’s list diffing happens at the fragment level, so this will emit a warning and can make reconciliation brittle.

You can move the key onto a real fragment wrapper:

-import { useRef, useState } from "react";
+import { Fragment, useRef, useState } from "react";
...
-        <div className="grid grid-cols-6">
-          {techStack.map((section) => {
-            return (
-              <>
-                <div
-                  key={`header-${section.category}`}
+        <div className="grid grid-cols-6">
+          {techStack.map((section) => {
+            return (
+              <Fragment key={section.category}>
+                <div
                   className="col-span-6 p-6 border-t border-b border-neutral-100 bg-stone-50/50"
                 >
                   <h3 className="text-xl font-serif text-stone-600">
                     {section.category}
                   </h3>
                 </div>
                 {section.items.map((tech, techIndex) => {
                   ...
                 })}
-              </>
+              </Fragment>
             );
           })}
         </div>

This keeps the grid structure (header + items as siblings) while satisfying React’s key requirements.

🧹 Nitpick comments (2)
apps/web/src/routes/_view/opensource.tsx (2)

2-4: CTA wiring with heroInputRef is currently a no-op on this route

You create heroInputRef and pass it to CTASection, but there is no input in this route that attaches this ref, so CTASection’s “waitlist & focus the hero input” behavior can never fire here. Functionally it’s harmless, but it means this page can’t benefit from that UX.

Consider either:

  • Wiring heroInputRef to an input in this page’s hero if you intend to support the waitlist flow here, or
  • Making heroInputRef optional in CTASection and omitting it from this route if focusing isn’t needed.

Also applies to: 9-19, 58-79


787-830: JoinMovementSection grid is solid; consider minor border-class cleanup

The contributions data and CTAs cover the intended actions well, and the responsive grid works. There is a small duplication in border logic:

hasBorderR && "lg:border-r",
...
hasBorderR && "lg:border-r",

You can drop one of these without changing behavior:

-                  hasBorderR && "lg:border-r",
-                  index % 2 === 0 && "sm:border-r lg:border-r-0",
+                  hasBorderR && "lg:border-r",
+                  index % 2 === 0 && "sm:border-r lg:border-r-0",
-                  hasBorderR && "lg:border-r",

Not urgent, but it keeps the class list easier to reason about.

Also applies to: 832-888

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 755304c and f4da996.

📒 Files selected for processing (1)
  • apps/web/src/routes/_view/opensource.tsx (6 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx}: Avoid creating a bunch of types/interfaces if they are not shared. Especially for function props, just inline them instead.
Never do manual state management for form/mutation. Use useForm (from tanstack-form) and useQuery/useMutation (from tanstack-query) instead for 99% of cases. Avoid patterns like setError.
If there are many classNames with conditional logic, use cn (import from @hypr/utils). It is similar to clsx. Always pass an array and split by logical grouping.
Use motion/react instead of framer-motion.

Files:

  • apps/web/src/routes/_view/opensource.tsx
🧠 Learnings (2)
📚 Learning: 2025-11-24T16:32:23.055Z
Learnt from: CR
Repo: fastrepl/hyprnote PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T16:32:23.055Z
Learning: Applies to **/*.{ts,tsx} : Never do manual state management for form/mutation. Use useForm (from tanstack-form) and useQuery/useMutation (from tanstack-query) instead for 99% of cases. Avoid patterns like setError.

Applied to files:

  • apps/web/src/routes/_view/opensource.tsx
📚 Learning: 2025-11-24T16:32:19.706Z
Learnt from: CR
Repo: fastrepl/hyprnote PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T16:32:19.706Z
Learning: Applies to **/*.{ts,tsx} : Use `motion/react` instead of `framer-motion`.

Applied to files:

  • apps/web/src/routes/_view/opensource.tsx
🧬 Code graph analysis (1)
apps/web/src/routes/_view/opensource.tsx (4)
apps/web/src/routes/_view/index.tsx (1)
  • CTASection (2012-2105)
apps/web/src/components/image.tsx (1)
  • Image (4-24)
owhisper/owhisper-client/src/adapter/parsing.rs (1)
  • value (4-4)
apps/web/src/queries.ts (3)
  • useGitHubStats (9-21)
  • GITHUB_LAST_SEEN_STARS (37-37)
  • GITHUB_LAST_SEEN_FORKS (38-38)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
  • GitHub Check: Redirect rules - hyprnote
  • GitHub Check: Header rules - hyprnote
  • GitHub Check: Pages changed - hyprnote
  • GitHub Check: fmt
  • GitHub Check: ci
🔇 Additional comments (9)
apps/web/src/routes/_view/opensource.tsx (9)

84-100: Stargazer avatar tweaks look good

Avatar styling (border, hover scale, opacity, and lazy-loaded <img>) is appropriate for the grid animation, with correct rel="noopener noreferrer" for external links.


136-175: Hero section structure and Stargazers integration are solid

HeroSection cleanly integrates useGitHubStargazers with a guarded grid render (stargazers.length > 0), uses a radial overlay for readability, and exposes clear primary CTAs. No logical issues found.


177-305: LetterSection content and semantics look good

The letter uses an <article> wrapper, appropriate heading levels, list markup, and the shared Image component for team avatars/signature. Copy is clear and layout classes are consistent; nothing blocking here.


307-400: Tech stack data is well-structured

The techStack data covers the major technologies with accurate names/links and a consistent shape (icon vs imageUrl). This should feed the grid cleanly and is easy to extend later.


402-421: Sponsors data list is straightforward

The sponsors array is minimal and coherent (single union of icon-based vs image-based entries), and works well with the conditional rendering in SponsorsSection.


519-609: SponsorsSection grid and CTA behavior look correct

The sponsors grid applies borders responsively based on index, renders either icon or avatar image, and ends with a clear sponsorship CTA linking to GitHub Sponsors. Structure and logic are sound.


611-665: ConfettiIcons hover animation is constrained and safe

ConfettiIcons generates a small in-memory list of items, renders only on hover, and is wrapped in AnimatePresence with pointer-events-none, so it shouldn’t impact layout or interactivity. No issues seen.


667-717: StatCard hover behavior and layout look good

StatCard’s local hover state drives ConfettiIcons only while hovered, and the layout (icon + value + label) is vertically balanced. Border logic via hasBorder keeps styling control at the caller, which is clean.


719-785: GitHub stats wiring now correctly uses useGitHubStats data with fallbacks

ProgressSection destructures data from useGitHubStats() and derives stars/forks from it, then falls back to GITHUB_LAST_SEEN_* when data is absent. toLocaleString() keeps display formatting consistent, and the stats array cleanly feeds StatCard.

Fix React key warnings by moving the key from an inner header div to the mapped fragment. The techStack.map() returned a shorthand fragment without a key while the key was placed on a nested div, which can still trigger React list-key issues. Replace the shorthand fragment with a keyed Fragment (imported from React) and remove the key from the inner div so each mapped section has a unique key at the fragment level.
@ComputelessComputer ComputelessComputer force-pushed the devin/1764923809-opensource-redesign branch from f4da996 to a9e006b Compare December 6, 2025 08:05
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f4da996 and a9e006b.

📒 Files selected for processing (1)
  • apps/web/src/routes/_view/opensource.tsx (6 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx}: Avoid creating a bunch of types/interfaces if they are not shared. Especially for function props, just inline them instead.
Never do manual state management for form/mutation. Use useForm (from tanstack-form) and useQuery/useMutation (from tanstack-query) instead for 99% of cases. Avoid patterns like setError.
If there are many classNames with conditional logic, use cn (import from @hypr/utils). It is similar to clsx. Always pass an array and split by logical grouping.
Use motion/react instead of framer-motion.

Files:

  • apps/web/src/routes/_view/opensource.tsx
🧠 Learnings (2)
📚 Learning: 2025-11-24T16:32:23.055Z
Learnt from: CR
Repo: fastrepl/hyprnote PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T16:32:23.055Z
Learning: Applies to **/*.{ts,tsx} : Never do manual state management for form/mutation. Use useForm (from tanstack-form) and useQuery/useMutation (from tanstack-query) instead for 99% of cases. Avoid patterns like setError.

Applied to files:

  • apps/web/src/routes/_view/opensource.tsx
📚 Learning: 2025-11-24T16:32:19.706Z
Learnt from: CR
Repo: fastrepl/hyprnote PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T16:32:19.706Z
Learning: Applies to **/*.{ts,tsx} : Use `motion/react` instead of `framer-motion`.

Applied to files:

  • apps/web/src/routes/_view/opensource.tsx
🧬 Code graph analysis (1)
apps/web/src/routes/_view/opensource.tsx (3)
apps/web/src/routes/_view/index.tsx (1)
  • CTASection (2012-2105)
apps/web/src/components/image.tsx (1)
  • Image (4-24)
apps/web/src/queries.ts (3)
  • useGitHubStats (9-21)
  • GITHUB_LAST_SEEN_STARS (37-37)
  • GITHUB_LAST_SEEN_FORKS (38-38)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
  • GitHub Check: Redirect rules - hyprnote
  • GitHub Check: Header rules - hyprnote
  • GitHub Check: Pages changed - hyprnote
  • GitHub Check: fmt
  • GitHub Check: ci
🔇 Additional comments (7)
apps/web/src/routes/_view/opensource.tsx (7)

1-175: LGTM! Imports and hero section follow guidelines.

The imports correctly use motion/react as specified in the coding guidelines, and the hero section properly integrates the stargazers grid animation with the restored hero content.


177-305: LGTM! Letter section content and structure are well-executed.

The philosophical letter effectively communicates the open source mission, and the styling with team photos and signature adds a personal touch.


307-421: LGTM! Data structures are well-organized and consistent.

The techStack, sponsors, and contributions data structures follow a consistent pattern and support flexible rendering with both icon and image URL options.


423-514: LGTM! Tech stack section handles complex responsive grid correctly.

The responsive border logic is complex but functional, and the conditional rendering for icon vs imageUrl is handled properly. The cn() usage follows the coding guidelines with arrays split by logical grouping.


516-606: LGTM! Sponsors section with integrated CTA.

The section follows the same pattern as TechStackSection and includes a well-designed call-to-action for GitHub sponsorship.


608-714: LGTM! Helper components follow coding guidelines.

Both ConfettiIcons and StatCard properly inline their props as per guidelines, and ConfettiIcons correctly uses motion/react for animations. The hover state management in StatCard is appropriate for UI interactions.


716-782: Verify missing milestone timeline mentioned in PR objectives.

The PR objectives describe the Progress Section as including "GitHub stats (stars, forks, contributors, countries) and milestone timeline with hardcoded dates." However, the current implementation only renders the stats grid without a milestone timeline component. Please confirm whether the timeline is intentionally deferred or should be added.

@ComputelessComputer ComputelessComputer merged commit c9cffaa into main Dec 6, 2025
13 checks passed
@ComputelessComputer ComputelessComputer deleted the devin/1764923809-opensource-redesign branch December 6, 2025 12:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant