-
Notifications
You must be signed in to change notification settings - Fork 431
Centralize MDX Component Mappings and Simplify MDX Rendering #2065
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Introduce a shared MDX components module and helpers so all MDXContent renderers use a common default component map. This centralizes Image, MDXLink, Mermaid, Tweet, Callout, and other mappings in apps/web/src/components/mdx/mdx-components.tsx and exposes createMDXComponents and defaultMDXComponents from the mdx index. Update blog, changelog, and legal routes to use the shared defaults (or merge with route-specific components) to remove duplicated component objects and simplify maintenance.
Clean up redundant comments in mdx-components.tsx to make the code clearer and reduce noise. The removed comments only described obvious things (type alias, default components, and merge function), so deleting them improves readability without changing behavior.
✅ Deploy Preview for hyprnote-storybook ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
✅ Deploy Preview for hyprnote ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
📝 WalkthroughWalkthroughThis PR converts external absolute URLs to relative internal paths across 30+ article files, and establishes a new MDXLink component infrastructure for intelligent link rendering in MDX content. The changes include creating an MDXLink component, centralizing MDX component configuration through factory functions, and updating 15+ route files to use the new link component. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes
Areas requiring attention:
Possibly related PRs
Suggested reviewers
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 8
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
apps/web/content/articles/granola-ai-alternatives.mdx (1)
280-280: Fix incomplete link placeholder.Line 280 contains
[Download Hyprnote](link)which is a placeholder that was not resolved. This will render as a broken link in the MDX output.Apply this diff to complete the link:
-**Ready to take control of your meeting data?** [Download Hyprnote](link) and experience truly private AI-powered note-taking. +**Ready to take control of your meeting data?** [Download Hyprnote](/download) and experience truly private AI-powered note-taking.Replace
/downloadwith the correct internal path to your Hyprnote download page.
🧹 Nitpick comments (12)
apps/web/content/articles/chatgpt-for-meeting-notes.mdx (1)
169-171: Tighten informal language and verify grammar.Line 169 uses "pretty much," which is informal. Consider replacing it with more formal phrasing for consistency with the article's professional tone. Additionally, static analysis flagged a potential grammar/spelling issue on line 170.
Consider revising lines 169–171 as follows:
- Hyprnote, like ChatGPT, also listens to system audio and runs on Mac, but that is pretty much where the similarities end. + Hyprnote, like ChatGPT, also listens to system audio and runs on Mac, but the similarities largely end there.Please also review line 170 for any spelling or grammar corrections.
apps/web/content/articles/fathom-ai-alternatives.mdx (1)
41-41: Minor: Consider varying the word choice to avoid repetition.Per static analysis, the word "exactly" appears twice in close proximity around line 41. Consider using an alternative phrasing for stylistic variety.
Applied diff is optional—only if you wish to address the style suggestion:
- Full disclosure - I'm the co-founder of [Hyprnote](/). But that's exactly why I built it. After seeing how every other tool handles your data, I knew there had to be a better way. + Full disclosure - I'm the co-founder of [Hyprnote](/). That's precisely why I built it. After seeing how every other tool handles your data, I knew there had to be a better way.apps/web/src/components/deeplinks-list.tsx (1)
4-4: MDXLink integration looks correct; consider centralizing MDX componentsUsing
a: MDXLinkhere will correctly route MDX anchors through the shared link behavior, and keepingmermaid,Mermaid, andTweetin the map preserves existing rendering.If you’re standardizing on a central MDX components map (e.g., via
defaultMDXComponents/createMDXComponentsin@/components/mdx), consider delegating to that here to avoid repeating the components object across multiple call sites.Also applies to: 65-65
apps/web/src/routes/_view/company-handbook/-components.tsx (1)
18-18: Handbook MDX now uses MDXLink for anchors – good alignmentWiring
a: MDXLinkinto theMDXContentcomponents map ensures handbook links go through the shared MDX link behavior while preserving all existing custom components (Accordion, Card, Columns, Image, etc.). This is consistent with the MDX refactor.If you end up maintaining multiple similar MDXContent call sites, you might later pull this components object from a shared helper (e.g., a
createMDXComponentsvariant that includesa: MDXLink) to keep things DRY, but it’s not required for correctness here.Also applies to: 105-120
apps/web/src/routes/_view/templates/index.tsx (1)
566-566: Consider usingdefaultMDXComponentsfor consistency.While
{ a: MDXLink }works for basic links, the legal route usesdefaultMDXComponentswhich includes Image, Mermaid, Tweet, and Callout components. If template MDX content might include these components in the future, usingdefaultMDXComponentswould be more consistent and future-proof.Apply this diff if you want consistency with the legal route:
- <MDXContent code={template.mdx} components={{ a: MDXLink }} /> + <MDXContent code={template.mdx} components={defaultMDXComponents} />And update the import:
-import { MDXLink } from "@/components/mdx"; +import { defaultMDXComponents } from "@/components/mdx";apps/web/src/routes/_view/roadmap/index.tsx (1)
335-335: Optional: ConsiderdefaultMDXComponentsfor future flexibility.Similar to templates/index.tsx, this uses inline
{ a: MDXLink }. If roadmap MDX content might include other components (images, callouts, etc.), consider usingdefaultMDXComponentsfor consistency with the legal route pattern.apps/web/src/routes/_view/gallery/$type.$slug.tsx (1)
273-273: Optional: ConsiderdefaultMDXComponentsfor consistency.Like other routes, this uses inline
{ a: MDXLink }. If gallery MDX content might include images, code blocks, or other rich components,defaultMDXComponentswould provide better consistency and future flexibility.apps/web/src/routes/_view/shortcuts/index.tsx (1)
523-523: Optional: ConsiderdefaultMDXComponentsfor future flexibility.This follows the same inline
{ a: MDXLink }pattern. If shortcut MDX content might include other components (code blocks, callouts, images), usingdefaultMDXComponentswould provide better consistency with the centralized approach seen in the legal route.apps/web/src/routes/_view/templates/$slug.tsx (1)
9-9: Consider usingdefaultMDXComponentsfor consistency and completeness.The current approach only maps anchor tags to
MDXLink, but template MDX content may use other components likeImage,Mermaid,Tweet, orCallout. ThedefaultMDXComponentsexport (introduced in this PR and used inchangelog/$slug.tsx) provides a centralized, complete mapping.Apply this diff:
-import { MDXLink } from "@/components/mdx"; +import { defaultMDXComponents } from "@/components/mdx";- <MDXContent code={template.mdx} components={{ a: MDXLink }} /> + <MDXContent code={template.mdx} components={defaultMDXComponents} />Also applies to: 174-174
apps/web/src/routes/_view/roadmap/$slug.tsx (1)
9-9: Refactor to usedefaultMDXComponentsfor consistency.The current approach manually maintains a component mapping that duplicates the centralized
defaultMDXComponentsdefinition. This creates maintenance overhead and inconsistency with other routes likechangelog/$slug.tsx, which uses the centralized mapping.Apply this diff:
-import { MDXLink, Mermaid, Tweet } from "@/components/mdx"; +import { defaultMDXComponents } from "@/components/mdx";<MDXContent code={item.mdx} - components={{ - a: MDXLink, - Image, - img: Image, - mermaid: Mermaid, - Mermaid, - Tweet, - }} + components={defaultMDXComponents} />Note: Since
defaultMDXComponentsalready includesImage, you can remove theImageimport from line 8 as well.Also applies to: 154-162
apps/web/src/components/mdx/link.tsx (1)
12-12: Consider stricter URL validation for hyprnote.com.The current check
href.startsWith("https://hyprnote.com")could potentially match malicious URLs likehttps://hyprnote.com.evil.com. While unlikely in MDX content, consider using a more precise check.Apply this diff for stricter validation:
- const isHyprnoteUrl = href.startsWith("https://hyprnote.com"); + const isHyprnoteUrl = href.startsWith("https://hyprnote.com/") || href === "https://hyprnote.com";apps/web/src/components/mdx/mdx-components.tsx (1)
29-29: Optional refinement: simplify null check.The
|| {}fallback is unnecessary since spreadingundefinedis already safe in JavaScript/TypeScript. The optional parameter?already handles the undefined case.Apply this diff to simplify:
return { ...defaultMDXComponents, - ...(customComponents || {}), + ...customComponents, } as MDXComponents;
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (51)
apps/web/content/articles/ai-meeting-summary-tools.mdx(1 hunks)apps/web/content/articles/best-ai-meeting-assistant-for-taking-notes.mdx(11 hunks)apps/web/content/articles/best-ai-notetaker-for-in-person-meetings.mdx(3 hunks)apps/web/content/articles/best-ai-notetaker-for-microsoft-teams.mdx(8 hunks)apps/web/content/articles/best-ai-notetaker-for-zoom.mdx(9 hunks)apps/web/content/articles/best-ai-notetakers-google-meet.mdx(6 hunks)apps/web/content/articles/bot-free-ai-meeting-assistants.mdx(3 hunks)apps/web/content/articles/can-you-transcribe-meetings-without-sending-data-to-cloud.mdx(2 hunks)apps/web/content/articles/chatgpt-for-meeting-notes.mdx(2 hunks)apps/web/content/articles/enterprise-ai-notetaking-tools.mdx(3 hunks)apps/web/content/articles/fathom-ai-alternatives.mdx(3 hunks)apps/web/content/articles/fireflies-ai-alternatives.mdx(1 hunks)apps/web/content/articles/free-ai-notetakers.mdx(6 hunks)apps/web/content/articles/free-transcription-software.mdx(4 hunks)apps/web/content/articles/google-gemini-meeting-notes.mdx(4 hunks)apps/web/content/articles/granola-ai-alternatives.mdx(4 hunks)apps/web/content/articles/how-to-have-productive-one-on-one-meetings.mdx(1 hunks)apps/web/content/articles/how-to-participate-in-meetings-effectively.mdx(3 hunks)apps/web/content/articles/how-to-reduce-meeting-fatigue.mdx(2 hunks)apps/web/content/articles/how-to-transcribe-zoom-calls.mdx(5 hunks)apps/web/content/articles/is-ai-notetaking-legal.mdx(4 hunks)apps/web/content/articles/is-fireflies-ai-safe.mdx(2 hunks)apps/web/content/articles/is-otter-ai-safe.mdx(3 hunks)apps/web/content/articles/local-ai-privacy-tools.mdx(1 hunks)apps/web/content/articles/meeting-minutes-software.mdx(4 hunks)apps/web/content/articles/meeting-preparation-checklist.mdx(2 hunks)apps/web/content/articles/open-source-meeting-transcription-software.mdx(2 hunks)apps/web/content/articles/otter-ai-alternatives.mdx(5 hunks)apps/web/content/articles/plaud-ai-alternatives.mdx(3 hunks)apps/web/content/articles/sales-ai-note-takers.mdx(4 hunks)apps/web/content/articles/see-zoom-meeting-history.mdx(2 hunks)apps/web/content/articles/what-makes-reliable-ai-note-taker.mdx(3 hunks)apps/web/content/articles/zoom-ai-companion-review.mdx(2 hunks)apps/web/content/legal/dpa.mdx(1 hunks)apps/web/src/components/deeplinks-list.tsx(2 hunks)apps/web/src/components/hooks-list.tsx(2 hunks)apps/web/src/components/mdx/index.ts(1 hunks)apps/web/src/components/mdx/link.tsx(1 hunks)apps/web/src/components/mdx/mdx-components.tsx(1 hunks)apps/web/src/routes/_view/blog/$slug.tsx(2 hunks)apps/web/src/routes/_view/changelog/$slug.tsx(2 hunks)apps/web/src/routes/_view/company-handbook/-components.tsx(2 hunks)apps/web/src/routes/_view/docs/-components.tsx(2 hunks)apps/web/src/routes/_view/gallery/$type.$slug.tsx(2 hunks)apps/web/src/routes/_view/legal/$slug.tsx(2 hunks)apps/web/src/routes/_view/roadmap/$slug.tsx(2 hunks)apps/web/src/routes/_view/roadmap/index.tsx(2 hunks)apps/web/src/routes/_view/shortcuts/$slug.tsx(2 hunks)apps/web/src/routes/_view/shortcuts/index.tsx(2 hunks)apps/web/src/routes/_view/templates/$slug.tsx(2 hunks)apps/web/src/routes/_view/templates/index.tsx(2 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, usecn(import from@hypr/utils). It is similar toclsx. Always pass an array and split by logical grouping.
Usemotion/reactinstead offramer-motion.
Files:
apps/web/src/components/mdx/mdx-components.tsxapps/web/src/components/mdx/index.tsapps/web/src/components/mdx/link.tsxapps/web/src/routes/_view/company-handbook/-components.tsxapps/web/src/routes/_view/gallery/$type.$slug.tsxapps/web/src/routes/_view/shortcuts/$slug.tsxapps/web/src/routes/_view/roadmap/$slug.tsxapps/web/src/components/deeplinks-list.tsxapps/web/src/routes/_view/blog/$slug.tsxapps/web/src/routes/_view/shortcuts/index.tsxapps/web/src/routes/_view/changelog/$slug.tsxapps/web/src/routes/_view/docs/-components.tsxapps/web/src/routes/_view/legal/$slug.tsxapps/web/src/routes/_view/templates/$slug.tsxapps/web/src/routes/_view/roadmap/index.tsxapps/web/src/routes/_view/templates/index.tsxapps/web/src/components/hooks-list.tsx
**/*.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/src/components/mdx/index.ts
🧠 Learnings (4)
📚 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} : 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.
Applied to files:
apps/web/src/routes/_view/company-handbook/-components.tsxapps/web/src/routes/_view/gallery/$type.$slug.tsxapps/web/src/routes/_view/roadmap/$slug.tsxapps/web/src/routes/_view/shortcuts/index.tsxapps/web/src/routes/_view/roadmap/index.tsxapps/web/src/routes/_view/templates/index.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} : If there are many classNames with conditional logic, use `cn` (import from `hypr/utils`), similar to `clsx`. Always pass an array and split by logical grouping.
Applied to files:
apps/web/src/routes/_view/company-handbook/-components.tsxapps/web/src/routes/_view/gallery/$type.$slug.tsxapps/web/src/routes/_view/roadmap/$slug.tsxapps/web/src/routes/_view/shortcuts/index.tsxapps/web/src/routes/_view/roadmap/index.tsxapps/web/src/routes/_view/templates/index.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/roadmap/$slug.tsxapps/web/src/routes/_view/shortcuts/index.tsxapps/web/src/routes/_view/changelog/$slug.tsxapps/web/src/routes/_view/legal/$slug.tsxapps/web/src/routes/_view/templates/index.tsx
📚 Learning: 2025-11-24T16:32:29.314Z
Learnt from: CR
Repo: fastrepl/hyprnote PR: 0
File: apps/web/content/changelog/AGENTS.md:0-0
Timestamp: 2025-11-24T16:32:29.314Z
Learning: Applies to apps/web/content/changelog/** : Only keep desktop-related changes when maintaining changelog entries from commits and diffs
Applied to files:
apps/web/src/routes/_view/changelog/$slug.tsx
🧬 Code graph analysis (5)
apps/web/src/components/mdx/link.tsx (3)
apps/web/src/components/mdx/index.ts (1)
MDXLink(2-2)apps/web/scripts/gen-agents.js (1)
relativePath(30-30)apps/storybook/stories/Button.stories.tsx (1)
Link(51-56)
apps/web/src/routes/_view/blog/$slug.tsx (2)
apps/web/src/components/mdx/mdx-components.tsx (1)
createMDXComponents(24-31)apps/web/src/components/mdx/index.ts (1)
createMDXComponents(3-3)
apps/web/src/routes/_view/changelog/$slug.tsx (2)
apps/web/src/components/mdx/mdx-components.tsx (1)
defaultMDXComponents(14-22)apps/web/src/components/mdx/index.ts (1)
defaultMDXComponents(3-3)
apps/web/src/routes/_view/docs/-components.tsx (1)
apps/web/src/components/mdx/index.ts (1)
MDXLink(2-2)
apps/web/src/routes/_view/legal/$slug.tsx (2)
apps/web/src/components/mdx/mdx-components.tsx (1)
defaultMDXComponents(14-22)apps/web/src/components/mdx/index.ts (1)
defaultMDXComponents(3-3)
🪛 LanguageTool
apps/web/content/articles/is-otter-ai-safe.mdx
[grammar] ~20-~20: Ensure spelling is correct
Context: ... check out:** - List of Best Otter AI Alterntives in 2025 -...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
[uncategorized] ~173-~173: The operating system from Apple is written “macOS”.
Context: ...eting privacy?** Download Hyprnote for MacOS today and experience truly ...
(MAC_OS)
[style] ~173-~173: ‘in control of’ might be wordy. Consider a shorter alternative.
Context: ...rst AI transcription that puts you back in control of your conversations.
(EN_WORDINESS_PREMIUM_IN_CONTROL_OF)
apps/web/content/articles/chatgpt-for-meeting-notes.mdx
[style] ~169-~169: The phrase ‘pretty much’ can be informal. To strengthen your writing, consider removing it or replacing it with an adverb.
Context: ...stem audio and runs on Mac, but that is pretty much where the similarities end. Hyprnote, ...
(PRETTY_MUCH)
[grammar] ~170-~170: Ensure spelling is correct
Context: ...retty much where the similarities end. Hyprnote, being a [local-first AI notetaker](/pr...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
apps/web/content/articles/free-ai-notetakers.mdx
[grammar] ~26-~26: Ensure spelling is correct
Context: ...Free AI Notetakers for Meetings ### 1. Hyprnote: Best for Local Processing and Data Cont...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
apps/web/content/articles/fathom-ai-alternatives.mdx
[style] ~41-~41: Consider an alternative for the overused word “exactly”.
Context: ...co-founder of Hyprnote. But that's exactly why I built it. After seeing how every ...
(EXACTLY_PRECISELY)
apps/web/content/articles/is-ai-notetaking-legal.mdx
[uncategorized] ~181-~181: The operating system from Apple is written “macOS”.
Context: ...d customization Download Hyprnote for MacOS to experience truly secure ...
(MAC_OS)
apps/web/content/legal/dpa.mdx
[style] ~34-~34: ‘prior to’ might be wordy. Consider a shorter alternative.
Context: ... a clear and conspicuous privacy notice prior to enabling cloud-based features, specifyi...
(EN_WORDINESS_PREMIUM_PRIOR_TO)
apps/web/content/articles/sales-ai-note-takers.mdx
[grammar] ~278-~278: Ensure spelling is correct
Context: ... today and go from there. Wish to give Hyprnote a test run? [Download it for free](...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
apps/web/content/articles/best-ai-meeting-assistant-for-taking-notes.mdx
[uncategorized] ~377-~377: The operating system from Apple is written “macOS”.
Context: ...ting started. Download Hyprnote for MacOS now and discover meeting ...
(MAC_OS)
apps/web/content/articles/bot-free-ai-meeting-assistants.mdx
[uncategorized] ~50-~50: The operating system from Apple is written “macOS”.
Context: ...ses deployment. Download Hyprnote for MacOS. <Image src="/api/images/b...
(MAC_OS)
apps/web/content/articles/how-to-transcribe-zoom-calls.mdx
[grammar] ~55-~55: Ensure spelling is correct
Context: ...te AI notetaking solution. ### What is Hyprnote? Hyprnote is a privacy-first [local AI no...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
⏰ 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 (54)
apps/web/content/articles/chatgpt-for-meeting-notes.mdx (1)
167-167: Verify that these internal links align with the new MDXLink component infrastructure.The PR objectives emphasize introducing a centralized MDXLink component for flexible link handling, but these changes use plain markdown link syntax (
[text](path)). If the new MDXLink component is intended to manage internal routing logic, consider whether these links should use that component instead.Can you clarify:
- Are plain markdown links intentional for content files, or should they use the MDXLink component?
- Do the referenced internal paths (
/blog/bot-free-ai-meeting-assistants,/product/local-ai,/download) exist as valid routes?Also applies to: 171-171, 193-193
apps/web/content/articles/plaud-ai-alternatives.mdx (4)
49-49: Verify that the root path/is semantically correct for Hyprnote.The link was changed from an external URL to the root path
/. Ensure this destination aligns with the context—readers should land on the Hyprnote product page or homepage, not a different section. If the previous external URL pointed to a specific landing page, consider whether/or a more specific route (e.g.,/productor/hyprnote) would be more appropriate.
96-96: Confirm/foundersroute exists and is the correct sales contact page.The "Contact sales" link now targets
/founders. Verify this route exists and that it's the intended contact page for enterprise pricing inquiries. If this was previously a dedicated "contact sales" or "pricing" page, ensure the content and flow are preserved.
385-385: Verify/downloadroute serves macOS download content.The download link now targets
/download. Ensure this route provides macOS downloads directly and doesn't require additional navigation or platform selection steps. Consider whether this should link to a dedicated macOS download page (e.g.,/download/macos) to avoid user confusion if multiple platforms are supported.
49-49: Consider aligning markdown links with new MDXLink component infrastructure.Per the PR objectives, an MDXLink component was introduced to centralize link handling in MDX content. However, these links remain in standard markdown format
[text](url). If MDXLink is intended to replace direct markdown links for centralized control and intelligent routing, consider whether these should be converted to use the new component. This would ensure consistency across the codebase and enable future link behavior customization from a single location.To verify if this is necessary, check:
- How other article files in this PR use links (markdown vs. MDXLink)
- Whether the MDXLink component is meant to wrap all user-facing links
- If there's a documented pattern for when to use markdown links vs. MDXLink
Also applies to: 96-96, 385-385
apps/web/content/articles/how-to-transcribe-zoom-calls.mdx (4)
26-26: All URL conversions to relative paths are correct and consistent with PR objectives.The changes successfully convert absolute external URLs to root-relative internal paths across all link targets. This aligns well with the centralized MDX component mappings infrastructure.
Also applies to: 53-53, 57-57, 74-74, 133-133, 177-177
62-62: New feature bullet is well-integrated.The addition of "Universal compatibility: Works with all meeting platforms without requiring bots" fits naturally within the feature list and reinforces the product differentiation without disrupting the content flow.
55-57: Verify link text appropriateness.Line 57 changes the link target to
/product/local-aiwith text "local AI notepad for meetings". Ensure this product path exists and the link text accurately describes the target page. If this is a new product route, confirm the navigation structure supports it.
74-74: Consider link text clarity for root path.Line 74 changes "hyprnote.com" — using just "/" as the target. While correct as a root-relative path, confirm that the link text "hyprnote.com" properly signals to users that it navigates to the homepage. If the intent is to keep the domain-like appearance for branding, this is fine, but if users expect it to link to hyprnote.com externally, this may cause confusion.
apps/web/content/articles/open-source-meeting-transcription-software.mdx (2)
34-34: Verify internal route/exists and works with new MDXLink component.The external URL has been converted to a relative root path. Ensure the home route is accessible and the new MDXLink component infrastructure correctly renders this link.
165-165: Verify internal route/downloadexists and works with new MDXLink component.The external URL has been converted to a relative path. Confirm the download route exists and is properly handled by the new MDXLink component.
apps/web/content/articles/granola-ai-alternatives.mdx (2)
65-65: Clarify mixed link pattern intentionality.Line 65 uses two different link formats:
[Hyprnote](/)(root-relative) and[local AI meeting assistant](/product/local-ai)(path-relative). Confirm this inconsistency is intentional—typically internal links should follow a consistent pattern (all root-relative or all scoped).If unintentional, align both to the same pattern:
-[Hyprnote](/) is the only open-source, truly [local AI meeting assistant](/product/local-ai) +[Hyprnote](/home) is the only open-source, truly [local AI meeting assistant](/product/local-ai)Or:
-[Hyprnote](/) is the only open-source, truly [local AI meeting assistant](/product/local-ai) +[Hyprnote](/?) is the only open-source, truly [local AI meeting assistant](/product/local-ai)
14-14: All referenced internal blog routes exist and are valid.The three internal links reference existing blog pages:
/blog/bot-free-ai-meeting-assistants→apps/web/content/articles/bot-free-ai-meeting-assistants.mdx/blog/free-ai-notetakers→apps/web/content/articles/free-ai-notetakers.mdx/blog/best-ai-meeting-assistant-for-taking-notes→apps/web/content/articles/best-ai-meeting-assistant-for-taking-notes.mdxNo action needed.
apps/web/content/articles/what-makes-reliable-ai-note-taker.mdx (1)
37-37: All internal links are correctly configured.The three links have been verified against the repository structure:
/blog/best-ai-notetaker-for-in-person-meetings→apps/web/content/articles/best-ai-notetaker-for-in-person-meetings.mdx✓/blog/bot-free-ai-meeting-assistants→apps/web/content/articles/bot-free-ai-meeting-assistants.mdx✓/download→ component exists and is properly configured ✓The differences between anchor text and URL slugs (singular vs plural, "notetakers" vs "meeting-assistants") are not errors—they follow standard URL naming conventions. The articles exist and the links map correctly to their targets.
Likely an incorrect or invalid review comment.
apps/web/content/articles/free-transcription-software.mdx (2)
43-43: No issues with retained external links.External links to third-party services (Rev, Sonix, Trint, Happy Scribe, Notta, MacWhisper, Riverside) remain as absolute URLs—this is correct and intentional, as these reference external tools rather than internal site content.
Also applies to: 49-49, 55-55, 61-61, 67-67, 145-145, 211-211, 246-246
71-71: All link conversions are correct and will resolve properly.The target routes exist and are correctly configured:
/blog/*articles resolve dynamically via the$slug.tsxroute using content-collections/founders,/download, and/are defined routes- MDXLink component correctly passes relative paths to React Router's Link component for client-side resolution
No path resolution issues identified.
apps/web/content/articles/how-to-participate-in-meetings-effectively.mdx (1)
57-57: No changes needed—URL conversions are correct and properly integrated with MDXLink.All four absolute URLs have been correctly converted to root-relative paths (
/,/blog/meeting-preparation-checklist,/blog/how-to-reduce-meeting-fatigue,/download). The plain markdown link syntax automatically integrates with the new MDXLink component infrastructure because theaelement is explicitly mapped toMDXLinkin the default MDX components configuration. Internal paths starting with/are routed through theLinkcomponent for client-side navigation. No absolute URLs were missed in the file.apps/web/content/articles/fathom-ai-alternatives.mdx (1)
41-41: All internal link paths are valid and correctly configured.Verification confirms that all four link conversions to root-relative paths are properly configured:
- Line 41:
[Hyprnote](/)→ Root route exists- Line 81:
[contact sales for a quote](/founders)→/foundersroute exists- Line 210:
[Privacy concerns](/blog/is-fireflies-ai-safe)→ Article file exists- Line 216:
[Top Fireflies AI Alternatives](/blog/fireflies-ai-alternatives)→ Article file existsThe TanStack Router setup automatically generates
/blog/$slugroutes from MDX filenames inapps/web/content/articles/, and all referenced articles are present.apps/web/content/articles/best-ai-notetakers-google-meet.mdx (1)
16-16: All internal routes and blog post targets verified as existing and published. The links are correctly formatted and semantically appropriate.Routes verified:
/blog/best-ai-meeting-assistant-for-taking-notes✓/blog/fireflies-ai-alternatives✓/blog/free-ai-notetakers✓/blog/is-otter-ai-safe✓/product/local-ai✓/download✓/founders✓/✓All referenced blog post MDX files exist in
apps/web/content/articles/withpublished: trueflag. The dynamic blog route handler (apps/web/src/routes/_view/blog/$slug.tsx) properly resolves article slugs via the content-collections system. No issues with internal links.apps/web/content/articles/otter-ai-alternatives.mdx (1)
37-37: Verify URL conversions are complete and target routes exist.The five Markdown link conversions from absolute to relative paths appear structurally sound. Confirm these critical items before merging:
- No remaining absolute URLs: Scan the file for any unconverted
https://hyprnote.com/URLs.- Target routes are defined: Verify these routes exist in your app:
/blog/best-ai-meeting-assistant-for-taking-notes/blog/is-otter-ai-safe/blog/bot-free-ai-meeting-assistants/product/local-ai/download- MDX component integration: Confirm
mdx-components.tsxregisters a customacomponent (such as the newMDXLink). Markdown links in MDX automatically map to<a>elements—without a custom mapping, internal links won't have Next.js link behavior (preloading, client-side navigation).apps/web/content/articles/local-ai-privacy-tools.mdx (1)
64-64: Link update to internal root path looks good.The Hyprnote homepage link has been correctly updated to the root path, maintaining consistency with the internal routing pattern across the PR.
apps/web/content/articles/fireflies-ai-alternatives.mdx (1)
449-449: Download link properly updated to internal route.The macOS download link correctly uses the
/downloadpath, consistent with the internal routing pattern throughout the PR.apps/web/content/articles/can-you-transcribe-meetings-without-sending-data-to-cloud.mdx (1)
40-40: Internal route links correctly implemented.Both the product-specific route (
/product/local-ai) and contact route (/founders) follow the established internal routing patterns across the PR.Also applies to: 111-111
apps/web/content/articles/see-zoom-meeting-history.mdx (1)
71-71: Blog and utility links follow established routing patterns.The blog reference (
/blog/best-ai-notetaker-for-zoom), homepage link (/), and download route (/download) are all consistent with the internal navigation structure defined throughout the PR.Also applies to: 79-79, 166-166
apps/web/content/articles/zoom-ai-companion-review.mdx (1)
100-100: Blog article links consistently updated.Both blog references use the
/blog/[article-slug]pattern with descriptive URLs, maintaining internal routing consistency.Also applies to: 133-133
apps/web/content/articles/best-ai-notetaker-for-zoom.mdx (1)
23-23: Comprehensive internal link routing implemented correctly.This file contains extensive link rewrites across all internal route patterns (blog articles, product pages, contact, download), all properly formatted and consistent with the PR routing strategy.
Also applies to: 48-48, 69-69, 84-84, 126-126, 283-283, 432-432, 193-193
apps/web/content/articles/meeting-preparation-checklist.mdx (1)
13-13: Meeting prep article links properly updated.Both the blog reference (
/blog/how-to-reduce-meeting-fatigue) and homepage download link (/) follow the established routing patterns.Also applies to: 173-173
apps/web/content/articles/is-otter-ai-safe.mdx (1)
20-20: Internal routing links follow established patterns.The URL rewrites in this file (blog article links, product link, and download link) all properly use the internal routing scheme established throughout the PR.
Also applies to: 21-21, 157-157, 159-159, 173-173
apps/web/content/articles/sales-ai-note-takers.mdx (1)
76-76: Internal link normalization looks goodAll updated links now use root-relative paths (
/,/blog/...,/download) and align with the MDX/MDXLink routing approach. I don’t see any navigation or content issues here.Also applies to: 166-166, 213-213, 278-278
apps/web/content/articles/enterprise-ai-notetaking-tools.mdx (1)
44-44: Hyprnote and Contact links updated consistentlyThe Hyprnote and “Contact sales” links now point to internal routes (
/,/founders) and are consistent with other CTAs across the site. No further changes needed.Also applies to: 60-60, 252-252
apps/web/src/routes/_view/shortcuts/$slug.tsx (1)
9-9: Using MDXLink for shortcut anchors is consistent with the new MDX setupImporting
MDXLinkand passingcomponents={{ a: MDXLink }}toMDXContentcorrectly ensures shortcut MDX links go through the centralized link component, matching the new MDXLink infrastructure.If any shortcut MDX documents later introduce custom components (e.g., Mermaid, Tweet, etc.), you’ll want to extend this
componentsmap accordingly so they render as intended.Also applies to: 159-160
apps/web/src/routes/_view/templates/index.tsx (1)
10-10: LGTM: Clean import addition.The MDXLink import follows the established pattern across the codebase.
apps/web/src/routes/_view/roadmap/index.tsx (1)
9-10: LGTM: Import follows established pattern.The MDXLink import and formatting are consistent with the broader PR changes.
apps/web/src/routes/_view/legal/$slug.tsx (1)
5-5: LGTM: Excellent use of centralized MDX components.This refactor demonstrates the PR's goal perfectly—replacing custom inline component mappings with the centralized
defaultMDXComponents. Clean and maintainable.Also applies to: 58-58
apps/web/src/routes/_view/docs/-components.tsx (1)
21-21: LGTM: Clean integration with existing comprehensive components.Adding
MDXLinkto the docs' already-comprehensive component mapping is the right approach. The docs require rich component support beyond whatdefaultMDXComponentsprovides.Also applies to: 112-112
apps/web/src/routes/_view/gallery/$type.$slug.tsx (1)
9-9: LGTM: Import consistent with PR pattern.The MDXLink import follows the established pattern across all updated routes.
apps/web/src/routes/_view/shortcuts/index.tsx (1)
10-10: LGTM: Import follows established pattern.The MDXLink import is consistent with the broader PR changes.
apps/web/content/articles/ai-meeting-summary-tools.mdx (1)
448-448: Verify the download link target path.The link text says "Download Hyprnote for macOS" but the href is "/", which points to the homepage. Confirm whether this should link to a dedicated download page (e.g., "/download") or whether the homepage is the intended destination.
apps/web/content/articles/is-fireflies-ai-safe.mdx (1)
146-148: Verify internal route paths exist.The external URLs have been converted to internal paths. Ensure these routes are properly configured in the routing structure:
/product/local-ai/blog/fireflies-ai-alternatives/privacy-policyRun verification to confirm these routes are defined in your TanStack Router configuration and that corresponding MDX files or page components exist for each path.
apps/web/content/articles/meeting-minutes-software.mdx (1)
14-14: LGTM! Internal link routing is correct.The conversion of external URLs to root-relative internal paths aligns with the PR's objective to centralize MDX link handling and simplify routing.
Also applies to: 54-54, 330-330, 350-350
apps/web/content/articles/how-to-reduce-meeting-fatigue.mdx (1)
56-56: LGTM! Internal routing updates are consistent.Also applies to: 148-148
apps/web/content/articles/best-ai-notetaker-for-in-person-meetings.mdx (1)
47-47: LGTM! Internal link updates are consistent.Also applies to: 61-61, 76-76
apps/web/src/components/mdx/index.ts (1)
2-3: LGTM! Exports are clean and support centralization.apps/web/content/articles/best-ai-notetaker-for-microsoft-teams.mdx (1)
12-12: LGTM! Internal link routing is consistent across the article.Also applies to: 124-124, 168-168, 172-172, 188-188, 206-206, 257-257, 308-308, 362-362
apps/web/src/routes/_view/changelog/$slug.tsx (1)
29-29: LGTM! This demonstrates the correct centralized approach.This file properly uses
defaultMDXComponentsfor a consistent, maintainable MDX component mapping. This pattern should be applied to other routes (liketemplates/$slug.tsxandroadmap/$slug.tsx) for consistency.Also applies to: 578-578
apps/web/content/articles/free-ai-notetakers.mdx (1)
22-22: LGTM! Link updates align with MDX centralization.The conversion from absolute URLs to relative internal paths is consistent and correct. These paths will be properly handled by the new MDXLink component.
Also applies to: 28-28, 46-46, 154-154, 193-193, 227-227, 332-332
apps/web/src/components/hooks-list.tsx (1)
4-4: LGTM! MDXLink integration is correct.The component properly imports and wires MDXLink to handle anchor tags in MDX content.
Also applies to: 73-73
apps/web/content/articles/best-ai-meeting-assistant-for-taking-notes.mdx (1)
7-7: LGTM! Link updates are consistent and correct.All conversions from absolute to relative paths align with the MDX centralization goal.
Also applies to: 58-58, 62-62, 107-107, 129-129, 142-142, 164-164, 191-191, 239-239, 377-377
apps/web/src/components/mdx/mdx-components.tsx (2)
10-12: Type definition is appropriate for shared MDX configuration.The MDXComponents type using
ComponentType<any>is acceptable here since MDX components have varying prop signatures. As per coding guidelines, creating this type is appropriate since it's shared across multiple files.
24-31: Factory pattern is clean and extensible.The createMDXComponents function properly merges custom components with defaults. The implementation is correct.
apps/web/content/articles/bot-free-ai-meeting-assistants.mdx (2)
7-7: Good catch! Fixed duplicate path segments.These changes correct actual bugs where
/api/images/was duplicated in the paths.Also applies to: 52-52
33-33: Link updates are correct.All conversions to internal paths align with the MDX centralization objective.
Also applies to: 42-42, 50-50
apps/web/src/routes/_view/blog/$slug.tsx (1)
12-12: LGTM! Factory-based approach improves maintainability.The migration to
createMDXComponentscentralizes the MDX component configuration while allowing custom components like CtaCard. This approach automatically includes MDXLink for anchor handling and aligns with the PR's centralization objective.Also applies to: 157-157
apps/web/src/components/mdx/link.tsx (1)
33-39: Verify router Link behavior with dot-relative paths.The component treats paths starting with
.as internal and passes them to the router Link. However, Tanstack Router's Link component typically expects absolute paths (starting with/).Verify that relative paths like
./siblingor../parentwork correctly with the router, or consider normalizing these paths before passing to Link.
| The best part? Our platform is completely free with unlimited AI summaries, fully open source for complete transparency, and our team is just getting started. | ||
|
|
||
| [**Download Hyprnote for MacOS**](https://hyprnote.com/download) now and discover meeting intelligence that doesn't make you choose between performance and privacy. | ||
| [**Download Hyprnote for MacOS**](/download) now and discover meeting intelligence that doesn't make you choose between performance and privacy. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix macOS spelling.
The operating system from Apple is officially spelled "macOS", not "MacOS".
Apply this diff:
-[**Download Hyprnote for MacOS**](/download) now and discover meeting intelligence that doesn't make you choose between performance and privacy.
+[**Download Hyprnote for macOS**](/download) now and discover meeting intelligence that doesn't make you choose between performance and privacy.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| [**Download Hyprnote for MacOS**](/download) now and discover meeting intelligence that doesn't make you choose between performance and privacy. | |
| [**Download Hyprnote for macOS**](/download) now and discover meeting intelligence that doesn't make you choose between performance and privacy. |
🧰 Tools
🪛 LanguageTool
[uncategorized] ~377-~377: The operating system from Apple is written “macOS”.
Context: ...ting started. Download Hyprnote for MacOS now and discover meeting ...
(MAC_OS)
🤖 Prompt for AI Agents
In apps/web/content/articles/best-ai-meeting-assistant-for-taking-notes.mdx
around line 377, the text uses the incorrect capitalization "MacOS"; update the
string to the correct Apple branding "macOS" (e.g., change "[**Download Hyprnote
for MacOS**](/download)" to "[**Download Hyprnote for macOS**](/download)") and
verify there are no other occurrences of "MacOS" in the file to correct.
| **Pricing:** Free plan with unlimited AI summaries. Pro at $8/month. Enterprise with custom pricing for consent management and on-premises deployment. | ||
|
|
||
| [Download Hyprnote for MacOS](https://hyprnote.com/download). | ||
| [Download Hyprnote for MacOS](/download). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix macOS spelling.
The operating system from Apple is officially spelled "macOS", not "MacOS".
Apply this diff:
-[Download Hyprnote for MacOS](/download).
+[Download Hyprnote for macOS](/download).📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| [Download Hyprnote for MacOS](/download). | |
| [Download Hyprnote for macOS](/download). |
🧰 Tools
🪛 LanguageTool
[uncategorized] ~50-~50: The operating system from Apple is written “macOS”.
Context: ...ses deployment. Download Hyprnote for MacOS. <Image src="/api/images/b...
(MAC_OS)
🤖 Prompt for AI Agents
In apps/web/content/articles/bot-free-ai-meeting-assistants.mdx around line 50,
the text uses the incorrect capitalization "MacOS"; change it to the official
Apple spelling "macOS" so the link reads "[Download Hyprnote for
macOS](/download)." and update any other occurrences in the same file to match.
| ## Can Google Gemini Take Meeting Notes? | ||
|
|
||
| Gemini itself, the AI assistant you're familiar with, doesn't join your meetings like other [AI notetakers](https://hyprnote.com/blog/best-ai-meeting-assistant-for-taking-notes). There's no "Gemini bot" that automatically hops into your Zoom calls or Teams meetings. | ||
| Gemini itself, the AI assistant you're familiar with, doesn't join your meetings like other [AI notetakers](/blog/best-ai-meeting-assistant-for-taking-notes). There's no "Gemini bot" that automatically hops into your Zoom calls or Teams meetings. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Links look good; fix minor “ot” typo
The new root-relative links for AI notetaker articles, Local AI, download CTA, and the free-AI-note-taker article all look correct and consistent.
There’s a small typo in this section:
- “keeps your data where ot belongs (with you!)” → should be “where it belongs”.
- But, if I have to single out one platform that works well universally, is free, and keeps your data where ot belongs (with you!), then Hyprnote would be my recommendation.
+ But, if I have to single out one platform that works well universally, is free, and keeps your data where it belongs (with you!), then Hyprnote would be my recommendation.Also applies to: 100-103, 108-114, 128-128, 156-157
🤖 Prompt for AI Agents
In apps/web/content/articles/google-gemini-meeting-notes.mdx around lines 14
(also apply same fix to lines 100-103, 108-114, 128, and 156-157), fix the typo
"ot" to "it" in the phrase "keeps your data where ot belongs (with you!)" so it
reads "keeps your data where it belongs (with you!)"; update each occurrence
exactly and run a quick spellcheck to ensure no other instances remain.
| Your brain should be doing what it does best: connecting with people, identifying what they need, helping them grow. Not trying to be a human database of scattered conversations. | ||
|
|
||
| [Download Hyprnote free](https://hyprnote.com) and run one-on-ones that actually develop your team without burning you out. | ||
| [Download Hyprnote free](/) and run one-on-ones that actually develop your team without burning you out. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider pointing the download CTA directly to /download
The CTA text is “Download Hyprnote free”, but the link now points to the site root (/). For consistency with other articles and a more direct UX, it may be clearer to send users straight to the download page:
-[Download Hyprnote free](/) and run one-on-ones that actually develop your team without burning you out.
+[Download Hyprnote free](/download) and run one-on-ones that actually develop your team without burning you out.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| [Download Hyprnote free](/) and run one-on-ones that actually develop your team without burning you out. | |
| [Download Hyprnote free](/download) and run one-on-ones that actually develop your team without burning you out. |
🤖 Prompt for AI Agents
In apps/web/content/articles/how-to-have-productive-one-on-one-meetings.mdx
around line 209, the CTA link text "Download Hyprnote free" currently points to
the site root (/) instead of the download page; update the href to point to
/download so the CTA sends users directly to the download page to match other
articles and improve UX.
| - **Safer choice:** Cloud-based tools demand heavy due diligence, while local-first solutions (like Hyprnote) minimize compliance risks since no data leaves your device. | ||
|
|
||
| 👉 **Bottom line:** Get consent, vet your vendor, protect confidentiality, and if compliance is key, use a [local-first AI notetaker](https://hyprnote.com/product/local-ai). | ||
| 👉 **Bottom line:** Get consent, vet your vendor, protect confidentiality, and if compliance is key, use a [local-first AI notetaker](/product/local-ai). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Internal links OK; align OS name with “macOS” styling
The new root-relative links (/product/local-ai, /blog/is-otter-ai-safe, /download) look correct and match the rest of the site.
Minor copy nit on the OS name in the CTA:
-[Download Hyprnote for MacOS](/download) to experience truly secure AI note-taking.
+[Download Hyprnote for macOS](/download) to experience truly secure AI note-taking.Also applies to: 40-40, 155-155, 181-181
🤖 Prompt for AI Agents
In apps/web/content/articles/is-ai-notetaking-legal.mdx at lines 22, 40, 155,
and 181, update any occurrences of the OS name to use the site's macOS styling
(i.e., "macOS") for consistency; locate the CTA and any mentions of the OS and
replace variants like "MacOS", "Mac OS", or "mac os" with the correct "macOS",
verify capitalization and punctuation match site conventions, and run a quick
search in this file to ensure no other variants remain.
|
|
||
| - [List of Best Otter AI Alterntives in 2025](https://hyprnote.com/blog/otter-ai-alternatives) | ||
| - [List of Bot-free AI meeting Assistants](https://hyprnote.com/blog/bot-free-ai-meeting-assistants) | ||
| - [List of Best Otter AI Alterntives in 2025](/blog/otter-ai-alternatives) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix spelling error in link text.
Line 20 contains a typo: "Alterntives" should be "Alternatives".
- - [List of Best Otter AI Alterntives in 2025](/blog/otter-ai-alternatives)
+ - [List of Best Otter AI Alternatives in 2025](/blog/otter-ai-alternatives)📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - [List of Best Otter AI Alterntives in 2025](/blog/otter-ai-alternatives) | |
| - [List of Best Otter AI Alternatives in 2025](/blog/otter-ai-alternatives) |
🧰 Tools
🪛 LanguageTool
[grammar] ~20-~20: Ensure spelling is correct
Context: ... check out:** - List of Best Otter AI Alterntives in 2025 -...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
🤖 Prompt for AI Agents
In apps/web/content/articles/is-otter-ai-safe.mdx around line 20, the link text
contains a typo "Alterntives"; update the anchor text to "Alternatives" so it
reads "[List of Best Otter AI Alternatives in
2025](/blog/otter-ai-alternatives)". Ensure only the visible text is corrected
and the URL remains unchanged.
| This approach makes it easier to fulfill data subject rights, maintain audit trails, and enforce access controls without relying on external processors. | ||
|
|
||
| **Ready to take control of your meeting privacy?** [Download Hyprnote for MacOS](https://hyprnote.com/download) today and experience truly private, local-first AI transcription that puts you back in control of your conversations. | ||
| **Ready to take control of your meeting privacy?** [Download Hyprnote for MacOS](/download) today and experience truly private, local-first AI transcription that puts you back in control of your conversations. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Correct capitalization of macOS and optionally refine wording.
Line 173 has two minor style issues:
- "MacOS" should be capitalized as "macOS" per Apple's official style guide
- The phrase "in control of your conversations" is slightly wordy (optional improvement)
- [Download Hyprnote for MacOS](/download) today and experience truly private, local-first AI transcription that puts you back in control of your conversations.
+ [Download Hyprnote for macOS](/download) today and experience truly private, local-first AI transcription that gives you complete control of your conversations.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| **Ready to take control of your meeting privacy?** [Download Hyprnote for MacOS](/download) today and experience truly private, local-first AI transcription that puts you back in control of your conversations. | |
| **Ready to take control of your meeting privacy?** [Download Hyprnote for macOS](/download) today and experience truly private, local-first AI transcription that gives you complete control of your conversations. |
🧰 Tools
🪛 LanguageTool
[uncategorized] ~173-~173: The operating system from Apple is written “macOS”.
Context: ...eting privacy?** Download Hyprnote for MacOS today and experience truly ...
(MAC_OS)
[style] ~173-~173: ‘in control of’ might be wordy. Consider a shorter alternative.
Context: ...rst AI transcription that puts you back in control of your conversations.
(EN_WORDINESS_PREMIUM_IN_CONTROL_OF)
🤖 Prompt for AI Agents
In apps/web/content/articles/is-otter-ai-safe.mdx around line 173, change the
product platform capitalization from "MacOS" to "macOS" and optionally tighten
the wording by replacing "in control of your conversations" with a more concise
phrase like "in control of your meetings" or "in control of your meeting audio";
update the sentence so it reads e.g. "**Ready to take control of your meeting
privacy?** [Download Hyprnote for macOS](/download) today and experience truly
private, local-first AI transcription that puts you back in control of your
meetings."
| - **Customer Obligations**: You warrant that: | ||
| - You have obtained explicit, informed consent from data subjects for recording and cloud processing, as required by law (e.g., GDPR Art. 6, one-party/all-party consent laws). | ||
| - You must provide data subjects with a clear and conspicuous privacy notice prior to enabling cloud-based features, specifying the types of personal data processed, the purpose (e.g., AI transcription), and the involvement of sub-processors, as outlined in our Privacy Policy at https://hyprnote.com/privacy-policy. | ||
| - You must provide data subjects with a clear and conspicuous privacy notice prior to enabling cloud-based features, specifying the types of personal data processed, the purpose (e.g., AI transcription), and the involvement of sub-processors, as outlined in our Privacy Policy at /privacy-policy. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
# Search for privacy-policy route/page definition
fd -type f -e "tsx" -e "ts" -e "jsx" -e "js" -e "mdx" "privacy-policy" apps/webRepository: fastrepl/hyprnote
Length of output: 231
🏁 Script executed:
# Check for page/route structure in apps/web
fd -type f \( -name "*.tsx" -o -name "*.ts" -o -name "*.mdx" \) apps/web | grep -i "privacy\|route" | head -20Repository: fastrepl/hyprnote
Length of output: 231
🏁 Script executed:
# Look for route configuration or pages directory
fd -type d -name "pages" apps/web
fd -type d -name "app" apps/webRepository: fastrepl/hyprnote
Length of output: 402
🏁 Script executed:
# Search for privacy-policy mentions in the codebase to understand URL patterns
rg "privacy-policy" apps/web --type mdx --type ts --type tsx -lRepository: fastrepl/hyprnote
Length of output: 88
🏁 Script executed:
# Search for privacy-policy in apps/web directory
find apps/web -type f -name "*privacy*"Repository: fastrepl/hyprnote
Length of output: 188
🏁 Script executed:
# Search for privacy-policy references in source files
rg "privacy-policy" apps/web --glob "*.ts" --glob "*.tsx" --glob "*.js" --glob "*.jsx" --glob "*.mdx" -lRepository: fastrepl/hyprnote
Length of output: 241
🏁 Script executed:
# Check directory structure of apps/web
ls -la apps/web/ | head -20Repository: fastrepl/hyprnote
Length of output: 1116
🏁 Script executed:
# Look for app or pages directories
find apps/web -type d \( -name "pages" -o -name "app" -o -name "routes" \) -o -name "*privacy*"Repository: fastrepl/hyprnote
Length of output: 238
🏁 Script executed:
# Check content-collections.ts for how content is routed
cat apps/web/content-collections.tsRepository: fastrepl/hyprnote
Length of output: 13477
🏁 Script executed:
# Search for privacy-policy route or how legal content is accessed
rg "privacy-policy\|privacy" apps/web/src/routes -A 2 -B 2Repository: fastrepl/hyprnote
Length of output: 43
🏁 Script executed:
# Check what URL patterns are used for legal content
rg "legal\|dpa\|privacy" apps/web/src -lRepository: fastrepl/hyprnote
Length of output: 43
🏁 Script executed:
# Search for how legal content routes are accessed
rg "legal" apps/web/src/routes -A 3 -B 3Repository: fastrepl/hyprnote
Length of output: 10213
🏁 Script executed:
# Look for route files that might handle privacy or legal content
find apps/web/src/routes -type f -name "*.ts" -o -name "*.tsx"Repository: fastrepl/hyprnote
Length of output: 3688
🏁 Script executed:
# Search for privacy-policy specifically in routes
rg "/privacy-policy\|privacy-policy" apps/web/srcRepository: fastrepl/hyprnote
Length of output: 43
🏁 Script executed:
# Double-check the actual privacy.mdx file exists and verify its slug
cat apps/web/content/legal/privacy.mdx | head -10Repository: fastrepl/hyprnote
Length of output: 397
🏁 Script executed:
# Check if there's any redirect or alias for /privacy-policy
rg "privacy-policy|/privacy" apps/web/src/routes -lRepository: fastrepl/hyprnote
Length of output: 89
Fix the incorrect relative path and simplify wording on line 34.
The relative path /privacy-policy does not exist. Based on the application routing, the correct path is /legal/privacy. Additionally, simplify "prior to enabling" to "before enabling".
Apply this diff:
- - You must provide data subjects with a clear and conspicuous privacy notice prior to enabling cloud-based features, specifying the types of personal data processed, the purpose (e.g., AI transcription), and the involvement of sub-processors, as outlined in our Privacy Policy at /privacy-policy.
+ - You must provide data subjects with a clear and conspicuous privacy notice before enabling cloud-based features, specifying the types of personal data processed, the purpose (e.g., AI transcription), and the involvement of sub-processors, as outlined in our Privacy Policy at /legal/privacy.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - You must provide data subjects with a clear and conspicuous privacy notice prior to enabling cloud-based features, specifying the types of personal data processed, the purpose (e.g., AI transcription), and the involvement of sub-processors, as outlined in our Privacy Policy at /privacy-policy. | |
| - You must provide data subjects with a clear and conspicuous privacy notice before enabling cloud-based features, specifying the types of personal data processed, the purpose (e.g., AI transcription), and the involvement of sub-processors, as outlined in our Privacy Policy at /legal/privacy. |
🧰 Tools
🪛 LanguageTool
[style] ~34-~34: ‘prior to’ might be wordy. Consider a shorter alternative.
Context: ... a clear and conspicuous privacy notice prior to enabling cloud-based features, specifyi...
(EN_WORDINESS_PREMIUM_PRIOR_TO)
🤖 Prompt for AI Agents
In apps/web/content/legal/dpa.mdx around line 34, update the sentence to use the
correct route and simplified wording: change the incorrect relative path
"/privacy-policy" to "/legal/privacy" and replace "prior to enabling" with
"before enabling" so the line reads with the correct path and simpler phrasing.
Changes