Skip to content

Commit 9c77fed

Browse files
author
Clemens Vasters
committed
Add blog section with RSS feed and inaugural post
1 parent 76aa70c commit 9c77fed

8 files changed

Lines changed: 356 additions & 6 deletions

File tree

_layouts/default.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,10 @@ <h3>SDKs</h3>
6363
<li><a href="{{ "/sdks/c.html" | relative_url }}">C</a></li>
6464
</ul>
6565

66-
<h3>Tools</h3>
66+
<h3>Resources</h3>
6767
<ul>
68-
<li><a href="{{ "/codegen.html" | relative_url }}">Code Generation &amp; Schema Conversions</a></li>
68+
<li><a href="{{ "/blog/" | relative_url }}">Blog</a></li>
69+
<li><a href="{{ "/codegen.html" | relative_url }}">Code Generation</a></li>
6970
</ul>
7071
</nav>
7172

_layouts/post.html

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
<!DOCTYPE html>
2+
<html lang="{{ site.lang | default: "en-US" }}">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
6+
<meta name="viewport" content="width=device-width, initial-scale=1">
7+
8+
{% seo %}
9+
<link rel="stylesheet" href="{{ "/assets/css/style.css?v=" | append: site.github.build_revision | relative_url }}">
10+
<link rel="alternate" type="application/rss+xml" title="{{ site.title }} Blog" href="{{ "/rss.xml" | relative_url }}">
11+
<!--[if lt IE 9]>
12+
<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script>
13+
<![endif]-->
14+
{% include head-custom.html %}
15+
</head>
16+
<body>
17+
<div class="spec-header">
18+
<div class="spec-header-content">
19+
<span class="spec-header-title">Specification:</span>
20+
<a href="https://json-structure.github.io/core/draft-vasters-json-structure-core.html">Core</a>
21+
<span class="spec-sep">|</span>
22+
<a href="https://json-structure.github.io/import/draft-vasters-json-structure-import.html">Import</a>
23+
<span class="spec-sep">|</span>
24+
<a href="https://json-structure.github.io/alternate-names/draft-vasters-json-structure-alternate-names.html">Alternate Names</a>
25+
<span class="spec-sep">|</span>
26+
<a href="https://json-structure.github.io/units/draft-vasters-json-structure-units.html">Symbols, Units, Currencies</a>
27+
<span class="spec-sep">|</span>
28+
<a href="https://json-structure.github.io/validation/draft-vasters-json-structure-validation.html">Validation</a>
29+
<span class="spec-sep">|</span>
30+
<a href="https://json-structure.github.io/conditional-composition/draft-vasters-json-structure-cond-composition-02/draft-vasters-json-structure-cond-composition.html">Conditional Composition</a>
31+
</div>
32+
</div>
33+
<div class="wrapper">
34+
<header>
35+
<h1><a href="{{ "/" | absolute_url }}">{{ site.title | default: site.github.repository_name }}</a></h1>
36+
37+
{% if site.logo %}
38+
<img src="{{site.logo | relative_url}}" alt="Logo" />
39+
{% endif %}
40+
41+
<p>{{ site.description | default: site.github.project_tagline }}</p>
42+
43+
{% if site.github.is_project_page %}
44+
<p class="view"><a href="{{ site.github.repository_url }}">View the Project on GitHub <small>{{ site.github.repository_nwo }}</small></a></p>
45+
{% endif %}
46+
47+
<nav class="sidebar-nav">
48+
<h3>SDKs</h3>
49+
<ul>
50+
<li><a href="{{ "/sdks/typescript.html" | relative_url }}">TypeScript/JavaScript</a></li>
51+
<li><a href="{{ "/sdks/python.html" | relative_url }}">Python</a></li>
52+
<li><a href="{{ "/sdks/dotnet.html" | relative_url }}">.NET (C#)</a></li>
53+
<li><a href="{{ "/sdks/java.html" | relative_url }}">Java</a></li>
54+
<li><a href="{{ "/sdks/go.html" | relative_url }}">Go</a></li>
55+
<li><a href="{{ "/sdks/rust.html" | relative_url }}">Rust</a></li>
56+
<li><a href="{{ "/sdks/ruby.html" | relative_url }}">Ruby</a></li>
57+
<li><a href="{{ "/sdks/perl.html" | relative_url }}">Perl</a></li>
58+
<li><a href="{{ "/sdks/php.html" | relative_url }}">PHP</a></li>
59+
<li><a href="{{ "/sdks/swift.html" | relative_url }}">Swift</a></li>
60+
<li><a href="{{ "/sdks/c.html" | relative_url }}">C</a></li>
61+
</ul>
62+
63+
<h3>Resources</h3>
64+
<ul>
65+
<li><a href="{{ "/blog/" | relative_url }}">Blog</a></li>
66+
<li><a href="{{ "/codegen.html" | relative_url }}">Code Generation</a></li>
67+
</ul>
68+
</nav>
69+
70+
{% if site.show_downloads %}
71+
<ul class="downloads">
72+
<li><a href="{{ site.github.zip_url }}">Download <strong>ZIP File</strong></a></li>
73+
<li><a href="{{ site.github.tar_url }}">Download <strong>TAR Ball</strong></a></li>
74+
<li><a href="{{ site.github.repository_url }}">View On <strong>GitHub</strong></a></li>
75+
</ul>
76+
{% endif %}
77+
</header>
78+
<section class="blog-post">
79+
<article>
80+
<header class="post-header">
81+
<h1 class="post-title">{{ page.title }}</h1>
82+
<p class="post-meta">
83+
<time datetime="{{ page.date | date_to_xmlschema }}">{{ page.date | date: "%B %d, %Y" }}</time>
84+
{% if page.author %} • {{ page.author }}{% endif %}
85+
</p>
86+
</header>
87+
88+
<div class="post-content">
89+
{{ content }}
90+
</div>
91+
</article>
92+
93+
<nav class="post-navigation">
94+
<a href="{{ "/blog/" | relative_url }}">← Back to Blog</a>
95+
</nav>
96+
</section>
97+
</div>
98+
<footer class="page-footer">
99+
{% if site.github.is_project_page %}
100+
<p>This project is maintained by <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a></p>
101+
{% endif %}
102+
<p><small>Hosted on GitHub Pages &mdash; Theme by <a href="https://github.com/orderedlist">orderedlist</a></small></p>
103+
</footer>
104+
<script src="{{ "/assets/js/scale.fix.js" | relative_url }}"></script>
105+
</body>
106+
</html>

_layouts/sdk-index.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,10 @@ <h3>SDKs</h3>
5959
<li><a href="{{ "/sdks/c.html" | relative_url }}">C</a></li>
6060
</ul>
6161

62-
<h3>Tools</h3>
62+
<h3>Resources</h3>
6363
<ul>
64-
<li><a href="{{ "/codegen.html" | relative_url }}">Code Generation &amp; Schema Conversions</a></li>
64+
<li><a href="{{ "/blog/" | relative_url }}">Blog</a></li>
65+
<li><a href="{{ "/codegen.html" | relative_url }}">Code Generation</a></li>
6566
</ul>
6667
</nav>
6768

_layouts/sdk.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,10 @@ <h3>SDKs</h3>
5959
<li{% if page.sdk_name == "c" %} class="active"{% endif %}><a href="{{ "/sdks/c.html" | relative_url }}">C</a></li>
6060
</ul>
6161

62-
<h3>Tools</h3>
62+
<h3>Resources</h3>
6363
<ul>
64-
<li><a href="{{ "/codegen.html" | relative_url }}">Code Generation &amp; Schema Conversions</a></li>
64+
<li><a href="{{ "/blog/" | relative_url }}">Blog</a></li>
65+
<li><a href="{{ "/codegen.html" | relative_url }}">Code Generation</a></li>
6566
</ul>
6667
</nav>
6768

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
---
2+
layout: post
3+
title: "Welcome to JSON Structure"
4+
date: 2026-02-04
5+
author: Clemens Vasters
6+
---
7+
8+
JSON Structure is here, and with it comes a fresh perspective on how we define data types and structures for modern applications.
9+
10+
## What is JSON Structure?
11+
12+
JSON Structure is a schema language designed to describe data types and structures that map cleanly to programming language types, database constructs, and the ubiquitous JSON data encoding. If you've worked with JSON Schema, the syntax will feel familiar – but the philosophy is different.
13+
14+
Where JSON Schema focuses primarily on document validation (asking "does this JSON document conform to these rules?"), JSON Structure focuses on being a strong **data definition language**. It's about defining types that your code, your databases, and your APIs can share and understand consistently.
15+
16+
## Why Another Schema Language?
17+
18+
The landscape of data definition is fragmented. You have Protocol Buffers for efficient binary serialization, Avro for Hadoop ecosystems, JSON Schema for validation, OpenAPI for API definitions, and countless language-specific type systems. Each serves its purpose, but none quite hits the sweet spot for developers who want:
19+
20+
- **Clear mapping to programming language types** – Your schema types should translate directly to `string`, `int32`, `decimal`, `datetime`, and so on in your favorite language. No ambiguity about what "number" means.
21+
22+
- **Precise numeric and temporal types** – JSON Structure supports `int8`, `int16`, `int32`, `int64`, `float`, `double`, `decimal` with precision and scale, plus proper `date`, `time`, `datetime`, and `duration` types. No more guessing whether your "integer" is 32 or 64 bits.
23+
24+
- **First-class support for common constructs** – Sets, maps, enums with explicit values, and nullable types are built in, not bolted on.
25+
26+
- **Modularity through imports** – Split your schemas across files, reference types from other schemas, and compose complex models without copy-paste.
27+
28+
- **Rich annotations** – Add multilingual descriptions, alternate names for different serialization formats, scientific units, and currency codes directly in your schema.
29+
30+
## The Core Philosophy
31+
32+
JSON Structure schemas are deterministic. Given a schema, there's exactly one way to interpret it. This might sound obvious, but it's a departure from JSON Schema's flexibility, where the same data might validate differently depending on interpretation.
33+
34+
The type system is designed to be **generative** – you can generate code, database schemas, API documentation, and validation logic from a single source of truth. Your schema isn't just a validation artifact; it's the canonical definition of your data model.
35+
36+
## What You'll Find on This Blog
37+
38+
This blog exists to go beyond the specification. While the [Core Specification](https://json-structure.github.io/core) provides the normative definition of the language, here we'll explore:
39+
40+
- **Practical applications** – How to model real-world domains with JSON Structure
41+
- **Feature deep dives** – Detailed explanations of specific capabilities like the import system, alternate names, units and currencies, and validation rules
42+
- **SDK guides** – Tips and patterns for using the official SDKs across TypeScript, Python, .NET, Java, Go, Rust, Ruby, Perl, PHP, Swift, and C
43+
- **Integration patterns** – How JSON Structure fits with databases, message queues, API frameworks, and code generation pipelines
44+
- **Migration guides** – Moving from JSON Schema or other formats to JSON Structure
45+
46+
## Getting Started
47+
48+
If you're new to JSON Structure, start with the [Primer](/json-structure-primer.html) for a high-level overview, then dive into the [Core Specification](https://json-structure.github.io/core) when you're ready for the details.
49+
50+
The official SDKs are available for all major languages – check the [homepage](/) for installation instructions. Each SDK provides schema validation and instance validation, with consistent behavior across platforms.
51+
52+
We're excited to have you here. JSON Structure is designed to make data definition cleaner, more precise, and more useful across your entire stack. We hope you find it as practical as we do.
53+
54+
Stay tuned for more posts exploring specific features and real-world applications.

assets/css/style.scss

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,138 @@ body {
137137
margin-bottom: 10px;
138138
}
139139

140+
/* Blog styles */
141+
.blog-list {
142+
margin-top: 30px;
143+
}
144+
145+
.blog-entry {
146+
margin-bottom: 40px;
147+
padding-bottom: 30px;
148+
border-bottom: 1px solid #e0e0e0;
149+
}
150+
151+
.blog-entry:last-child {
152+
border-bottom: none;
153+
}
154+
155+
.blog-entry h2 {
156+
margin-bottom: 5px;
157+
font-size: 1.5em;
158+
}
159+
160+
.blog-entry h2 a {
161+
color: #333;
162+
text-decoration: none;
163+
}
164+
165+
.blog-entry h2 a:hover {
166+
color: #4078c0;
167+
}
168+
169+
.post-meta {
170+
color: #666;
171+
font-size: 14px;
172+
margin-bottom: 10px;
173+
}
174+
175+
.post-excerpt {
176+
color: #555;
177+
line-height: 1.6;
178+
}
179+
180+
.rss-link {
181+
margin-top: 30px;
182+
padding-top: 20px;
183+
border-top: 1px solid #e0e0e0;
184+
}
185+
186+
.rss-link a {
187+
color: #4078c0;
188+
}
189+
190+
/* Blog post page styles */
191+
.blog-post .post-header {
192+
margin-bottom: 30px;
193+
padding-bottom: 20px;
194+
border-bottom: 1px solid #e0e0e0;
195+
}
196+
197+
.blog-post .post-title {
198+
font-size: 2em;
199+
margin-bottom: 10px;
200+
color: #333;
201+
}
202+
203+
.blog-post .post-content {
204+
line-height: 1.7;
205+
}
206+
207+
.blog-post .post-content h2 {
208+
margin-top: 30px;
209+
margin-bottom: 15px;
210+
color: #333;
211+
}
212+
213+
.blog-post .post-content p {
214+
margin-bottom: 15px;
215+
}
216+
217+
.blog-post .post-content ul,
218+
.blog-post .post-content ol {
219+
margin-bottom: 15px;
220+
padding-left: 25px;
221+
}
222+
223+
.blog-post .post-content li {
224+
margin-bottom: 8px;
225+
line-height: 1.6;
226+
}
227+
228+
.blog-post .post-content code {
229+
background: #f6f8fa;
230+
padding: 2px 5px;
231+
border-radius: 3px;
232+
font-size: 90%;
233+
}
234+
235+
.blog-post .post-content pre {
236+
background: #f6f8fa;
237+
border: 1px solid #ddd;
238+
border-radius: 3px;
239+
padding: 15px;
240+
overflow-x: auto;
241+
margin-bottom: 15px;
242+
}
243+
244+
.blog-post .post-content pre code {
245+
padding: 0;
246+
background: transparent;
247+
}
248+
249+
.blog-post .post-content blockquote {
250+
border-left: 4px solid #4078c0;
251+
margin: 20px 0;
252+
padding: 10px 20px;
253+
background: #f9f9f9;
254+
color: #555;
255+
}
256+
257+
.post-navigation {
258+
margin-top: 40px;
259+
padding-top: 20px;
260+
border-top: 1px solid #e0e0e0;
261+
}
262+
263+
.post-navigation a {
264+
color: #4078c0;
265+
text-decoration: none;
266+
}
267+
268+
.post-navigation a:hover {
269+
text-decoration: underline;
270+
}
271+
140272
/* Responsive adjustments - Tablet */
141273
@media screen and (max-width: 960px) {
142274
.wrapper {

blog/index.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
---
2+
layout: default
3+
title: Blog | JSON Structure
4+
permalink: /blog/
5+
---
6+
7+
# JSON Structure Blog
8+
9+
Welcome to the JSON Structure blog. Here we explore practical applications, dive deeper into features, and share insights about using JSON Structure effectively.
10+
11+
<div class="blog-list">
12+
{% for post in site.posts %}
13+
<article class="blog-entry">
14+
<h2><a href="{{ post.url | relative_url }}">{{ post.title }}</a></h2>
15+
<p class="post-meta">
16+
<time datetime="{{ post.date | date_to_xmlschema }}">{{ post.date | date: "%B %d, %Y" }}</time>
17+
{% if post.author %} • {{ post.author }}{% endif %}
18+
</p>
19+
{% if post.excerpt %}
20+
<p class="post-excerpt">{{ post.excerpt | strip_html | truncatewords: 50 }}</p>
21+
{% endif %}
22+
<p><a href="{{ post.url | relative_url }}">Read more →</a></p>
23+
</article>
24+
{% endfor %}
25+
</div>
26+
27+
<p class="rss-link">
28+
<a href="{{ "/rss.xml" | relative_url }}">Subscribe via RSS</a>
29+
</p>

rss.xml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
---
2+
layout: null
3+
---
4+
<?xml version="1.0" encoding="UTF-8"?>
5+
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
6+
<channel>
7+
<title>{{ site.title }} Blog</title>
8+
<description>{{ site.description }}</description>
9+
<link>{{ site.url }}{{ site.baseurl }}/blog/</link>
10+
<atom:link href="{{ "/rss.xml" | absolute_url }}" rel="self" type="application/rss+xml"/>
11+
<pubDate>{{ site.time | date_to_rfc822 }}</pubDate>
12+
<lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate>
13+
{% for post in site.posts limit:20 %}
14+
<item>
15+
<title>{{ post.title | xml_escape }}</title>
16+
<description>{{ post.content | xml_escape }}</description>
17+
<pubDate>{{ post.date | date_to_rfc822 }}</pubDate>
18+
<link>{{ post.url | absolute_url }}</link>
19+
<guid isPermaLink="true">{{ post.url | absolute_url }}</guid>
20+
{% if post.author %}
21+
<author>{{ post.author }}</author>
22+
{% endif %}
23+
</item>
24+
{% endfor %}
25+
</channel>
26+
</rss>

0 commit comments

Comments
 (0)