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
24 changes: 12 additions & 12 deletions public/feed.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,32 @@
<link>https://usewraith.xyz/blog</link>
<description>Notes on stealth payments, private infrastructure, and the Wraith ecosystem.</description>
<language>en-us</language>
<lastBuildDate>Tue, 25 Aug 2026 05:26:09 GMT</lastBuildDate>
<lastBuildDate>Tue, 25 Aug 2026 05:06:07 GMT</lastBuildDate>
<atom:link href="https://usewraith.xyz/feed.xml" rel="self" type="application/rss+xml" />

<item>
<title>How Stealth Addresses Keep Payments Private</title>
<link>https://usewraith.xyz/blog/stealth-addresses-explained</link>
<guid>https://usewraith.xyz/blog/stealth-addresses-explained</guid>
<pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
<description>A look at the cryptography behind stealth addresses and why every Wraith payment lands on a fresh one-time address that cannot be linked to the recipient.</description>
<author>Lena Vogt</author>
</item>
<item>
<title>Wave 7 Kick-off + What We Shipped in Wave 6</title>
<link>https://usewraith.xyz/blog/wave-7-kickoff</link>
<guid>https://usewraith.xyz/blog/wave-7-kickoff</guid>
<pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate>
<description>Announcing the start of Wave 7 alongside a recap of Wave 6 milestones: EVM stealth transactions, SDK v1.4 release, Stellar ecosystem integrations, and TEE privacy enhancements.</description>
<author>Wraith Team</author>
<author>Wraith Protocol Team</author>
</item>
<item>
<title>Stealth addresses explained</title>
<link>https://usewraith.xyz/blog/stealth-addresses-explained</link>
<guid>https://usewraith.xyz/blog/stealth-addresses-explained</guid>
<pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate>
<description>A straightforward introduction to stealth addresses and why they matter for private payments.</description>
<author>Wraith Protocol Team</author>
</item>
<item>
<title>Privacy by default</title>
<link>https://usewraith.xyz/blog/privacy-by-default</link>
<guid>https://usewraith.xyz/blog/privacy-by-default</guid>
<pubDate>Mon, 20 Jul 2026 12:00:00 GMT</pubDate>
<pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate>
<description>How Wraith makes private payments practical for everyday apps.</description>
<author>Wraith Team</author>
<author>Wraith Protocol Team</author>
</item>
</channel>
</rss>
20 changes: 20 additions & 0 deletions public/feed/tag/announcements.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Wraith Protocol Blog — announcements</title>
<link>https://usewraith.xyz/blog/tag/announcements</link>
<description>Notes on stealth payments, private infrastructure, and the Wraith ecosystem.</description>
<language>en-us</language>
<lastBuildDate>Tue, 25 Aug 2026 05:06:07 GMT</lastBuildDate>
<atom:link href="https://usewraith.xyz/feed/tag/announcements.xml" rel="self" type="application/rss+xml" />

<item>
<title>Wave 7 Kick-off + What We Shipped in Wave 6</title>
<link>https://usewraith.xyz/blog/wave-7-kickoff</link>
<guid>https://usewraith.xyz/blog/wave-7-kickoff</guid>
<pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate>
<description>Announcing the start of Wave 7 alongside a recap of Wave 6 milestones: EVM stealth transactions, SDK v1.4 release, Stellar ecosystem integrations, and TEE privacy enhancements.</description>
<author>Wraith Protocol Team</author>
</item>
</channel>
</rss>
28 changes: 28 additions & 0 deletions public/feed/tag/privacy.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Wraith Protocol Blog — privacy</title>
<link>https://usewraith.xyz/blog/tag/privacy</link>
<description>Notes on stealth payments, private infrastructure, and the Wraith ecosystem.</description>
<language>en-us</language>
<lastBuildDate>Tue, 25 Aug 2026 05:06:07 GMT</lastBuildDate>
<atom:link href="https://usewraith.xyz/feed/tag/privacy.xml" rel="self" type="application/rss+xml" />

<item>
<title>Stealth addresses explained</title>
<link>https://usewraith.xyz/blog/stealth-addresses-explained</link>
<guid>https://usewraith.xyz/blog/stealth-addresses-explained</guid>
<pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate>
<description>A straightforward introduction to stealth addresses and why they matter for private payments.</description>
<author>Wraith Protocol Team</author>
</item>
<item>
<title>Privacy by default</title>
<link>https://usewraith.xyz/blog/privacy-by-default</link>
<guid>https://usewraith.xyz/blog/privacy-by-default</guid>
<pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate>
<description>How Wraith makes private payments practical for everyday apps.</description>
<author>Wraith Protocol Team</author>
</item>
</channel>
</rss>
28 changes: 28 additions & 0 deletions public/feed/tag/sdk.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Wraith Protocol Blog — sdk</title>
<link>https://usewraith.xyz/blog/tag/sdk</link>
<description>Notes on stealth payments, private infrastructure, and the Wraith ecosystem.</description>
<language>en-us</language>
<lastBuildDate>Tue, 25 Aug 2026 05:06:07 GMT</lastBuildDate>
<atom:link href="https://usewraith.xyz/feed/tag/sdk.xml" rel="self" type="application/rss+xml" />

<item>
<title>Wave 7 Kick-off + What We Shipped in Wave 6</title>
<link>https://usewraith.xyz/blog/wave-7-kickoff</link>
<guid>https://usewraith.xyz/blog/wave-7-kickoff</guid>
<pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate>
<description>Announcing the start of Wave 7 alongside a recap of Wave 6 milestones: EVM stealth transactions, SDK v1.4 release, Stellar ecosystem integrations, and TEE privacy enhancements.</description>
<author>Wraith Protocol Team</author>
</item>
<item>
<title>Stealth addresses explained</title>
<link>https://usewraith.xyz/blog/stealth-addresses-explained</link>
<guid>https://usewraith.xyz/blog/stealth-addresses-explained</guid>
<pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate>
<description>A straightforward introduction to stealth addresses and why they matter for private payments.</description>
<author>Wraith Protocol Team</author>
</item>
</channel>
</rss>
36 changes: 36 additions & 0 deletions public/feed/tag/stealth-payments.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Wraith Protocol Blog — stealth-payments</title>
<link>https://usewraith.xyz/blog/tag/stealth-payments</link>
<description>Notes on stealth payments, private infrastructure, and the Wraith ecosystem.</description>
<language>en-us</language>
<lastBuildDate>Tue, 25 Aug 2026 05:06:07 GMT</lastBuildDate>
<atom:link href="https://usewraith.xyz/feed/tag/stealth-payments.xml" rel="self" type="application/rss+xml" />

<item>
<title>Wave 7 Kick-off + What We Shipped in Wave 6</title>
<link>https://usewraith.xyz/blog/wave-7-kickoff</link>
<guid>https://usewraith.xyz/blog/wave-7-kickoff</guid>
<pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate>
<description>Announcing the start of Wave 7 alongside a recap of Wave 6 milestones: EVM stealth transactions, SDK v1.4 release, Stellar ecosystem integrations, and TEE privacy enhancements.</description>
<author>Wraith Protocol Team</author>
</item>
<item>
<title>Stealth addresses explained</title>
<link>https://usewraith.xyz/blog/stealth-addresses-explained</link>
<guid>https://usewraith.xyz/blog/stealth-addresses-explained</guid>
<pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate>
<description>A straightforward introduction to stealth addresses and why they matter for private payments.</description>
<author>Wraith Protocol Team</author>
</item>
<item>
<title>Privacy by default</title>
<link>https://usewraith.xyz/blog/privacy-by-default</link>
<guid>https://usewraith.xyz/blog/privacy-by-default</guid>
<pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate>
<description>How Wraith makes private payments practical for everyday apps.</description>
<author>Wraith Protocol Team</author>
</item>
</channel>
</rss>
20 changes: 20 additions & 0 deletions public/feed/tag/wave-6.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Wraith Protocol Blog — wave-6</title>
<link>https://usewraith.xyz/blog/tag/wave-6</link>
<description>Notes on stealth payments, private infrastructure, and the Wraith ecosystem.</description>
<language>en-us</language>
<lastBuildDate>Tue, 25 Aug 2026 05:06:07 GMT</lastBuildDate>
<atom:link href="https://usewraith.xyz/feed/tag/wave-6.xml" rel="self" type="application/rss+xml" />

<item>
<title>Wave 7 Kick-off + What We Shipped in Wave 6</title>
<link>https://usewraith.xyz/blog/wave-7-kickoff</link>
<guid>https://usewraith.xyz/blog/wave-7-kickoff</guid>
<pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate>
<description>Announcing the start of Wave 7 alongside a recap of Wave 6 milestones: EVM stealth transactions, SDK v1.4 release, Stellar ecosystem integrations, and TEE privacy enhancements.</description>
<author>Wraith Protocol Team</author>
</item>
</channel>
</rss>
20 changes: 20 additions & 0 deletions public/feed/tag/wave-7.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Wraith Protocol Blog — wave-7</title>
<link>https://usewraith.xyz/blog/tag/wave-7</link>
<description>Notes on stealth payments, private infrastructure, and the Wraith ecosystem.</description>
<language>en-us</language>
<lastBuildDate>Tue, 25 Aug 2026 05:06:07 GMT</lastBuildDate>
<atom:link href="https://usewraith.xyz/feed/tag/wave-7.xml" rel="self" type="application/rss+xml" />

<item>
<title>Wave 7 Kick-off + What We Shipped in Wave 6</title>
<link>https://usewraith.xyz/blog/wave-7-kickoff</link>
<guid>https://usewraith.xyz/blog/wave-7-kickoff</guid>
<pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate>
<description>Announcing the start of Wave 7 alongside a recap of Wave 6 milestones: EVM stealth transactions, SDK v1.4 release, Stellar ecosystem integrations, and TEE privacy enhancements.</description>
<author>Wraith Protocol Team</author>
</item>
</channel>
</rss>
38 changes: 34 additions & 4 deletions public/sitemap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -61,25 +61,55 @@
<priority>0.7</priority>
</url>
<url>
<loc>https://usewraith.xyz/blog/author/lena-vogt</loc>
<loc>https://usewraith.xyz/blog</loc>
<lastmod>2026-08-25</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://usewraith.xyz/blog</loc>
<loc>https://usewraith.xyz/compare</loc>
<lastmod>2026-08-25</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://usewraith.xyz/compare</loc>
<loc>https://usewraith.xyz/newsletter</loc>
<lastmod>2026-08-25</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://usewraith.xyz/newsletter</loc>
<loc>https://usewraith.xyz/blog/tag/privacy</loc>
<lastmod>2026-08-25</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://usewraith.xyz/blog/tag/stealth-payments</loc>
<lastmod>2026-08-25</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://usewraith.xyz/blog/tag/sdk</loc>
<lastmod>2026-08-25</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://usewraith.xyz/blog/tag/announcements</loc>
<lastmod>2026-08-25</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://usewraith.xyz/blog/tag/wave-7</loc>
<lastmod>2026-08-25</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://usewraith.xyz/blog/tag/wave-6</loc>
<lastmod>2026-08-25</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
Expand Down
33 changes: 33 additions & 0 deletions scripts/feed-utils.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
function slugifyTag(tag) {
return String(tag)
.toLowerCase()
.trim()
.replace(/[^a-z0-9]+/g, '-')
.replace(/^-+|-+$/g, '');
}

function parseTags(raw) {
if (Array.isArray(raw)) {
return raw.map((t) => String(t).trim()).filter(Boolean);
}

if (typeof raw !== 'string') return [];

const value = raw.trim();
if (!value) return [];

if (value.startsWith('[') && value.endsWith(']')) {
return value
.slice(1, -1)
.split(',')
.map((item) => item.trim().replace(/^['"]|['"]$/g, ''))
.filter(Boolean);
}

return value
.split(/[\s,]+/)
.map((item) => item.replace(/^['"]|['"]$/g, '').trim())
.filter(Boolean);
}

export { slugifyTag, parseTags };
40 changes: 35 additions & 5 deletions scripts/gen-rss.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'fs';
import { dirname, join } from 'path';
import { fileURLToPath, pathToFileURL } from 'url';
import { slugifyTag, parseTags } from './feed-utils.mjs';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
Expand Down Expand Up @@ -91,6 +92,7 @@ export function getPosts() {
content: content ?? '',
publishedAt: metadata.publishedAt || metadata.date,
author: resolveAuthorName(metadata.author),
tags: parseTags(metadata.tags),
url: metadata.url ?? `${siteUrl}/blog/${slug}`,
});
}
Expand All @@ -112,6 +114,7 @@ export function getPosts() {
content: post.content ?? '',
publishedAt: post.publishedAt || post.date,
author: resolveAuthorName(post.author),
tags: parseTags(post.tags),
url: post.url ?? `${siteUrl}/blog/${post.slug}`,
});
}
Expand All @@ -127,7 +130,12 @@ export function getPosts() {
.sort((left, right) => Date.parse(right.publishedAt) - Date.parse(left.publishedAt));
}

export function buildRssFeed(posts, baseUrl = siteUrl) {
export function buildRssFeed(posts, baseUrl = siteUrl, options = {}) {
const { tag } = options;
const title = tag ? `Wraith Protocol Blog — ${tag}` : 'Wraith Protocol Blog';
const selfPath = tag ? `/feed/tag/${slugifyTag(tag)}.xml` : '/feed.xml';
const channelLink = tag ? `${baseUrl}/blog/tag/${slugifyTag(tag)}` : `${baseUrl}/blog`;

const items = posts
.filter((post) => Boolean(post.publishedAt))
.map((post) => {
Expand All @@ -148,12 +156,12 @@ export function buildRssFeed(posts, baseUrl = siteUrl) {
return `<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Wraith Protocol Blog</title>
<link>${baseUrl}/blog</link>
<title>${escapeXml(title)}</title>
<link>${channelLink}</link>
<description>Notes on stealth payments, private infrastructure, and the Wraith ecosystem.</description>
<language>en-us</language>
<lastBuildDate>${toRfc822(new Date().toISOString())}</lastBuildDate>
<atom:link href="${baseUrl}/feed.xml" rel="self" type="application/rss+xml" />
<atom:link href="${baseUrl}${selfPath}" rel="self" type="application/rss+xml" />
${items ? `\n${items}\n` : ''} </channel>
</rss>`;
}
Expand All @@ -165,13 +173,35 @@ function writeFeedFile(targetDir) {
writeFileSync(join(targetDir, 'feed.xml'), feedXml, 'utf8');
}

function writeTagFeeds(targetDir) {
const posts = getPosts();
const tags = new Set();
posts.forEach((post) => {
(post.tags || []).forEach((tag) => tags.add(tag));
});

for (const tag of tags) {
const tagPosts = posts.filter((post) => (post.tags || []).includes(tag));
const feedXml = buildRssFeed(tagPosts, siteUrl, { tag });
const tagDir = join(targetDir, 'feed', 'tag');
mkdirSync(tagDir, { recursive: true });
writeFileSync(join(tagDir, `${slugifyTag(tag)}.xml`), feedXml, 'utf8');
}

return tags.size;
}

function main() {
const posts = getPosts();
writeFeedFile(publicDir);
const tagCount = writeTagFeeds(publicDir);
if (existsSync(distDir)) {
writeFeedFile(distDir);
writeTagFeeds(distDir);
}
console.log(`feed.xml generated successfully with ${posts.length} posts.`);
console.log(
`feed.xml generated successfully with ${posts.length} posts across ${tagCount} tag feeds.`,
);
}

if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
Expand Down
Loading
Loading