Skip to content

Conversation

@ComputelessComputer
Copy link
Collaborator

@ComputelessComputer ComputelessComputer commented Dec 1, 2025

feat(web): add OSS Friends page

Summary

Adds a new OSS Friends page at /oss-friends similar to OpenBB, OpenStatus, and Cap.so.

The page uses content-collections to manage OSS friends data, with each friend defined in a separate MDX file containing name, description, href, github URL, and optional og-image URL. The layout is a 3-column grid where each card displays the og-image at the top, followed by the project name, description, and GitHub link.

Current list includes 19 projects: Cal.com, Documenso, Dub, Eraser, Formbricks, Hanko, Inbox Zero, Infisical, Logto, n8n, Novu, OpenStatus, Papermark, Plausible, PostHog, Supabase, Trigger.dev, Twenty, and Unkey.

Updates since last revision

  • Expanded from 12 to 19 OSS friend projects
  • Added github field to schema (required) - each project now links to its GitHub repo
  • Fetched correct og-image URLs from each project's actual og:image meta tags
  • 17 projects have working og-images; 2 projects (Hanko, Unkey) use fallback icons as their og-image URLs were not accessible

Review & Testing Checklist for Human

  • Verify responsive layout on mobile - The grid is currently grid-cols-3 without responsive breakpoints. Check if this causes layout issues on smaller screens
  • Note: Search bar is decorative only - The search input has no filtering functionality implemented yet
  • Check that OG images load correctly on the preview - External URLs can change; verify images render on Netlify preview
  • Verify the list of OSS friends is accurate - You may want to curate this list differently
  • Verify fallback icons look acceptable - Hanko and Unkey show a generic OSS icon instead of an image

Recommended test plan: Visit the Netlify preview to verify the page renders correctly with images loading, or run pnpm -F web dev locally.

Notes

- Add new OSS Friends page at /oss-friends route
- Use content-collections for managing OSS friends data
- Implement 3xn grid layout with og-image/logo, title, and description
- Add 12 initial OSS friends: OpenStatus, Cal.com, Documenso, Formbricks, Infisical, Dub, Papermark, Trigger.dev, Unkey, Hanko, Inbox Zero, Eraser
- Include 'Want to be listed?' section with GitHub issue link

Co-Authored-By: john@hyprnote.com <john@hyprnote.com>
@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 1, 2025

Deploy Preview for hyprnote ready!

Name Link
🔨 Latest commit ea119d4
🔍 Latest deploy log https://app.netlify.com/projects/hyprnote/deploys/692d3e4e676349000883f6f7
😎 Deploy Preview https://deploy-preview-2037--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.

@netlify
Copy link

netlify bot commented Dec 1, 2025

Deploy Preview for hyprnote-storybook ready!

Name Link
🔨 Latest commit ea119d4
🔍 Latest deploy log https://app.netlify.com/projects/hyprnote-storybook/deploys/692d3e4e10607d00089e5e9b
😎 Deploy Preview https://deploy-preview-2037--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.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 1, 2025

📝 Walkthrough

Walkthrough

Adds a new public content collection ossFriends, 18 MDX entries under content/oss-friends, and a new route / _view/oss-friends that renders those entries with SEO metadata and an image-fallback grid.

Changes

Cohort / File(s) Summary
Content Collection Configuration
apps/web/content-collections.ts
Adds exported ossFriends collection (directory content/oss-friends, include *.mdx, exclude AGENTS.md), schema { name: string, description: string, href: string, image?: string, github: string }, and transform that sets slug from file path; includes ossFriends in exported collections.
OSS Friends Content (MDX files)
apps/web/content/oss-friends/*
apps/web/content/oss-friends/cal.mdx, documenso.mdx, dub.mdx, eraser.mdx, formbricks.mdx, hanko.mdx, inbox-zero.mdx, infisical.mdx, openstatus.mdx, papermark.mdx, trigger.mdx, unkey.mdx, logto.mdx, n8n.mdx, novu.mdx, plausible.mdx, posthog.mdx, supabase.mdx, twenty.mdx
Adds new MDX files containing YAML front matter entries (name, description, href, github, optional image) for OSS projects. No executable logic changes.
Route / Page
apps/web/src/routes/_view/oss-friends.tsx
New route exported as Route via createFileRoute("/_view/oss-friends"). Component renders HeroSection, FriendsSection (grid consuming allOssFriends with image fallback/icon), and JoinSection; includes head() SEO metadata.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20–30 minutes

  • Review ossFriends schema and slug transform for path/extension edge cases.
  • Verify the new route's head() metadata and accessibility semantics.
  • Spot-check MDX front-matter consistency and image URL correctness.

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 'feat(web): add OSS Friends page' directly and clearly describes the main change: adding a new OSS Friends page to the web application.
Description check ✅ Passed The description is well-detailed and directly related to the changeset, explaining the OSS Friends page implementation, content-collections integration, layout, project list, OG image updates, and testing guidance.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch devin/1764567730-oss-friends

📜 Recent 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 0a681a7 and ea119d4.

📒 Files selected for processing (10)
  • apps/web/content/oss-friends/documenso.mdx (1 hunks)
  • apps/web/content/oss-friends/dub.mdx (1 hunks)
  • apps/web/content/oss-friends/hanko.mdx (1 hunks)
  • apps/web/content/oss-friends/inbox-zero.mdx (1 hunks)
  • apps/web/content/oss-friends/logto.mdx (1 hunks)
  • apps/web/content/oss-friends/n8n.mdx (1 hunks)
  • apps/web/content/oss-friends/plausible.mdx (1 hunks)
  • apps/web/content/oss-friends/posthog.mdx (1 hunks)
  • apps/web/content/oss-friends/twenty.mdx (1 hunks)
  • apps/web/content/oss-friends/unkey.mdx (1 hunks)
✅ Files skipped from review due to trivial changes (3)
  • apps/web/content/oss-friends/dub.mdx
  • apps/web/content/oss-friends/documenso.mdx
  • apps/web/content/oss-friends/hanko.mdx
🚧 Files skipped from review as they are similar to previous changes (6)
  • apps/web/content/oss-friends/plausible.mdx
  • apps/web/content/oss-friends/n8n.mdx
  • apps/web/content/oss-friends/inbox-zero.mdx
  • apps/web/content/oss-friends/logto.mdx
  • apps/web/content/oss-friends/twenty.mdx
  • apps/web/content/oss-friends/posthog.mdx
⏰ 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). (6)
  • GitHub Check: Redirect rules - hyprnote
  • GitHub Check: Header rules - hyprnote
  • GitHub Check: ci
  • GitHub Check: Pages changed - hyprnote
  • GitHub Check: fmt
  • GitHub Check: Devin
🔇 Additional comments (1)
apps/web/content/oss-friends/unkey.mdx (1)

1-6: Frontmatter is correct per collection schema.

The ossFriends collection schema requires name, description, href, and github fields—all present in unkey.mdx. The optional image field is omitted, which is valid. There is no og-image field in the schema; the field defined is image.

Likely an incorrect or invalid review comment.


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: 0

🧹 Nitpick comments (5)
apps/web/content-collections.ts (1)

495-514: ossFriends collection wiring looks solid; consider URL validation

The new ossFriends collection (Line 495–Line 514) is consistent with the rest of the content model, and adding it to collections (Line 577–Line 591) cleanly exposes it to consumers like allOssFriends.

One improvement you might consider:

  • Enforce URL shape for href to catch typos early:
-    href: z.string(),
+    href: z.string().url(),

This keeps author mistakes in MDX front matter from surfacing as broken external links.

Also applies to: 577-591

apps/web/src/routes/_view/oss-friends.tsx (4)

9-39: Route and head metadata are coherent; watch for URL drift

The createFileRoute configuration and head metadata look good and should integrate fine with the rest of the app. One minor thing to keep in mind: og:url is hardcoded to https://hyprnote.com/oss-friends while the route path is "/_view/oss-friends". If there’s a canonical public path different from the internal route, this is fine; otherwise, consider centralizing or reusing a single source of truth for the canonical URL so it doesn’t drift over time.


41-75: Consider adding a <main> landmark for better accessibility

The page’s primary content is wrapped in generic <div> containers. For improved semantics and screen reader navigation, consider wrapping the main content (from HeroSection through JoinSection) in a <main> element instead of a plain <div>, or turning the inner container into <main>.


77-128: Friends grid implementation is clean; consider explicit ordering

The FriendsSection mapping over allOssFriends is straightforward and uses cn correctly with an array for class groups. The card structure, fallback icon when image is missing, and external link handling all look solid.

If you care about stable display order (e.g., alphabetically by name or by a future priority field), consider adding an explicit sort before the map so the layout doesn’t depend on collection emission order.


130-157: JoinSection CTA is clear; optional polish on issue template

The GitHub CTA link is straightforward and pre-fills title/body, which is nice. If you later add an issue template for OSS friends, you might want to update the URL to point at a dedicated template, but the current implementation is perfectly serviceable as-is.

📜 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 c9d74b1 and d453b38.

📒 Files selected for processing (14)
  • apps/web/content-collections.ts (2 hunks)
  • apps/web/content/oss-friends/cal.mdx (1 hunks)
  • apps/web/content/oss-friends/documenso.mdx (1 hunks)
  • apps/web/content/oss-friends/dub.mdx (1 hunks)
  • apps/web/content/oss-friends/eraser.mdx (1 hunks)
  • apps/web/content/oss-friends/formbricks.mdx (1 hunks)
  • apps/web/content/oss-friends/hanko.mdx (1 hunks)
  • apps/web/content/oss-friends/inbox-zero.mdx (1 hunks)
  • apps/web/content/oss-friends/infisical.mdx (1 hunks)
  • apps/web/content/oss-friends/openstatus.mdx (1 hunks)
  • apps/web/content/oss-friends/papermark.mdx (1 hunks)
  • apps/web/content/oss-friends/trigger.mdx (1 hunks)
  • apps/web/content/oss-friends/unkey.mdx (1 hunks)
  • apps/web/src/routes/_view/oss-friends.tsx (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{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/oss-friends.tsx
  • apps/web/content-collections.ts
**/*.ts

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.ts: Agent implementations should use TypeScript and follow the established architectural patterns defined in the agent framework
Agent communication should use defined message protocols and interfaces

Files:

  • apps/web/content-collections.ts
🧠 Learnings (1)
📚 Learning: 2025-11-30T05:42:31.014Z
Learnt from: CR
Repo: fastrepl/hyprnote PR: 0
File: apps/api/AGENTS.md:0-0
Timestamp: 2025-11-30T05:42:31.014Z
Learning: Use infisical export to manage environment variables for the API application, exporting secrets from the dev environment to a .env file at apps/api/.env with secret overriding disabled

Applied to files:

  • apps/web/content/oss-friends/infisical.mdx
🧬 Code graph analysis (1)
apps/web/src/routes/_view/oss-friends.tsx (2)
apps/web/src/components/slash-separator.tsx (1)
  • SlashSeparator (1-8)
packages/utils/src/cn.ts (1)
  • cn (20-22)
⏰ 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). (6)
  • GitHub Check: Redirect rules - hyprnote
  • GitHub Check: Header rules - hyprnote
  • GitHub Check: Pages changed - hyprnote
  • GitHub Check: Devin
  • GitHub Check: fmt
  • GitHub Check: ci
🔇 Additional comments (12)
apps/web/content/oss-friends/inbox-zero.mdx (1)

1-6: Content structure looks good.

apps/web/content/oss-friends/openstatus.mdx (1)

1-6: Content structure consistent with other entries.

apps/web/content/oss-friends/eraser.mdx (1)

1-6: Metadata complete and consistent.

apps/web/content/oss-friends/documenso.mdx (1)

1-6: Metadata complete and formatted correctly.

apps/web/content/oss-friends/hanko.mdx (1)

1-6: All fields present and properly formatted.

apps/web/content/oss-friends/infisical.mdx (1)

1-6: Metadata complete and properly structured.

apps/web/content/oss-friends/papermark.mdx (1)

1-6: Content properly formatted and complete.

apps/web/content/oss-friends/trigger.mdx (1)

1-6: Metadata complete and consistent.

apps/web/content/oss-friends/formbricks.mdx (1)

1-6: Formbricks front matter is consistent with the ossFriends schema

name, description, href, and image are all present and well-formed; this entry should work cleanly with the new collection and route.

apps/web/content/oss-friends/dub.mdx (1)

1-6: Dub entry front matter looks good

All required fields are present and align with the ossFriends schema; the OG image endpoint should render nicely in the card layout.

apps/web/content/oss-friends/cal.mdx (1)

1-6: Cal.com front matter is valid and on-brand

Metadata matches the expected schema and will plug into the grid without issues.

apps/web/content/oss-friends/unkey.mdx (1)

1-6: Unkey front matter aligns with the new collection contract

All fields required by the ossFriends schema are present and look accurate.

devin-ai-integration bot and others added 7 commits December 1, 2025 06:03
Co-Authored-By: john@hyprnote.com <john@hyprnote.com>
- Add new OSS Friends page at /oss-friends route
- Use content-collections for managing OSS friends data
- Implement 3xn grid layout with og-image/logo, title, and description
- Add 12 initial OSS friends: OpenStatus, Cal.com, Documenso, Formbricks, Infisical, Dub, Papermark, Trigger.dev, Unkey, Hanko, Inbox Zero, Eraser
- Include 'Want to be listed?' section with GitHub issue link

Co-Authored-By: john@hyprnote.com <john@hyprnote.com>
Co-Authored-By: john@hyprnote.com <john@hyprnote.com>
@ComputelessComputer ComputelessComputer force-pushed the devin/1764567730-oss-friends branch from 4d42797 to 0a681a7 Compare December 1, 2025 06:55
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 (2)
apps/web/content-collections.ts (1)

495-515: Consider adding MDX compilation for consistency and future-proofing.

The ossFriends collection doesn't compile MDX content, unlike all other collections in this file. While this may be intentional since the current MDX files only contain frontmatter, it creates an inconsistency and limits future extensibility.

If OSS friend entries ever need body content (e.g., detailed descriptions, feature lists, or usage notes), the content won't be processed without MDX compilation.

Apply this diff to add MDX compilation consistent with other collections:

-  transform: async (document) => {
+  transform: async (document, context) => {
+    const mdx = await compileMDX(context, document, {
+      remarkPlugins: [remarkGfm, mdxMermaid],
+      rehypePlugins: [
+        rehypeSlug,
+        [
+          rehypeAutolinkHeadings,
+          {
+            behavior: "wrap",
+            properties: {
+              className: ["anchor"],
+            },
+          },
+        ],
+      ],
+    });
+
     const slug = document._meta.path.replace(/\.mdx$/, "");

     return {
       ...document,
+      mdx,
       slug,
     };
   },
apps/web/content/oss-friends/eraser.mdx (1)

1-7: Ensure AVIF image format has appropriate fallback handling.

The image uses AVIF format, which has strong modern browser support (93%+ globally as of Dec 2025). However, the current implementation relies on @unpic/react's automatic format negotiation without explicit fallbacks. Consider implementing fallback sources (WebP, JPEG) via <Source> components within a <picture> element to ensure compatibility with older browsers or CDN limitations.

📜 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 4d42797 and 0a681a7.

⛔ Files ignored due to path filters (1)
  • apps/web/src/routeTree.gen.ts is excluded by !**/*.gen.ts
📒 Files selected for processing (21)
  • apps/web/content-collections.ts (2 hunks)
  • apps/web/content/oss-friends/cal.mdx (1 hunks)
  • apps/web/content/oss-friends/documenso.mdx (1 hunks)
  • apps/web/content/oss-friends/dub.mdx (1 hunks)
  • apps/web/content/oss-friends/eraser.mdx (1 hunks)
  • apps/web/content/oss-friends/formbricks.mdx (1 hunks)
  • apps/web/content/oss-friends/hanko.mdx (1 hunks)
  • apps/web/content/oss-friends/inbox-zero.mdx (1 hunks)
  • apps/web/content/oss-friends/infisical.mdx (1 hunks)
  • apps/web/content/oss-friends/logto.mdx (1 hunks)
  • apps/web/content/oss-friends/n8n.mdx (1 hunks)
  • apps/web/content/oss-friends/novu.mdx (1 hunks)
  • apps/web/content/oss-friends/openstatus.mdx (1 hunks)
  • apps/web/content/oss-friends/papermark.mdx (1 hunks)
  • apps/web/content/oss-friends/plausible.mdx (1 hunks)
  • apps/web/content/oss-friends/posthog.mdx (1 hunks)
  • apps/web/content/oss-friends/supabase.mdx (1 hunks)
  • apps/web/content/oss-friends/trigger.mdx (1 hunks)
  • apps/web/content/oss-friends/twenty.mdx (1 hunks)
  • apps/web/content/oss-friends/unkey.mdx (1 hunks)
  • apps/web/src/routes/_view/oss-friends.tsx (1 hunks)
✅ Files skipped from review due to trivial changes (7)
  • apps/web/content/oss-friends/posthog.mdx
  • apps/web/content/oss-friends/supabase.mdx
  • apps/web/content/oss-friends/logto.mdx
  • apps/web/content/oss-friends/plausible.mdx
  • apps/web/content/oss-friends/novu.mdx
  • apps/web/content/oss-friends/n8n.mdx
  • apps/web/content/oss-friends/unkey.mdx
🚧 Files skipped from review as they are similar to previous changes (9)
  • apps/web/src/routes/_view/oss-friends.tsx
  • apps/web/content/oss-friends/formbricks.mdx
  • apps/web/content/oss-friends/trigger.mdx
  • apps/web/content/oss-friends/dub.mdx
  • apps/web/content/oss-friends/inbox-zero.mdx
  • apps/web/content/oss-friends/infisical.mdx
  • apps/web/content/oss-friends/papermark.mdx
  • apps/web/content/oss-friends/cal.mdx
  • apps/web/content/oss-friends/documenso.mdx
🧰 Additional context used
📓 Path-based instructions (2)
**/*.ts

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.ts: Agent implementations should use TypeScript and follow the established architectural patterns defined in the agent framework
Agent communication should use defined message protocols and interfaces

Files:

  • apps/web/content-collections.ts
**/*.{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/content-collections.ts
⏰ 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). (8)
  • GitHub Check: Redirect rules - hyprnote-storybook
  • GitHub Check: Header rules - hyprnote-storybook
  • GitHub Check: Pages changed - hyprnote-storybook
  • GitHub Check: Redirect rules - hyprnote
  • GitHub Check: fmt
  • GitHub Check: ci
  • GitHub Check: Header rules - hyprnote
  • GitHub Check: Pages changed - hyprnote
🔇 Additional comments (3)
apps/web/content/oss-friends/twenty.mdx (1)

1-7: LGTM!

The frontmatter is schema-compliant with all required fields present. The metadata accurately represents the Twenty CRM project.

apps/web/content/oss-friends/openstatus.mdx (1)

1-7: LGTM!

The frontmatter is schema-compliant and correctly configured. Using a dynamic OG image endpoint is a good practice for ensuring fresh images.

apps/web/content-collections.ts (1)

591-591: LGTM!

The ossFriends collection is correctly registered in the collections array.

devin-ai-integration bot and others added 2 commits December 1, 2025 07:00
…to devin/1764567730-oss-friends

Co-Authored-By: john@hyprnote.com <john@hyprnote.com>
Co-Authored-By: john@hyprnote.com <john@hyprnote.com>
@ComputelessComputer ComputelessComputer merged commit c5a6eca into main Dec 1, 2025
13 of 14 checks passed
@ComputelessComputer ComputelessComputer deleted the devin/1764567730-oss-friends branch December 1, 2025 07:12
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.

2 participants