Skip to content

Comments

feat: add changelog page#89

Open
Alqamaq wants to merge 4 commits intoketankauntia:masterfrom
Alqamaq:feat/changelog
Open

feat: add changelog page#89
Alqamaq wants to merge 4 commits intoketankauntia:masterfrom
Alqamaq:feat/changelog

Conversation

@Alqamaq
Copy link
Contributor

@Alqamaq Alqamaq commented Jan 30, 2026

Summary

  • The Changelog is designed as a Static Data-Driven Feature. the changelog entries are managed via a local TypeScript file. This ensures:
    Zero database latency for the feed.
    Updates are made through PRs, keeping the "code" and "history" together.
  • Data Storage
    All updates are stored in array like objects in lib/changelog-data.ts
    Schema:
  • timeStamp: A numerical value (YYYYMMDD) used for automatic sorting.
  • version: The release version string
  • prLinks: An array of objects {link: string, number: string} to support multiple prs.
  • changes: An object with type of changes (fix,feat,chore) and desc of changes.
  • How to Add New Entry
    • Open lib/changelog-data.ts
    • Add a new object to the top (or anywhere) in the CHANGELOG_ENTRIES array
    • Format Links: Use Markdown syntax [Link Text] (URL) within the text field of a change. The component uses Regex-based-helper formatChangelogText will automatically style these as Teal Links
    • The component automatically sorts entries by timestamp in decreasing order (latest first)

Testing

localhost_3000_changelog (2)

Summary by CodeRabbit

  • New Features
    • Added a Changelog page showing product updates by version and date with timeline styling and a responsive two-column layout.
    • Entries display title, summary, itemized changes, and per-entry PR links (desktop and mobile); Markdown-style links render as teal clickable links.
    • Seeded the changelog with initial entries so history is immediately visible.
    • Added a "Changelog" link to the footer for easy access.

@Alqamaq Alqamaq requested a review from ketankauntia as a code owner January 30, 2026 17:09
@vercel
Copy link

vercel bot commented Jan 30, 2026

@Alqamaq is attempting to deploy a commit to the Ketan's Personal Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai
Copy link

coderabbitai bot commented Jan 30, 2026

Warning

.coderabbit.yaml has a parsing error

The CodeRabbit configuration file in this repository has a parsing error and default settings were used instead. Please fix the error(s) in the configuration file. You can initialize chat with CodeRabbit to get help with the configuration file.

💥 Parsing errors (1)
Validation error: Expected 'de' | 'de-DE' | 'de-AT' | 'de-CH' | 'en' | 'en-US' | 'en-AU' | 'en-GB' | 'en-CA' | 'en-NZ' | 'en-ZA' | 'es' | 'es-AR' | 'fr' | 'fr-CA' | 'fr-CH' | 'fr-BE' | 'nl' | 'nl-BE' | 'pt-AO' | 'pt' | 'pt-BR' | 'pt-MZ' | 'pt-PT' | 'ar' | 'ast-ES' | 'ast' | 'be-BY' | 'be' | 'br-FR' | 'br' | 'ca-ES' | 'ca' | 'ca-ES-valencia' | 'ca-ES-balear' | 'da-DK' | 'da' | 'de-DE-x-simple-language' | 'el-GR' | 'el' | 'eo' | 'fa' | 'ga-IE' | 'ga' | 'gl-ES' | 'gl' | 'it' | 'ja-JP' | 'ja' | 'km-KH' | 'km' | 'ko-KR' | 'ko' | 'pl-PL' | 'pl' | 'ro-RO' | 'ro' | 'ru-RU' | 'ru' | 'sk-SK' | 'sk' | 'sl-SI' | 'sl' | 'sv' | 'ta-IN' | 'ta' | 'tl-PH' | 'tl' | 'tr' | 'uk-UA' | 'uk' | 'zh-CN' | 'zh' | 'crh-UA' | 'crh' | 'cs-CZ' | 'cs' | 'nb' | 'no' | 'nl-NL' | 'de-DE-x-simple-language-DE' | 'es-ES' | 'it-IT' | 'fa-IR' | 'sv-SE' | 'de-LU' | 'fr-FR' | 'bg-BG' | 'bg' | 'he-IL' | 'he' | 'hi-IN' | 'hi' | 'vi-VN' | 'vi' | 'th-TH' | 'th' | 'bn-BD' | 'bn', received object at "language"
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Walkthrough

Adds a new Next.js changelog page and metadata, a TypeScript changelog data module with entries, and a footer navigation link — rendering a responsive two-column timeline with per-entry PR links and formatted link text, wrapped with Header and FooterSmall.

Changes

Cohort / File(s) Summary
Changelog Page
app/changelog/page.tsx
New Next.js app page exporting metadata and default ChangelogPage. Sorts CHANGELOG_ENTRIES by timeStamp, formats markdown-style links, and renders a responsive two-column timeline with date/version badges, desktop & mobile PR links, and Header/FooterSmall wrappers.
Changelog Data
lib/changelog-data.ts
New ChangelogEntry interface and exported CHANGELOG_ENTRIES array with two sample entries (date, timeStamp, version, title, summary, prLinks, changes).
Footer Navigation
components/footer-common.tsx
Added "Changelog" (/changelog) to the Community section of FOOTER_NAVIGATION_ITEMS.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐇 I hopped through commits, a tidy trail,
Dates, versions, links in teal detail,
Badges gleam and PRs in view,
Footer points where changelogs flew,
A happy hop — the updates tell the tale!

🚥 Pre-merge checks | ✅ 1 | ❌ 2
❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Description check ⚠️ Warning The PR description covers the summary section with detailed information about implementation approach and data structure. However, the testing section only contains an image without written test instructions, and the checklist is missing entirely. Complete the checklist section with checkboxes marked as done/not applicable. Add written test instructions or verification steps beyond just the screenshot image.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat: add changelog page' clearly and concisely summarizes the primary change in the changeset, which is the addition of a new changelog page feature.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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

❤️ Share

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

@Alqamaq Alqamaq mentioned this pull request Jan 30, 2026
Copy link

@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: 4

🤖 Fix all issues with AI agents
In `@app/changelog/page.tsx`:
- Around line 76-80: The anchor rendering for PR links (the <a key={i}
href={pr.link} target="_blank" ...> element) is missing rel="noopener
noreferrer"; update that anchor to include rel="noopener noreferrer" to mitigate
reverse-tabnabbing, and scan other uses of target="_blank" in this component
(e.g., any anchors that render external PR or changelog links) to apply the same
rel attribute consistently.
- Around line 29-35: The anchor elements using hardcoded color utilities (e.g.,
the <a key={match.index} href={match[2]} ... className="text-teal-600
dark:text-teal-400 ...">) must be changed to use existing design tokens instead
of literal teal classes; replace "text-teal-600 dark:text-teal-400" with the
tokenized class (for example "text-accent-foreground" or the appropriate
existing token used elsewhere) and keep the other utilities (hover:underline,
font-medium, transition-colors) intact; apply the same replacement for the other
anchor/className occurrences flagged (the similar className strings around the
later anchor usages).
- Around line 8-11: The metadata object for the changelog page is missing a
canonical URL; import getFullUrl from "@/lib/constants" (if not already) and add
an alternates.canonical property to the exported metadata (e.g., alternates: {
canonical: getFullUrl("/changelog") }) so the page follows the same SEO pattern
used by other pages; update the metadata export (export const metadata:
Metadata) to include this new alternates.canonical entry.

In `@lib/changelog-data.ts`:
- Around line 22-31: The changelog contains placeholder URLs in prsLink, images,
and the inline markdown URL inside the changes array (e.g., prsLink entries,
images array, and the 'Added new [filtering system](https://github.com/...)'
text); replace each placeholder "https://github.com/..." with the actual PR URLs
(use the full repo+PR path) and swap the placeholder image URL in images with
the real preview image URL; also update any other occurrences of these
placeholders elsewhere in the file (including other entries referenced by the
changes array) so all PR links, inline markdown links, and preview images are
authoritative before release.
🧹 Nitpick comments (1)
app/changelog/page.tsx (1)

105-110: Prefer next/image for changelog screenshots.
Lint warns about raw <img>; using next/image improves LCP and bandwidth. Ensure the remote domain is allow‑listed in next.config and set appropriate dimensions.

🖼️ Example migration to next/image
-import { Metadata } from "next";
+import { Metadata } from "next";
+import Image from "next/image";
-                        <img key={i} src={img} alt="Update" className="w-full h-auto" />
+                        <Image
+                          key={i}
+                          src={img}
+                          alt="Update"
+                          className="w-full h-auto"
+                          width={1200}
+                          height={600}
+                        />

Comment on lines 29 to 35
<a
key={match.index}
href={match[2]}
target="_blank"
rel="noopener noreferrer"
className="text-teal-600 dark:text-teal-400 hover:underline font-medium transition-colors"
>
Copy link

@coderabbitai coderabbitai bot Jan 30, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Replace hardcoded teal colors with existing design tokens.
text-teal-600 / dark:text-teal-400 introduce hardcoded colors that can drift from the theme. Please use existing tokenized classes (e.g., text-accent-foreground) so dark/light modes stay consistent.

🎨 Example tokenized swap
- className="text-teal-600 dark:text-teal-400 hover:underline font-medium transition-colors"
+ className="text-accent-foreground hover:underline font-medium transition-colors"
- className="flex items-center gap-1.5 text-xs text-teal-600 dark:text-teal-400 hover:underline transition-colors group"
+ className="flex items-center gap-1.5 text-xs text-accent-foreground hover:underline transition-colors group"
- <GitHubIcon className="w-3 h-3 text-muted-foreground group-hover:text-teal-600" />
+ <GitHubIcon className="w-3 h-3 text-muted-foreground group-hover:text-accent-foreground" />
- className="flex items-center gap-2 text-sm text-teal-600 dark:text-teal-400 font-medium"
+ className="flex items-center gap-2 text-sm text-accent-foreground font-medium"
As per coding guidelines: Use ONLY existing color tokens and design variables, do NOT hardcode colors, do NOT introduce new colors without explicit instruction

Also applies to: 80-83, 121-122

🤖 Prompt for AI Agents
In `@app/changelog/page.tsx` around lines 29 - 35, The anchor elements using
hardcoded color utilities (e.g., the <a key={match.index} href={match[2]} ...
className="text-teal-600 dark:text-teal-400 ...">) must be changed to use
existing design tokens instead of literal teal classes; replace "text-teal-600
dark:text-teal-400" with the tokenized class (for example
"text-accent-foreground" or the appropriate existing token used elsewhere) and
keep the other utilities (hover:underline, font-medium, transition-colors)
intact; apply the same replacement for the other anchor/className occurrences
flagged (the similar className strings around the later anchor usages).

✅ Addressed in commit 4e68fe2

Copy link
Owner

Choose a reason for hiding this comment

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

@Alqamaq use the predefined teal color.

Copy link

Choose a reason for hiding this comment

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

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

@vercel
Copy link

vercel bot commented Jan 30, 2026

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

Project Deployment Actions Updated (UTC)
gsoc-orgs Ready Ready Preview, Comment Feb 5, 2026 9:30am

@ketankauntia
Copy link
Owner

@Alqamaq have a look on the codeRabbit comments.

Copy link
Owner

@ketankauntia ketankauntia left a comment

Choose a reason for hiding this comment

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

Also, have a writeup in the end as to how new changelogs can be added, how they get stored and other imp things, so that it is easier to navigate and understand for others as well.

good for future reference if we come to work on this feature again,

Copy link

@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

🤖 Fix all issues with AI agents
In `@app/changelog/page.tsx`:
- Around line 67-68: Replace the unstable array index key used in the
sortedEntries.map render with a stable identifier: change the JSX key on the
article element (currently key={idx} in the sortedEntries.map callback) to use
the entry.timeStamp property (or another unique, stable id on the entry) so
React can reconcile items correctly when entries are inserted or reordered.

Comment on lines 29 to 35
<a
key={match.index}
href={match[2]}
target="_blank"
rel="noopener noreferrer"
className="text-teal-600 dark:text-teal-400 hover:underline font-medium transition-colors"
>
Copy link
Owner

Choose a reason for hiding this comment

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

@Alqamaq use the predefined teal color.

Copy link

@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

🤖 Fix all issues with AI agents
In `@app/changelog/page.tsx`:
- Line 60: Replace the invalid Tailwind class mt-15 on the header element with a
valid design-system token or an arbitrary value; locate the header with
className "mb-16 mt-15 border-b border-border pb-8" and swap mt-15 for one of
the semantic tokens (e.g., mt-2xl for 48px) or an explicit utility (e.g.,
mt-[60px]) to match the intended spacing.
🧹 Nitpick comments (3)
app/changelog/page.tsx (3)

22-23: Trim obvious inline comments.

The comment at Line 22 (and similar ones at Line 66, Line 72, Line 97, Line 113) restates what the JSX already makes clear; removing them keeps the file concise.

As per coding guidelines: Do NOT add comments that restate the obvious or explain what the code does if clear. ONLY add comments for non-obvious decisions, workarounds, edge cases, and architectural reasoning.


34-40: Avoid inline link colors; use tokenized classes.

Inline style colors override theme tokens and can drift from dark/light mode rules. Prefer existing text token classes for links, and apply the same change to the PR link anchors at Line 82-89 and Line 116-120. If this removes the last usage, drop the chartColors import.

♻️ Suggested change
-        <a
+        <a
           key={match.index}
           href={match[2]}
           target="_blank"
           rel="noopener noreferrer"
-          style={{ color: chartColors.accent.primary }}
-          className="hover:underline font-medium transition-colors"
+          className="text-accent-foreground hover:underline font-medium transition-colors"
         >
-                    <a
+                    <a
                       key={i}
                       href={pr.link}
                       target="_blank"
                       rel="noopener noreferrer"
-                      style={{ color: chartColors.accent.primary }}
                       className="flex items-center gap-1.5 text-xs text-accent-foreground hover:underline transition-colors group"
                     >
-                    <a
+                    <a
                       key={i}
                       href={pr.link}
-                      style={{ color: chartColors.accent.primary }}
                       className="flex items-center gap-2 text-sm text-accent-foreground font-medium"
                     >

As per coding guidelines: Use ONLY existing color tokens and design variables, do NOT hardcode colors, do NOT introduce new colors without explicit instruction; Respect dark/light mode rules if present in the design system.


81-83: Prefer stable keys over array indexes for lists.

Using i can cause incorrect reconciliation if items are inserted or reordered. Use a stable identifier (e.g., pr.link/pr.number, and a stable change field).

♻️ Suggested change
-                  {entry.prLinks.map((pr, i) => (
+                  {entry.prLinks.map((pr) => (
                     <a
-                      key={i}
+                      key={pr.link}
                       href={pr.link}
                       target="_blank"
                       rel="noopener noreferrer"
                       className="flex items-center gap-1.5 text-xs text-accent-foreground hover:underline transition-colors group"
                     >
-                  {entry.changes.map((change, i) => (
-                    <li key={i} className="flex items-start gap-3">
+                  {entry.changes.map((change) => (
+                    <li key={change.text} className="flex items-start gap-3">

Also applies to: 105-107

Copy link

@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

🤖 Fix all issues with AI agents
In `@app/changelog/page.tsx`:
- Around line 34-41: The anchor elements are using an inline style prop
(style={{ color: chartColors.accent.primary }}) which hardcodes color and breaks
token/dark-mode rules; remove the style prop and replace it with the appropriate
existing design token class (e.g., add the tokenized text color class to
className such as text-accent-primary or the project’s equivalent token class)
and then remove the chartColors import if it becomes unused; apply the same
replacement for the other anchor occurrences referenced (the anchors at the
other ranges) so all links use tokenized classes instead of inline styles.
🧹 Nitpick comments (1)
app/changelog/page.tsx (1)

65-67: Remove the obvious timeline comment.

The comment restates what the markup already makes clear.

♻️ Proposed fix
-          {/* The Timeline Line */}
           <div className="absolute left-[11px] md:left-[155px] top-2 bottom-0 w-px bg-border hidden sm:block" />

As per coding guidelines: Do NOT add comments that restate the obvious or explain what the code does if clear.

@ketankauntia
Copy link
Owner

Looks good in deployment. I will review the pr once and release the PR.

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