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
3 changes: 2 additions & 1 deletion docusaurus.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,8 @@ const config: Config = {
feedOptions: {
type: "all",
title: "OneGround ZGW API Changelog",
description: "Latest releases and updates for OneGround ZGW API platform"
description: "Latest releases and updates for OneGround ZGW API platform",
xslt: true
}
} satisfies PluginContentBlog.Options
],
Expand Down
54 changes: 54 additions & 0 deletions src/components/ChangelogFeedLinks/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import React, { type ReactNode } from "react";
import Link from "@docusaurus/Link";
import styles from "./styles.module.css";

const RSS_ATOM_PATH =
"M6.503 20.752c0 1.794-1.456 3.248-3.251 3.248-1.796 0-3.252-1.454-3.252-3.248 0-1.794 1.456-3.248 3.252-3.248 1.795.001 3.251 1.454 3.251 3.248zm-6.503-12.572v4.811c6.05.062 10.96 4.966 11.022 11.009h4.817c-.062-8.71-7.118-15.758-15.839-15.82zm0-3.368c10.58.046 19.152 8.594 19.183 19.188h4.817c-.03-13.231-10.755-23.954-24-24v4.812z";

const JSON_PATH = "M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z";

function FeedIcon({ color, path }: { color: string; path: string }): ReactNode {
return (
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
width="16"
height="16"
style={{ fill: color, flexShrink: 0 }}
aria-hidden="true"
>
<path d={path} />
</svg>
);
}

export default function ChangelogFeedLinks(): ReactNode {
return (
<div className={styles.feedContainer}>
<Link
href="pathname:///changelog/rss.xml"
className={styles.feedLink}
style={{ "--feed-accent": "#f26522" } as React.CSSProperties}
>
<FeedIcon color="#f26522" path={RSS_ATOM_PATH} />
<span>RSS</span>
</Link>
<Link
href="pathname:///changelog/atom.xml"
className={styles.feedLink}
style={{ "--feed-accent": "#4caf50" } as React.CSSProperties}
>
<FeedIcon color="#4caf50" path={RSS_ATOM_PATH} />
<span>Atom</span>
</Link>
<Link
href="pathname:///changelog/feed.json"
className={styles.feedLink}
style={{ "--feed-accent": "#2196f3" } as React.CSSProperties}
>
<FeedIcon color="#2196f3" path={JSON_PATH} />
<span>JSON</span>
</Link>
</div>
);
}
35 changes: 35 additions & 0 deletions src/components/ChangelogFeedLinks/styles.module.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
.feedContainer {
display: flex;
gap: 1rem;
flex-wrap: wrap;
margin-bottom: 1rem;
align-items: center;
}

.feedLink {
display: inline-flex;
align-items: center;
gap: 0.35rem;
border-radius: 2rem;
padding: 0.3rem 0.85rem;
font-weight: 600;
font-size: 0.8rem;
color: var(--feed-accent);
background: color-mix(in srgb, var(--feed-accent) 10%, transparent);
transition: background-color 0.2s ease;
text-decoration: none;
}

.feedLink:hover {
background: color-mix(in srgb, var(--feed-accent) 20%, transparent);
text-decoration: none;
color: var(--feed-accent);
}

[data-theme="dark"] .feedLink {
background: color-mix(in srgb, var(--feed-accent) 15%, transparent);
}

[data-theme="dark"] .feedLink:hover {
background: color-mix(in srgb, var(--feed-accent) 25%, transparent);
}
7 changes: 7 additions & 0 deletions src/theme/BlogListPage/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import React, { type ReactNode } from "react";
import BlogListPage from "@theme-original/BlogListPage";
import type { Props } from "@theme/BlogListPage";

export default function BlogListPageWrapper(props: Props): ReactNode {
return <BlogListPage {...props} />;
}
17 changes: 17 additions & 0 deletions src/theme/BlogPostItems/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import React, { type ReactNode } from "react";
import { useLocation } from "@docusaurus/router";
import BlogPostItems from "@theme-original/BlogPostItems";
import type { Props } from "@theme/BlogPostItems";
import ChangelogFeedLinks from "@site/src/components/ChangelogFeedLinks";

export default function BlogPostItemsWrapper(props: Props): ReactNode {
const { pathname } = useLocation();
const isChangelog = pathname.startsWith("/changelog");

return (
<>
{isChangelog && <ChangelogFeedLinks />}
<BlogPostItems {...props} />
</>
);
}
99 changes: 84 additions & 15 deletions static/structured-data.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,16 @@
"name": "OneGround",
"alternateName": "Roxit OneGround",
"url": "https://dev.oneground.nl",
"sameAs": ["https://github.com/OneGround", "https://oneground.nl", "https://portaal.oneground.nl"],
"sameAs": [
"https://github.com/OneGround",
"https://oneground.nl",
"https://portaal.oneground.nl",
"https://www.linkedin.com/showcase/one-ground/",
"https://www.youtube.com/@vismaroxit"
],
"logo": {
"@type": "ImageObject",
"url": "https://dev.oneground.nl/img/logo.png",
"url": "https://dev.oneground.nl/img/logo.svg",
"width": 200,
"height": 60
},
Expand Down Expand Up @@ -47,15 +53,7 @@
"publisher": {
"@id": "https://dev.oneground.nl/#organization"
},
"inLanguage": "en",
"potentialAction": {
"@type": "SearchAction",
"target": {
"@type": "EntryPoint",
"urlTemplate": "https://dev.oneground.nl/search?q={search_term_string}"
},
"query-input": "required name=search_term_string"
}
"inLanguage": "en"
},
{
"@type": "SoftwareApplication",
Expand Down Expand Up @@ -128,7 +126,7 @@
"description": "OneGround is a comprehensive implementation of Dutch ZGW APIs for case management (Zaakgericht Werken). Learn about ZRC, DRC, ZTC, BRC, NRC, AC components, features, and how to get started.",
"url": "https://dev.oneground.nl/docs/about-oneground",
"datePublished": "2024-01-01",
"dateModified": "2025-06-09",
"dateModified": "2026-01-19",
"author": {
"@id": "https://dev.oneground.nl/#organization"
},
Expand All @@ -152,6 +150,13 @@
"NRC",
"AC",
"RL",
"OAuth2",
"JWT",
"Docker",
".NET",
"webhooks",
"digital signing",
"NEN-ISO 16175",
"VNG standards",
"government APIs"
]
Expand All @@ -167,6 +172,60 @@
},
"inLanguage": "en"
},
{
"@type": "BlogPosting",
"@id": "https://dev.oneground.nl/blog/best-practices-for-jwt-usage-in-apis#blogposting",
"headline": "Best Practices for JWT Usage in APIs - OneGround Security Guide",
"description": "Comprehensive guide to implementing JWT authentication securely in ZGW APIs and OneGround. Learn about token security, validation, best practices, and common pitfalls to avoid.",
"url": "https://dev.oneground.nl/blog/best-practices-for-jwt-usage-in-apis",
"datePublished": "2024-12-03",
"author": {
"@type": "Person",
"name": "Giedrius Grabauskas"
},
"isPartOf": {
"@id": "https://dev.oneground.nl/blog#blog"
},
"publisher": {
"@id": "https://dev.oneground.nl/#organization"
}
},
{
"@type": "BlogPosting",
"@id": "https://dev.oneground.nl/blog/integrating-signing-software-with-zgw#blogposting",
"headline": "Standardized Document Signing Integration for ZGW APIs - Complete Guide",
"description": "Learn how to integrate digital document signing software with ZGW APIs. Complete implementation guide with API patterns, authentication methods, and standardized trigger messages for OneGround and compliant ZGW systems.",
"url": "https://dev.oneground.nl/blog/integrating-signing-software-with-zgw",
"datePublished": "2025-03-27",
"author": {
"@type": "Person",
"name": "Michiel Nijdam"
},
"isPartOf": {
"@id": "https://dev.oneground.nl/blog#blog"
},
"publisher": {
"@id": "https://dev.oneground.nl/#organization"
}
},
{
"@type": "BlogPosting",
"@id": "https://dev.oneground.nl/blog/oauth2-token-endpoint#blogposting",
"headline": "Why OneGround Uses an OAuth2 Token Endpoint",
"description": "Learn why customer-generated JWTs are risky and how OAuth2 Token Endpoints provide better security, control, and simplicity for API authentication.",
"url": "https://dev.oneground.nl/blog/oauth2-token-endpoint",
"datePublished": "2025-11-14",
"author": {
"@type": "Person",
"name": "Giedrius Grabauskas"
},
"isPartOf": {
"@id": "https://dev.oneground.nl/blog#blog"
},
"publisher": {
"@id": "https://dev.oneground.nl/#organization"
}
},
{
"@type": "FAQPage",
"@id": "https://dev.oneground.nl/#faq",
Expand All @@ -176,7 +235,7 @@
"name": "What is OneGround?",
"acceptedAnswer": {
"@type": "Answer",
"text": "OneGround is the implementation by Roxit of case oriented APIs and registrations according to the VNG specifications. It contains ZTC, ZRC, DRC, BRC, NC, AC and reference lists for Dutch government case management."
"text": "OneGround is the implementation by Roxit of case oriented APIs and registrations according to the VNG specifications. It contains ZTC, ZRC, DRC, BRC, NRC, AC and reference lists for Dutch government case management."
}
},
{
Expand All @@ -192,7 +251,7 @@
"name": "What ZGW components does OneGround include?",
"acceptedAnswer": {
"@type": "Answer",
"text": "OneGround includes all ZGW API components: ZRC (Case Registration), DRC (Document Registration), ZTC (Case Type Catalog), BRC (Decision Registration), NRC (Notification Center), and AC (Authorization Component)."
"text": "OneGround includes all ZGW API components: ZRC (Case Registration), DRC (Document Registration), ZTC (Case Type Catalog), BRC (Decision Registration), NRC (Notification Center), AC (Authorization Component), and RL (Reference Lists)."
}
},
{
Expand Down Expand Up @@ -244,7 +303,17 @@
"creator": {
"@id": "https://dev.oneground.nl/#organization"
},
"keywords": ["ZGW API", "Documentation", "Dutch Government", "Case Management", "API Reference"],
"keywords": [
"ZGW API",
"Documentation",
"Dutch Government",
"Case Management",
"API Reference",
"OAuth2",
"JWT",
"webhooks",
"integration guides"
],
"license": "https://github.com/OneGround/oneground.github.io/blob/main/LICENSE",
"distribution": {
"@type": "DataDownload",
Expand Down
Loading