Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/web/app/.gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

# clerk configuration (can include secrets)
/.clerk/
.vercel
8 changes: 5 additions & 3 deletions apps/web/app/app/(auth)/sign-in/[[...sign-in]]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { SignIn } from "@clerk/nextjs";
import { createMetadata } from "@workspace/seo/metadata";

export const metadata = {
title: "Sign In | Qurious",
};
export const metadata = createMetadata({
title: "Sign In",
description: "Sign in to your Qurious account",
});

export default function SignInPage() {
return <SignIn />;
Expand Down
8 changes: 5 additions & 3 deletions apps/web/app/app/(auth)/sign-up/[[...sign-up]]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { SignUp } from "@clerk/nextjs";
import { createMetadata } from "@workspace/seo/metadata";

export const metadata = {
title: "Sign Up | Qurious",
};
export const metadata = createMetadata({
title: "Sign Up",
description: "Create a new Qurious account",
});

export default function SignUpPage() {
return <SignUp />;
Expand Down
13 changes: 9 additions & 4 deletions apps/web/app/app/(user)/folders/[id]/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { fetchQuery } from "convex/nextjs";
import { api } from "@workspace/backend/_generated/api";
import { Id } from "@workspace/backend/_generated/dataModel";
import { createMetadata } from "@workspace/seo/metadata";
import { FolderLayoutClient } from "./client";

type Props = {
Expand All @@ -19,11 +20,15 @@ export async function generateMetadata({
folderId: id as Id<"folders">,
});

return {
title: `${folder.name} | Folder | Qurious`,
};
return createMetadata({
title: `${folder.name} | Folder`,
description: `View and manage papers and searches in the ${folder.name} folder`,
});
Comment on lines +23 to +26

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Title will render as "FolderName | Folder | Qurious" due to double suffixing.

As noted in packages/seo/metadata.ts, createMetadata appends " | Qurious" to the title. Passing \${folder.name} | Folder`here produces a three-segment title. If a two-segment title is intended, pass just the folder name and letcreateMetadata` handle the suffix:

Proposed fix
     return createMetadata({
-      title: `${folder.name} | Folder`,
+      title: folder.name,
       description: `View and manage papers and searches in the ${folder.name} folder`,
     });
📝 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.

Suggested change
return createMetadata({
title: `${folder.name} | Folder`,
description: `View and manage papers and searches in the ${folder.name} folder`,
});
return createMetadata({
title: folder.name,
description: `View and manage papers and searches in the ${folder.name} folder`,
});
🤖 Prompt for AI Agents
In `@apps/web/app/app/`(user)/folders/[id]/layout.tsx around lines 23 - 26, The
title currently passes a pre-suffixed string to createMetadata causing double
suffixing; update the call in layout.tsx (the createMetadata invocation) to pass
only the folder name (e.g., folder.name) as the title so createMetadata can
append " | Qurious" itself, and remove the explicit " | Folder" segment from the
title/description construction to avoid the extra segment.

} catch {
return { title: "Folder | Qurious" };
return createMetadata({
title: "Folder",
description: "View and manage papers and searches in this folder",
});
}
}

Expand Down
7 changes: 4 additions & 3 deletions apps/web/app/app/(user)/folders/page.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { FolderClient } from "./client";
import { createMetadata } from "@workspace/seo/metadata";

export const metadata = {
title: "Folders | Qurious",
export const metadata = createMetadata({
title: "Folders",
description: "Manage your folders and organize your papers",
};
});

export default function FoldersPage() {
return <FolderClient />;
Expand Down
14 changes: 10 additions & 4 deletions apps/web/app/app/(user)/papers/[id]/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { api } from "@workspace/backend/_generated/api";
import { fetchAction } from "convex/nextjs";
import { createMetadata } from "@workspace/seo/metadata";
import { PaperLayoutClient } from "./client";

type Props = {
Expand Down Expand Up @@ -36,11 +37,16 @@ export async function generateMetadata({
},
);

return {
title: `${paper.title} | Paper | Qurious`,
};
return createMetadata({
title: `${paper.title} | Paper`,
description:
paper.tldr?.text || paper.abstract || "View paper details on Qurious",
});
Comment on lines +40 to +44

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Double title suffix: paper.title | Paper | Qurious.

createMetadata already appends | ${applicationName} to the title (see packages/seo/metadata.ts Line 24). Passing "${paper.title} | Paper" here will produce a title like "My Paper Title | Paper | Qurious". Other pages in this PR pass only the page-specific name (e.g., "Folders", "Sign In").

Suggested fix
     return createMetadata({
-      title: `${paper.title} | Paper`,
+      title: paper.title,
       description:
         paper.tldr?.text || paper.abstract || "View paper details on Qurious",
     });
📝 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.

Suggested change
return createMetadata({
title: `${paper.title} | Paper`,
description:
paper.tldr?.text || paper.abstract || "View paper details on Qurious",
});
return createMetadata({
title: paper.title,
description:
paper.tldr?.text || paper.abstract || "View paper details on Qurious",
});
🤖 Prompt for AI Agents
In `@apps/web/app/app/`(user)/papers/[id]/layout.tsx around lines 40 - 44, The
title passed to createMetadata in layout.tsx currently includes a hardcoded " |
Paper" suffix which causes duplicate suffixing because createMetadata already
appends the application name; change the title argument to just the
page-specific name (e.g., use paper.title instead of `${paper.title} | Paper`)
and keep the description logic as-is so the final title becomes "Paper Title |
Qurious" via createMetadata; update the createMetadata call in the layout.tsx
function that uses paper.title accordingly.

} catch {
return { title: "Paper | Qurious" };
return createMetadata({
title: "Paper",
description: "View paper details on Qurious",
});
}
}

Expand Down
10 changes: 7 additions & 3 deletions apps/web/app/app/(user)/search/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
fieldsOfStudy,
publicationTypes,
} from "@workspace/semantic-scholar/src/index";
import { createMetadata } from "@workspace/seo/metadata";

import { SearchResults } from "./client";

Expand Down Expand Up @@ -33,9 +34,12 @@ export async function generateMetadata(props: Props) {
const searchParams = await props.searchParams;
const { q } = searchParamsSchema.parse(searchParams);

return {
title: q ? `${q} | Search | Qurious` : "Search | Qurious",
};
return createMetadata({
title: q ? `${q} | Search` : "Search",
description: q
? `Search results for "${q}" on Qurious`
: "Search for research papers and academic content",
});
}

export default async function SearchPage(props: Props) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@ import {
CardHeader,
CardTitle,
} from "@workspace/design-system/components/card";
import { createMetadata } from "@workspace/seo/metadata";

export const metadata = {
title: "Account Settings | Qurious",
};
export const metadata = createMetadata({
title: "Account Settings",
description: "Manage your account profile and authentication settings",
});

export default function AccountSettingsPage() {
return (
Expand Down
8 changes: 5 additions & 3 deletions apps/web/app/app/(user)/settings/credits/page.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { Heading } from "@/components/global-heading";
import { CreditsClient } from "./client";
import { CreditCard } from "@workspace/design-system/icons";
import { createMetadata } from "@workspace/seo/metadata";

export const metadata = {
title: "Credits | Qurious",
};
export const metadata = createMetadata({
title: "Credits",
description: "Manage your credits and billing preferences",
});

export default function CreditsSettingsPage() {
return (
Expand Down
8 changes: 5 additions & 3 deletions apps/web/app/app/(user)/settings/customization/page.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { Heading } from "@/components/global-heading";
import { ContentSettingsBox } from "./client";
import { Palette } from "@workspace/design-system/icons";
import { createMetadata } from "@workspace/seo/metadata";

export const metadata = {
title: "Customization Settings | Qurious",
};
export const metadata = createMetadata({
title: "Customization Settings",
description: "Customize your AI preferences and appearance",
});

export default function CustomizationSettingsPage() {
return (
Expand Down
8 changes: 5 additions & 3 deletions apps/web/app/app/(user)/settings/keys/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@ import {
CardHeader,
CardTitle,
} from "@workspace/design-system/components/card";
import { createMetadata } from "@workspace/seo/metadata";

export const metadata = {
title: "API Keys | Qurious",
};
export const metadata = createMetadata({
title: "API Keys",
description: "Manage your API keys for external integrations",
});

export default function KeysSettingsPage() {
return (
Expand Down
8 changes: 5 additions & 3 deletions apps/web/app/app/(user)/settings/webhooks/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@ import {
CardHeader,
CardTitle,
} from "@workspace/design-system/components/card";
import { createMetadata } from "@workspace/seo/metadata";

export const metadata = {
title: "Webhooks | Qurious",
};
export const metadata = createMetadata({
title: "Webhooks",
description: "Configure webhooks for real-time notifications",
});

export default function WebhooksSettingsPage() {
return (
Expand Down
1 change: 0 additions & 1 deletion apps/web/app/app/icon.svg

This file was deleted.

8 changes: 4 additions & 4 deletions apps/web/app/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import "@workspace/design-system/styles/globals.css";
import type { Metadata } from "next";
import { GeistSans, GeistMono } from "@workspace/design-system/font";

// Providers
Expand All @@ -10,13 +9,14 @@ import { FontProvider } from "@workspace/design-system/providers/font-provider";
import { PostHogProvider } from "@/providers/posthog-provider";

import { APP_DESCRIPTION, APP_NAME } from "@workspace/design-system/content";
import { createMetadata } from "@workspace/seo/metadata";

import { Analytics } from "@vercel/analytics/next";

export const metadata: Metadata = {
title: APP_NAME,
export const metadata = createMetadata({
title: "Home",
description: APP_DESCRIPTION,
};
});
Comment thread
coderabbitai[bot] marked this conversation as resolved.

export default function RootLayout({
children,
Expand Down
1 change: 1 addition & 0 deletions apps/web/app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
"@workspace/backend": "workspace:*",
"@workspace/design-system": "workspace:*",
"@workspace/semantic-scholar": "workspace:*",
"@workspace/seo": "workspace:*",
"ai": "^6.0.68",
"convex": "^1.31.7",
"d3": "^7.9.0",
Expand Down
33 changes: 17 additions & 16 deletions apps/web/blog/app/(home)/blog/[slug]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
import { notFound } from 'next/navigation';
import Link from 'next/link';
import { InlineTOC } from 'fumadocs-ui/components/inline-toc';
import defaultMdxComponents from 'fumadocs-ui/mdx';
import { blog } from '@/lib/source';
import { notFound } from "next/navigation";
import Link from "next/link";
import { InlineTOC } from "fumadocs-ui/components/inline-toc";
import defaultMdxComponents from "fumadocs-ui/mdx";
import { blog } from "@/lib/source";
import { createMetadata } from "@workspace/seo/metadata";

export async function generateMetadata(props: {
params: Promise<{ slug: string }>;
}) {
const params = await props.params;
const page = blog.getPage([params.slug]);
if (!page) notFound();
return {
title: page.data.title,
description: page.data.description,
};
}
params: Promise<{ slug: string }>;
}) {
const params = await props.params;
const page = blog.getPage([params.slug]);
if (!page) notFound();
return createMetadata({
title: page.data.title,
description: page.data.description || "Blog post",
});
}

export default async function Page(props: {
params: Promise<{ slug: string }>;
Expand Down Expand Up @@ -58,4 +59,4 @@ export function generateStaticParams(): { slug: string }[] {
return blog.getPages().map((page) => ({
slug: page.slugs[0],
}));
}
}
17 changes: 9 additions & 8 deletions apps/web/help/app/(docs)/[[...slug]]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import { source } from '@/lib/source';
import { source } from "@/lib/source";
import {
DocsPage,
DocsBody,
DocsDescription,
DocsTitle,
} from 'fumadocs-ui/page';
import { notFound } from 'next/navigation';
import { createRelativeLink } from 'fumadocs-ui/mdx';
import { getMDXComponents } from '@/mdx-components';
} from "fumadocs-ui/page";
import { notFound } from "next/navigation";
import { createRelativeLink } from "fumadocs-ui/mdx";
import { getMDXComponents } from "@/mdx-components";
import { createMetadata } from "@workspace/seo/metadata";

export default async function Page(props: {
params: Promise<{ slug?: string[] }>;
Expand Down Expand Up @@ -45,8 +46,8 @@ export async function generateMetadata(props: {
const page = source.getPage(params.slug);
if (!page) notFound();

return {
return createMetadata({
title: page.data.title,
description: page.data.description,
};
description: page.data.description || "Documentation",
});
}
8 changes: 4 additions & 4 deletions apps/web/www/app/(legal)/privacy/page.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import type { Metadata } from "next";
import Link from "next/link";
import { APP_NAME, LEGAL_CONFIG } from "@workspace/design-system/content";
import { createMetadata } from "@workspace/seo/metadata";

export const metadata: Metadata = {
title: `Privacy Policy | ${APP_NAME}`,
export const metadata = createMetadata({
title: "Privacy Policy",
description: `Privacy Policy for ${APP_NAME} - Learn how we collect, use, and protect your data.`,
};
});

export default function PrivacyPage() {
return (
Expand Down
8 changes: 4 additions & 4 deletions apps/web/www/app/(legal)/terms/page.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import type { Metadata } from "next";
import Link from "next/link";
import { APP_NAME, LEGAL_CONFIG } from "@workspace/design-system/content";
import { createMetadata } from "@workspace/seo/metadata";

export const metadata: Metadata = {
title: `Terms of Service | ${APP_NAME}`,
export const metadata = createMetadata({
title: "Terms of Service",
description: `Terms of Service for ${APP_NAME} - A research tool for the AI age.`,
};
});
Comment on lines +5 to +8

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Consider making the Terms description more page-specific.

The Privacy page description explains what the user will learn ("how we collect, use, and protect your data"), but the Terms description falls back to a generic app tagline ("A research tool for the AI age"). A more specific description like Terms of Service for ${APP_NAME} - Read the rules and guidelines for using our platform. would better describe the page content for search engines.

✏️ Suggested description improvement
 export const metadata = createMetadata({
   title: "Terms of Service",
-  description: `Terms of Service for ${APP_NAME} - A research tool for the AI age.`,
+  description: `Terms of Service for ${APP_NAME} - Read the rules and guidelines for using our platform.`,
 });
📝 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.

Suggested change
export const metadata = createMetadata({
title: "Terms of Service",
description: `Terms of Service for ${APP_NAME} - A research tool for the AI age.`,
};
});
export const metadata = createMetadata({
title: "Terms of Service",
description: `Terms of Service for ${APP_NAME} - Read the rules and guidelines for using our platform.`,
});
🤖 Prompt for AI Agents
In `@apps/web/www/app/`(legal)/terms/page.tsx around lines 5 - 8, The metadata
object created by createMetadata currently sets a generic description for the
Terms page using APP_NAME; update the description value to be page-specific
(e.g., "Terms of Service for ${APP_NAME} - Read the rules and guidelines for
using our platform.") so search engines/users see the page intent; locate the
export const metadata = createMetadata(...) in page.tsx and replace the
description template string accordingly.


export default function TermsPage() {
return (
Expand Down
6 changes: 3 additions & 3 deletions apps/web/www/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import type { Metadata } from "next";
import type { ReactNode } from "react";
import "@workspace/design-system/styles/globals.css";

Expand All @@ -10,11 +9,12 @@ import { ThemeProvider } from "@workspace/design-system/providers/theme-provider
import { APP_DESCRIPTION, APP_NAME } from "@workspace/design-system/content";
import { Separator } from "@workspace/design-system/components/separator";
import { Footer } from "@/components/footer";
import { createMetadata } from "@workspace/seo/metadata";

export const metadata: Metadata = {
export const metadata = createMetadata({
title: APP_NAME,
description: APP_DESCRIPTION,
};
});
Comment thread
coderabbitai[bot] marked this conversation as resolved.

const BackgroundGridsAndBlob = () => {
return (
Expand Down
2 changes: 2 additions & 0 deletions apps/web/www/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
"dependencies": {
"@t3-oss/env-nextjs": "^0.13.8",
"@workspace/design-system": "workspace:*",
"@workspace/seo": "workspace:*",
"motion": "^12.34.0",
"next": "15.5.4",
"next-themes": "^0.4.6",
"react": "^19.0.0",
Expand Down
Binary file added apps/web/www/public/image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions apps/web/www/public/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 3 additions & 1 deletion cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,9 @@
"worklets",
"zod",
"zotero",
"samhoque"
"samhoque",
"Sahil",
"sahillll"
Comment on lines +85 to +87

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Maintain alphabetical ordering of the words list.

The existing entries are alphabetically sorted, but "samhoque", "Sahil", and "sahillll" are appended at the end. Move them to their correct positions (e.g., between "retinoids" and "Segoe") to keep the list consistent and avoid future duplicates.

🤖 Prompt for AI Agents
In `@cspell.json` around lines 85 - 87, The words list has three entries out of
alphabetical order: "samhoque", "Sahil", and "sahillll"; move these three
entries into their correct alphabetical location within the cspell words array
(for example between "retinoids" and "Segoe") so the list remains sorted and
consistent; ensure casing is preserved and avoid introducing duplicates when
repositioning these items.

],
"ignorePaths": [
"**/*.map",
Expand Down
Loading
Loading