A CLI for publishing standard.site documents to ATProto
sequoia.pub
standard
site
lexicon
cli
publishing
1{
2 "$schema": "http://json-schema.org/draft-07/schema#",
3 "title": "PublisherConfig",
4 "type": "object",
5 "additionalProperties": false,
6 "required": ["siteUrl", "contentDir", "publicationUri"],
7 "properties": {
8 "$schema": {
9 "type": "string",
10 "description": "JSON schema hint"
11 },
12 "siteUrl": {
13 "type": "string",
14 "format": "uri",
15 "description": "Base site URL"
16 },
17 "contentDir": {
18 "type": "string",
19 "description": "Directory containing content"
20 },
21 "imagesDir": {
22 "type": "string",
23 "description": "Directory containing cover images"
24 },
25 "publicDir": {
26 "type": "string",
27 "description": "Static/public folder for `.well-known` files",
28 "default": "public"
29 },
30 "outputDir": {
31 "type": "string",
32 "description": "Built output directory for inject command"
33 },
34 "pathPrefix": {
35 "type": "string",
36 "description": "URL path prefix for posts",
37 "default": "/posts"
38 },
39 "publicationUri": {
40 "type": "string",
41 "description": "Publication URI"
42 },
43 "pdsUrl": {
44 "type": "string",
45 "format": "uri",
46 "description": "Personal data server URL (PDS)",
47 "default": "https://bsky.social"
48 },
49 "identity": {
50 "type": "string",
51 "description": "Which stored identity to use (matches identifier)"
52 },
53 "frontmatter": {
54 "type": "object",
55 "additionalProperties": false,
56 "description": "Custom frontmatter field mappings",
57 "properties": {
58 "title": {
59 "type": "string",
60 "description": "Field name for title",
61 "default": "title"
62 },
63 "description": {
64 "type": "string",
65 "description": "Field name for description",
66 "default": "description"
67 },
68 "publishDate": {
69 "type": "string",
70 "description": "Field name for publish date (checks \"publishDate\", \"pubDate\", \"date\", \"createdAt\", and \"created_at\" by default)",
71 "default": "publishDate"
72 },
73 "updatedAt": {
74 "type": "string",
75 "description": "Field name for updated date (checks \"updatedAt\", \"updated_at\", \"modifiedAt\", and \"modified_at\" by default)",
76 "default": "updatedAt"
77 },
78 "coverImage": {
79 "type": "string",
80 "description": "Field name for cover image",
81 "default": "ogImage"
82 },
83 "tags": {
84 "type": "string",
85 "description": "Field name for tags",
86 "default": "tags"
87 },
88 "draft": {
89 "type": "string",
90 "description": "Field name for draft status",
91 "default": "draft"
92 },
93 "slugField": {
94 "type": "string",
95 "description": "Frontmatter field to use for slug (if set, uses frontmatter value; otherwise uses filepath)"
96 }
97 }
98 },
99 "ignore": {
100 "type": "array",
101 "description": "Glob patterns for files to ignore",
102 "items": {
103 "type": "string"
104 }
105 },
106 "removeIndexFromSlug": {
107 "type": "boolean",
108 "description": "Remove \"/index\" or \"/_index\" suffix from paths",
109 "default": false
110 },
111 "stripDatePrefix": {
112 "type": "boolean",
113 "description": "Remove YYYY-MM-DD- prefix from filenames (Jekyll-style)",
114 "default": false
115 },
116 "pathTemplate": {
117 "type": "string",
118 "description": "URL path template with tokens like {year}/{month}/{day}/{slug} (overrides pathPrefix + slug)"
119 },
120 "textContentField": {
121 "type": "string",
122 "description": "Frontmatter field to use for textContent instead of markdown body"
123 },
124 "publishContent": {
125 "type": "boolean",
126 "description": "Whether or not to publish the documents content on the standard.site document",
127 "default": true
128 },
129 "bluesky": {
130 "type": "object",
131 "additionalProperties": false,
132 "description": "Optional Bluesky posting configuration",
133 "required": ["enabled"],
134 "properties": {
135 "enabled": {
136 "type": "boolean",
137 "description": "Whether Bluesky posting is enabled",
138 "default": false
139 },
140 "maxAgeDays": {
141 "type": "integer",
142 "minimum": 0,
143 "description": "Only post if published within N days",
144 "default": 7
145 }
146 }
147 },
148 "ui": {
149 "type": "object",
150 "additionalProperties": false,
151 "description": "Optional UI components configuration",
152 "properties": {
153 "components": {
154 "type": "string",
155 "description": "Directory to install UI components",
156 "default": "src/components"
157 }
158 },
159 "required": ["components"]
160 }
161 }
162}