Skip to content

Commit d630894

Browse files
authored
Merge pull request #71 from intelowlproject/rss_feed
Add RSS feed for blog entries
2 parents 02e4222 + dfbbaee commit d630894

File tree

6 files changed

+115
-2
lines changed

6 files changed

+115
-2
lines changed

.github/workflows/nextjs.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ jobs:
7575
run: ${{ steps.detect-package-manager.outputs.manager }} ${{ steps.detect-package-manager.outputs.command }}
7676
- name: Build ContentLayer
7777
run: ${{ steps.detect-package-manager.outputs.runner }} contentlayer build
78+
- name: Generate RSS Feed
79+
run: node scripts/generate-rss.mjs
7880
- name: Build with Next.js
7981
run: ${{ steps.detect-package-manager.outputs.runner }} next build
8082
- name: Static HTML export with Next.js

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,6 @@ next-env.d.ts
3737

3838
# Contentlayer
3939
.contentlayer
40+
41+
# Generated RSS feed
42+
/public/feed.xml

package-lock.json

Lines changed: 65 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
"version": "0.1.0",
44
"private": true,
55
"scripts": {
6-
"dev": "contentlayer build && next dev",
7-
"build": "contentlayer build && next build",
6+
"dev": "contentlayer build && node scripts/generate-rss.mjs && next dev",
7+
"build": "contentlayer build && node scripts/generate-rss.mjs && next build",
88
"start": "next start",
99
"lint": "next lint"
1010
},
@@ -28,6 +28,7 @@
2828
"react-type-animation": "^3.2.0",
2929
"rehype-raw": "^7.0.0",
3030
"remark-gfm": "^4.0.0",
31+
"rss": "^1.2.2",
3132
"swiper": "^9.3.2",
3233
"tailwindcss": "3.3.2",
3334
"typescript": "5.0.4"

scripts/generate-rss.mjs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { readFile, writeFile } from "node:fs/promises";
2+
import RSS from "rss";
3+
4+
const SITE_URL = "https://intelowlproject.github.io";
5+
const POSTS_JSON = ".contentlayer/generated/Post/_index.json";
6+
const OUTPUT_PATH = "public/feed.xml";
7+
8+
async function main() {
9+
const posts = JSON.parse(await readFile(POSTS_JSON, "utf-8"));
10+
posts.sort((a, b) => new Date(b.date) - new Date(a.date));
11+
12+
const feed = new RSS({
13+
title: "IntelOwl Project Blog",
14+
description: "Latest updates from the IntelOwl Project",
15+
feed_url: `${SITE_URL}/feed.xml`,
16+
site_url: `${SITE_URL}/blogs`,
17+
language: "en",
18+
});
19+
20+
for (const post of posts) {
21+
feed.item({
22+
title: post.title,
23+
description: post.body.html.replace(/<[^>]*>/g, "").replace(/\s+/g, " ").trim(),
24+
url: `${SITE_URL}${post.url}`,
25+
author: post.author || "IntelOwl Project",
26+
date: new Date(post.date),
27+
});
28+
}
29+
30+
await writeFile(OUTPUT_PATH, feed.xml({ indent: true }), "utf-8");
31+
console.log(`RSS feed generated: ${OUTPUT_PATH} (${posts.length} posts)`);
32+
}
33+
34+
main().catch((err) => {
35+
console.error("Failed to generate RSS feed:", err);
36+
process.exit(1);
37+
});

src/app/layout.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ export const metadata = {
99
icons: {
1010
icon: 'images/favicon.png',
1111
},
12+
alternates: {
13+
types: {
14+
'application/rss+xml': '/feed.xml',
15+
},
16+
},
1217
}
1318

1419
export default function RootLayout({

0 commit comments

Comments
 (0)