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
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## Unreleased

- Security: prevent blog and author JSON-LD metadata from breaking out of its script element (#208, thanks @SebTardif).
- Security: remove raw HTML from blog descriptions so frontmatter cannot inject active markup (#207, thanks @SebTardif).
- Testimonials: prune 20 low-signal shoutouts into the backup file, and add Windows chief @pavandavuluri's "Clawfather" Build shoutout and @rodrigofarinha on agent speed.

- Testimonials: add 5 more shoutouts — GitHub's @ashleywolf on the fastest-growing project celebration, plus @bartslodyczka, @nelsonlopes_, @morganlinton, and @mronge — with cached avatars.
Expand Down
1 change: 0 additions & 1 deletion src/content.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ const blog = defineCollection({
schema: z.object({
title: z.string(),
description: z.string(),
descriptionHtml: z.string().optional(),
date: z.date(),
// Single author (legacy)
author: z.string().optional(),
Expand Down
1 change: 0 additions & 1 deletion src/content/blog/openclaw-nvidia-skill-security.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
---
title: "OpenClaw Collaborates with NVIDIA for Stronger Agent Skill Security"
description: "Every ClawHub skill now ships with a Skill Card documenting what the skill does and where it came from, and is scanned by SkillSpector for hidden instructions and other agentic risks"
descriptionHtml: 'Every ClawHub skill now ships with a <a href="https://github.com/NVIDIA/Trustworthy-AI/blob/main/Skill%20Card.md">Skill Card</a> documenting what the skill does and where it came from, and is scanned by <a href="https://github.com/nvidia/skillspector">SkillSpector</a> for hidden instructions and other agentic risks'
date: 2026-06-01T05:30:00.000Z
authors:
- name: "Vincent Koc"
Expand Down
3 changes: 1 addition & 2 deletions src/pages/blog/[...slug].astro
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ const canonicalPostUrl = absoluteUrl(blogPostPath(post));
const ogImage = resolveBlogSocialImage(post.id, post.data.ogImage);
const articleImageUrl = absoluteUrl(ogImage.src);

const descriptionHtml = post.data.descriptionHtml ?? post.data.description;
const structuredAuthors = authors.map((author) => {
const sameAs = getSortedAuthorLinkMeta(author)
.map((link) => link.url)
Expand Down Expand Up @@ -127,7 +126,7 @@ const articleStructuredData = {
<header class="article-header">
<a class="back-link" href="/blog"><span aria-hidden="true">←</span> All posts</a>
<h1>{post.data.title}</h1>
<p class="dek" set:html={descriptionHtml} />
<p class="dek">{post.data.description}</p>

<div class="byline">
<div class="byline-avatars">
Expand Down
11 changes: 11 additions & 0 deletions tests/static-assets.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,17 @@ function listSourceFiles(relativeDir: string): string[] {
}

describe('static public assets', () => {
test('renders blog descriptions as escaped text instead of raw HTML', () => {
const articlePage = readText('src/pages/blog/[...slug].astro');
const contentSchema = readText('src/content.config.ts');
const blogSources = listSourceFiles('src/content/blog').map(readText);

expect(articlePage).toContain('<p class="dek">{post.data.description}</p>');
expect(articlePage).not.toContain('set:html');
expect(contentSchema).not.toContain('descriptionHtml');
expect(blogSources.every((source) => !source.includes('descriptionHtml:'))).toBe(true);
});

test('uses the canonical OpenClaw design-system contract', () => {
const layout = readText('src/layouts/Layout.astro');
const orderedImports = [
Expand Down