chore: blog page rebuild in NextJS and all its functionalities#5
Merged
Jexsie merged 1 commit intonext-js-migrationfrom Mar 13, 2026
Merged
chore: blog page rebuild in NextJS and all its functionalities#5Jexsie merged 1 commit intonext-js-migrationfrom
Jexsie merged 1 commit intonext-js-migrationfrom
Conversation
Signed-off-by: Daniel Ntege <danientege785@gmail.com>
There was a problem hiding this comment.
Pull request overview
This PR rebuilds the Next.js blog experience around markdown/TOML frontmatter content, adds new community-focused pages (Hacktoberfest, Heroes) that fetch data from external APIs, and brings in a large batch of new blog posts/content assets.
Changes:
- Added a markdown-backed posts loader (
lib/posts.ts) and new blog UI (index pagination + per-post page with sharing/recent posts). - Added
/hacktoberfestand/heroespages with client components that fetch issues/contributors from an external endpoint. - Added many new blog posts and supporting author images.
Reviewed changes
Copilot reviewed 49 out of 62 changed files in this pull request and generated 16 comments.
Show a summary per file
| File | Description |
|---|---|
| nextjs/public/images/python/members/exploreriii.png | Adds author image asset for blog posts. |
| nextjs/public/images/python/members/chithraka-kal.jpeg | Adds author image asset for blog posts. |
| nextjs/public/images/python/members/Mounil2005.png | Adds author image asset for blog posts. |
| nextjs/lib/posts.ts | Introduces filesystem-backed post discovery, TOML parsing, and markdown-to-HTML rendering helpers. |
| nextjs/content/posts/_index.md | Adds blog index metadata (title/subtitle/list title). |
| nextjs/content/posts/tsc-voting-september.md | Adds a new blog post. |
| nextjs/content/posts/tsc-voting-results.md | Adds a new blog post (preview_only). |
| nextjs/content/posts/tsc-voting-process.md | Adds a new blog post. |
| nextjs/content/posts/tsc-sep-voting-results.md | Adds a new blog post (preview_only). |
| nextjs/content/posts/september-open-issues-2025.md | Adds a new blog post. |
| nextjs/content/posts/python-v0.1.7-release.md | Adds a new blog post. |
| nextjs/content/posts/python-v0.1.6-release.md | Adds a new blog post. |
| nextjs/content/posts/python-v0.1.4-release.md | Adds a new blog post. |
| nextjs/content/posts/python-v0.1.3-release.md | Adds a new blog post. |
| nextjs/content/posts/python-open-issues-aug.md | Adds a new blog post. |
| nextjs/content/posts/python-office-hours.md | Adds a new blog post. |
| nextjs/content/posts/python-office-hours-launch.md | Adds a new blog post. |
| nextjs/content/posts/post-template-for-reference-only.md | Adds a draft/template post for reference. |
| nextjs/content/posts/namespace-transition-announcement.md | Adds a new blog post (preview_only). |
| nextjs/content/posts/introducing-hiero-sdk-contribution-hub.md | Adds a new blog post (preview_only). |
| nextjs/content/posts/introducing-hiero-cli.md | Adds a new blog post. |
| nextjs/content/posts/hip-1261.md | Adds a new blog post. |
| nextjs/content/posts/hiero_links_of_march_second.md | Adds a new blog post (“Links” roundup). |
| nextjs/content/posts/hiero_links_of_jan.md | Adds a new blog post (“Links” roundup). |
| nextjs/content/posts/hiero_links_of_feb_twentythird.md | Adds a new blog post (“Links” roundup). |
| nextjs/content/posts/hiero_links_of_feb_sixteenth.md | Adds a new blog post (“Links” roundup). |
| nextjs/content/posts/hiero_links_of_feb_second.md | Adds a new blog post (“Links” roundup). |
| nextjs/content/posts/hiero_links_of_feb_ninth.md | Adds a new blog post (“Links” roundup). |
| nextjs/content/posts/hiero_issue_progression_initiative.md | Adds a new blog post. |
| nextjs/content/posts/hiero_being_fair.md | Adds a new blog post. |
| nextjs/content/posts/hiero-hacktoberfest-2025.md | Adds a new blog post. |
| nextjs/content/posts/hiero-graduation-with-further-reading.md | Adds a new blog post. |
| nextjs/content/posts/hiero-enterprise-java.md | Adds a new blog post. |
| nextjs/content/posts/hiero-did-sdk-js-with-video-title.md | Adds a new blog post. |
| nextjs/content/posts/hiero-consensus-specifications.md | Adds a new blog post. |
| nextjs/content/posts/hedera-devday-2026.md | Adds a new blog post. |
| nextjs/content/posts/get-involved/index.md | Adds a new blog post in a subdirectory. |
| nextjs/content/posts/announcing-support-of-swift-6-in-the-hiero-swift-sdk.md | Adds a new blog post. |
| nextjs/content/posts/a-month-of-merges-hacktoberfest-python-sdk.md | Adds a new blog post. |
| nextjs/content/posts/08092025-Python-sdk-community-growing.md | Adds a new blog post. |
| nextjs/content/heroes/index.md | Adds markdown content backing the Heroes page. |
| nextjs/content/hacktoberfest/index.md | Adds markdown content backing the Hacktoberfest page. |
| nextjs/content/_index.md | Updates/introduces main site content configuration. |
| nextjs/components/ShareButtons.tsx | Adds client-side social share buttons component. |
| nextjs/components/IssueList.tsx | Adds client-side issue fetch/filter/list component. |
| nextjs/components/ContributorsGrid.tsx | Adds client-side contributors fetch/grid component. |
| nextjs/components/BlogPostList.tsx | Adds paginated blog list UI component. |
| nextjs/app/heroes/page.tsx | Adds /heroes page rendering markdown + contributors grid. |
| nextjs/app/hacktoberfest/page.tsx | Adds /hacktoberfest page rendering markdown + issue list. |
| nextjs/app/globals.css | Adds cursor-pointer to pagination links and removes a header comment. |
| nextjs/app/blog/page.tsx | Refactors blog index page to use new loader + paginated list component. |
| nextjs/app/blog/[slug]/page.tsx | Adds dynamic blog post detail page with metadata generation, authors, recent posts, and share buttons. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
You can also share your feedback on Copilot code review. Take the survey.
Comment on lines
+116
to
+118
| const cleaned = content.replace(/\{\{<[^>]*>\}\}/g, "").replace(/\{\{%[^%]*%\}\}/g, "").trim(); | ||
| const processed = await remark().use(remarkHtml, { sanitize: false }).process(cleaned); | ||
| return { ...buildMeta(data, file), contentHtml: processed.toString() }; |
Comment on lines
+144
to
+151
| const { data, content } = matter(raw); | ||
| const cleaned = content.replace(/\{\{<[^>]*>\}\}/g, "").replace(/\{\{%[^%]*%\}\}/g, "").trim(); | ||
| const processed = await remark().use(remarkHtml, { sanitize: false }).process(cleaned); | ||
| return { | ||
| title: String(data.title ?? ""), | ||
| description: String(data.description ?? ""), | ||
| contentHtml: processed.toString(), | ||
| }; |
Comment on lines
+96
to
+102
| try { | ||
| const raw = fs.readFileSync(path.join(POSTS_DIR, file), "utf8"); | ||
| const { data } = matter(raw, MATTER_OPTIONS) as unknown as { data: Record<string, unknown> }; | ||
| if (data.draft === true) continue; | ||
| posts.push(buildMeta(data, file)); | ||
| } catch { /* skip */ } | ||
| } |
Comment on lines
+3
to
+6
| export default function ShareButtons() { | ||
| const url = typeof window !== "undefined" ? window.location.href : ""; | ||
| const title = typeof document !== "undefined" ? document.title : ""; | ||
|
|
Comment on lines
+2
to
+4
| import { getAllPosts, getPostBySlug, FALLBACK_IMAGE } from "@/lib/posts"; | ||
| import { format } from "date-fns"; | ||
| import Link from "next/link"; |
Comment on lines
+15
to
+22
| useEffect(() => { | ||
| fetch(endpoint) | ||
| .then((res) => res.json()) | ||
| .then((data: Contributor[]) => { | ||
| setContributors(data); | ||
| setLoading(false); | ||
| }) | ||
| .catch(() => { |
Comment on lines
+58
to
+62
| function parseDate(raw: unknown): string { | ||
| if (!raw) return new Date(0).toISOString(); | ||
| if (raw instanceof Date) return raw.toISOString(); | ||
| return new Date(String(raw)).toISOString(); | ||
| } |
Comment on lines
+97
to
+101
| const raw = fs.readFileSync(path.join(POSTS_DIR, file), "utf8"); | ||
| const { data } = matter(raw, MATTER_OPTIONS) as unknown as { data: Record<string, unknown> }; | ||
| if (data.draft === true) continue; | ||
| posts.push(buildMeta(data, file)); | ||
| } catch { /* skip */ } |
Comment on lines
+13
to
+21
| export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }): Promise<Metadata> { | ||
| const { slug } = await params; | ||
| const post = await getPostBySlug(slug); | ||
| if (!post) return { title: "Post Not Found" }; | ||
| return { title: post.title, description: post.abstract }; | ||
| } | ||
|
|
||
| export default async function BlogPostPage({ params }: { params: Promise<{ slug: string }> }) { | ||
| const { slug } = await params; |
Comment on lines
+21
to
+22
| **om12prakash** added [unit tests and implemented a `repr method](https://github.com/hiero-ledger/hiero-sdk-python/pull/1881) for the NftId class to improve test coverage and debugging readability in the Pyhton SDK. | ||
|
|
Jexsie
approved these changes
Mar 13, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
This pull request introduces several major improvements to the blog and community pages of the Next.js application, focusing on dynamic content rendering, new feature pages, and enhanced user experience. The most significant changes include the addition of new pages for "Hacktoberfest" and "Hiero Heroes," dynamic blog post rendering, reusable paginated blog post lists, and contributor/issue listing components. There are also minor UI improvements and cleanup.
New feature pages:
Hacktoberfestpage (/hacktoberfest) that dynamically loads content from markdown and displays a filterable list of good-first issues from an external API. [1] [2]Hiero Heroespage (/heroes) that loads content from markdown and displays a grid of contributors fetched from an external API. [1] [2]Blog improvements:
/blog) to use dynamic metadata, load post data and metadata from the backend, and display posts using a new, paginatedBlogPostListcomponent. [1] [2]/blog/[slug]) to fetch post data dynamically, display authors, show recent posts, and improve the overall layout and metadata generation. (nextjs/app/blog/[slug]/page.tsxR1-R126)Reusable components:
BlogPostListfor paginated blog post listings, with windowed pagination and improved accessibility.ContributorsGridto display a grid of GitHub contributors, handling loading and error states.IssueListto display and filter open issues by language, with improved UX for loading and error handling.UI and style improvements:
cursor-pointerto pagination links.globals.cssfor maintainability.Changes Made
Related Issues
Screenshots (if applicable)
Checklist
Deployment Notes