diff --git a/public/logos/calconnect-logo.svg b/public/logos/calconnect-logo.svg
new file mode 100644
index 0000000..2a84e1d
--- /dev/null
+++ b/public/logos/calconnect-logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/content/about/index.md b/src/content/about/index.md
index 85def15..fd43d98 100644
--- a/src/content/about/index.md
+++ b/src/content/about/index.md
@@ -22,7 +22,7 @@ There was no universal way to:
**PubID was born** from a conviction that the meaning of an identifier should be separate from any single representation of it. We needed a metaschema — a shared grammar — that could capture the full semantic depth of any publication identifier and express it in whatever form the situation demands.
-Since then, PubID has grown to cover **37+ publishers** across international, regional, national, and industry standards, with a Ruby reference implementation that parses, renders, and interchanges identifiers with round-trip fidelity.
+Since then, PubID has grown to cover **38+ publishers** across international, regional, national, and industry standards, with a Ruby reference implementation that parses, renders, and interchanges identifiers with round-trip fidelity.
## The Metaschema
@@ -72,7 +72,7 @@ This pattern extends across all supported publishers: every PubID can render as
| Component | Description |
|-----------|-------------|
| **Metaschema** | Formal definition of identifier elements and their relationships |
-| **Publisher Schemas** | 37+ publisher-specific schema definitions |
+| **Publisher Schemas** | 38+ publisher-specific schema definitions |
| **Reference Library** | Ruby gem implementing all schemas with parse/render/URN support |
| **This Website** | Documentation, interactive playground, and schema registry |
diff --git a/src/content/library/index.md b/src/content/library/index.md
index 43e4ae1..ea2e1c5 100644
--- a/src/content/library/index.md
+++ b/src/content/library/index.md
@@ -38,7 +38,7 @@ gem install pubid
- **Generate URNs** for machine interchange
- **Serialize** to JSON, YAML, or Hash
- **Validate** identifier syntax
-- **37+ publisher schemes** supported out of the box
+- **38+ publisher schemes** supported out of the box
## Quick Example
diff --git a/src/data/__tests__/flavors.spec.ts b/src/data/__tests__/flavors.spec.ts
index 5947371..8cb1c37 100644
--- a/src/data/__tests__/flavors.spec.ts
+++ b/src/data/__tests__/flavors.spec.ts
@@ -188,6 +188,13 @@ describe('specific flavor invariants', () => {
expect(keys).toEqual(['rfc', 'bcp', 'std', 'fyi', 'internet_draft'])
})
+ it('CalConnect has the Standard doc type', () => {
+ const cc = publishers.find(p => p.flavor === 'calconnect')
+ expect(cc).toBeDefined()
+ expect(cc?.docTypes).toHaveLength(1)
+ expect(cc?.docTypes[0]?.key).toBe('standard')
+ })
+
it('PDF Association is not a flavor (not in pubid gem)', () => {
const pdf = publishers.find(p => p.flavor === 'pdf' || p.flavor === 'pdf_association')
expect(pdf).toBeUndefined()
diff --git a/src/data/__tests__/registry.spec.ts b/src/data/__tests__/registry.spec.ts
index 64a52d0..163d375 100644
--- a/src/data/__tests__/registry.spec.ts
+++ b/src/data/__tests__/registry.spec.ts
@@ -8,8 +8,8 @@ import type { Publisher, Category } from '~/data/types'
describe('registry', () => {
it('contains exactly the expected publisher count', () => {
- // 37 = 35 (prior baseline) + ECMA + IETF (added 2026-07-15)
- expect(publishers).toHaveLength(37)
+ // 38 = 37 (post-Astro-cutover baseline on main) + CalConnect (added 2026-07-16)
+ expect(publishers).toHaveLength(38)
})
it('publishers are sorted alphabetically by flavor', () => {
diff --git a/src/data/flavors/calconnect.ts b/src/data/flavors/calconnect.ts
new file mode 100644
index 0000000..453016b
--- /dev/null
+++ b/src/data/flavors/calconnect.ts
@@ -0,0 +1,43 @@
+import type { Publisher } from '../types'
+
+export const calconnect: Publisher = {
+ flavor: "calconnect",
+ logo: "/logos/calconnect-logo.svg",
+ name: "CalConnect",
+ fullName: "The Calendaring and Scheduling Consortium",
+ category: "industry",
+ description: "CalConnect (The Calendaring and Scheduling Consortium) is a nonprofit organization founded in 2004 that develops open standards for calendaring and scheduling. CalConnect brings together vendors, developers, and users of calendar systems to coordinate interoperability of iCalendar (RFC 5545/7986), CalDAV, and related calendaring technologies. CalConnect standards address gaps in the iCalendar ecosystem: calendaring event metadata, scheduling protocols, time-zone handling, and event publishing. Member organizations include major technology vendors, universities, and government agencies.",
+ website: "https://www.calconnect.org",
+ syntaxNotes: "CalConnect identifiers follow the shape: CC[/] :. The publisher token is always 'CC'. An optional series letter or token follows after a slash (A, WD, DIR, …). The number is a plain string (preserves leading zeros and sub-part separators like '0812-1' or '0707.1'). The date segment uses the ISO-style year format with optional month and day for full-date forms (e.g. 'CC/WD 51017:2024-07-23').",
+ urnPattern: "urn:cc:[series]:[number]:[year]",
+ relatedFlavors: ["ietf", "iso"],
+ docTypes: [
+ {
+ key: "standard",
+ title: "CalConnect Standard (CC)",
+ abbr: ["CC"],
+ description: "CalConnect Standards — the normative specifications published by CalConnect. Numbered with a 4-digit sequence (preserves leading zeros, e.g. CC 18011:2018). An optional series letter (A, WD for Working Draft, DIR for Directives) can prefix the number after a slash. Full-date forms occur for working drafts (e.g. CC/WD 51017:2024-07-23).",
+ examples: [
+ { input: "CC 18011:2018" },
+ { input: "CC/DIR 10006:2019" },
+ { input: "CC/WD 51017:2024-07-23" },
+ { input: "CC 0514:2017" },
+ { input: "CC 0812-1:2019" },
+ ],
+ },
+ ],
+ components: [
+ { name: "Publisher", description: "CC — the canonical publisher token", example: "CC" },
+ { name: "Series", description: "Optional series letter or token (A, WD, DIR, etc.) appearing after the publisher, separated by slash", attribute: "series", example: "WD" },
+ { name: "Number", description: "Document number, kept as a string to preserve leading zeros and sub-part separators (0514, 0812-1, 0707.1)", attribute: "number", example: "51017" },
+ { name: "Date", description: "Publication date: always year; month/day present only for full-date forms (2024-07-23)", attribute: "date", example: "2024" },
+ ],
+ algebra: [
+ { type: "Standard", description: "Basic CalConnect Standard without series", syntax: "CC :", example: "CC 18011:2018" },
+ { type: "With Series", description: "Series prefix after the publisher, separated by slash", syntax: "CC/:", example: "CC/DIR 10006:2019" },
+ { type: "Full Date", description: "Full-date form for working drafts", syntax: "CC/:--", example: "CC/WD 51017:2024-07-23" },
+ { type: "Without Publisher", description: "Bare series+number form (no 'CC' prefix)", syntax: "[ ]:", example: "DIR 10006:2019" },
+ ],
+}
+
+export default calconnect