page.cavu.book
Schema Diff
+30 -0
Compatibility Analysis
Backward Compatible
Backward compatible. 8 non-breaking changes.
Non-Breaking Changes (8)
- AddedVertex AddedVertex { vertex_id: "page.cavu.book#styling" }
- AddedVertex AddedVertex { vertex_id: "page.cavu.book#styling.pageSize" }
- AddedVertex AddedVertex { vertex_id: "page.cavu.book.allowDownloads" }
- AddedVertex AddedVertex { vertex_id: "page.cavu.book.styling" }
- AddedEdge AddedEdge { src: "page.cavu.book", tgt: "page.cavu.book.allowDownloads", kind: "prop", name: Some("allowDownloads") }
- AddedEdge AddedEdge { src: "page.cavu.book", tgt: "page.cavu.book.styling", kind: "prop", name: Some("styling") }
- AddedEdge AddedEdge { src: "page.cavu.book#styling", tgt: "page.cavu.book#styling.pageSize", kind: "prop", name: Some("pageSize") }
- AddedEdge AddedEdge { src: "page.cavu.book.styling", tgt: "page.cavu.book#styling", kind: "ref", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "page.cavu.book#styling" }AddedVertex { vertex_id: "page.cavu.book#styling.pageSize" }AddedVertex { vertex_id: "page.cavu.book.allowDownloads" }AddedVertex { vertex_id: "page.cavu.book.styling" }
Additional Notes
- Non-breaking: AddedEdge { src: "page.cavu.book", tgt: "page.cavu.book.allowDownloads", kind: "prop", name: Some("allowDownloads") }
- Non-breaking: AddedEdge { src: "page.cavu.book", tgt: "page.cavu.book.styling", kind: "prop", name: Some("styling") }
- Non-breaking: AddedEdge { src: "page.cavu.book#styling", tgt: "page.cavu.book#styling.pageSize", kind: "prop", name: Some("pageSize") }
- Non-breaking: AddedEdge { src: "page.cavu.book.styling", tgt: "page.cavu.book#styling", kind: "ref", name: None }
1
1
{
2
2
"id": "page.cavu.book",
3
3
"defs": {
4
4
"main": {
5
5
"type": "object",
6
6
"required": [
7
7
"spine"
8
8
],
9
9
"properties": {
10
10
"cover": {
11
11
"type": "blob",
12
12
"accept": [
13
13
"image/*"
14
14
],
15
15
"maxSize": 1000000,
16
16
"description": "Book cover, typically portrait orientation. Share the same blob CID with the frontmatter document's coverImage."
17
17
},
18
18
"spine": {
19
19
"type": "array",
20
20
"items": {
21
21
"ref": "#spineEntry",
22
22
"type": "ref"
23
23
},
24
24
"maxLength": 10000,
25
25
"description": "Ordered entries for the site.standard.document records holding the book's content, in reading order. Chunk boundaries are storage artifacts, invisible to the reader; a chunk is usually chapter-sized but not always."
26
26
},
27
27
"series": {
28
28
"ref": "#seriesRef",
29
29
"type": "ref",
30
30
"description": "The series this book belongs to, if any."
31
31
},
32
32
"listing": {
33
33
"type": "string",
34
34
"format": "at-uri",
35
35
"description": "AT-URI of a pub.byline.book record carrying this book's catalog metadata (editions, ISBNs, retailer links, genres). The reading layer stays here; the listing layer stays there."
36
36
},
37
+
"styling": {
38
+
"ref": "#styling",
39
+
"type": "ref",
40
+
"description": "Author presentation preferences for the whole book — the floor of the theme layer. Optional; readers render legibly without it and ignore what they don't understand."
41
+
},
37
42
"coverAlt": {
38
43
"type": "string",
39
44
"maxLength": 5000,
40
45
"description": "Alt text describing the cover image, for accessibility.",
41
46
"maxGraphemes": 1000
42
47
},
43
48
"language": {
44
49
"type": "string",
45
50
"format": "language",
46
51
"description": "Primary language of the book's content."
47
52
},
48
53
"contributors": {
49
54
"type": "array",
50
55
"items": {
51
56
"ref": "pub.byline.defs#contributor",
52
57
"type": "ref"
53
58
},
54
59
"maxLength": 100,
55
60
"description": "Credited contributors (author, translator, editor, illustrator, narrator). Reuses byline.pub's contributor shape: name required, AT Protocol DID optional, so off-protocol collaborators can be credited. The repo owner is presumed primary author unless roles say otherwise."
56
61
},
62
+
"allowDownloads": {
63
+
"type": "boolean",
64
+
"description": "Whether readers may download the whole book as a file (EPUB, PDF) rather than only reading it in place. Absent means false — the author opts in. Readers and appviews that offer exports check this flag before generating one; the records themselves are public regardless, so this is a statement of intent, not access control."
65
+
},
57
66
"pageProgression": {
58
67
"type": "string",
59
68
"description": "Direction pages progress in paginated and two-page-spread views, mirroring EPUB's spine-level page-progression-direction. Absent means ltr; rtl for right-to-left books (manga). Chiefly meaningful for pre-paginated page.cavu.pages content, where it decides which side of a spread comes first and which way pages turn.",
60
69
"knownValues": [
61
70
"ltr",
62
71
"rtl"
63
72
]
64
73
},
65
74
"completionStatus": {
66
75
"type": "string",
67
76
"description": "Whether the book is still being serialized.",
68
77
"knownValues": [
69
78
"ongoing",
70
79
"completed",
71
80
"hiatus"
72
81
]
73
82
}
74
83
},
75
84
"description": "Book extension object, embedded in a site.standard.publication record as a pass-through `book` property (the Leaflet `theme` pattern). Its presence marks the publication as a book; series publications omit it. The publication's standard fields remain the fallback identity (name = title, description = blurb, icon = square mark)."
76
85
},
86
+
"styling": {
87
+
"type": "object",
88
+
"properties": {
89
+
"pageSize": {
90
+
"type": "string",
91
+
"maxLength": 100,
92
+
"description": "Printed page size for paginated exports (PDF) and print stylesheets, as a paper name: ISO a4/a5/b5, North American letter/legal, and the book-trade sizes trade (6×9 in), digest (5.5×8.5 in), and pocket (4.25×6.87 in). Absent means the exporter's default (trade). Screen readers ignore it — on-screen pages are a viewport artifact.",
93
+
"knownValues": [
94
+
"a4",
95
+
"a5",
96
+
"b5",
97
+
"letter",
98
+
"legal",
99
+
"trade",
100
+
"digest",
101
+
"pocket"
102
+
]
103
+
}
104
+
},
105
+
"description": "Presentation preferences the author sets once for the whole book. Readers apply what they understand and ignore the rest."
106
+
},
77
107
"seriesRef": {
78
108
"type": "object",
79
109
"required": [
80
110
"publication"
81
111
],
82
112
"properties": {
83
113
"name": {
84
114
"type": "string",
85
115
"maxLength": 2560,
86
116
"description": "Series name, denormalized for display without fetching the series publication.",
87
117
"maxGraphemes": 256
88
118
},
89
119
"index": {
90
120
"type": "integer",
91
121
"minimum": 0,
92
122
"description": "Position of this book within the series reading order."
93
123
},
94
124
"publication": {
95
125
"type": "string",
96
126
"format": "at-uri",
97
127
"description": "AT-URI of the series' site.standard.publication record."
98
128
}
99
129
}
100
130
},
101
131
"spineEntry": {
102
132
"type": "object",
103
133
"required": [
104
134
"document"
105
135
],
106
136
"properties": {
107
137
"roles": {
108
138
"type": "array",
109
139
"items": {
110
140
"type": "string",
111
141
"maxLength": 1000,
112
142
"knownValues": [
113
143
"cover",
114
144
"frontmatter",
115
145
"toc",
116
146
"bodymatter",
117
147
"backmatter",
118
148
"acknowledgments",
119
149
"appendix",
120
150
"index",
121
151
"glossary",
122
152
"notes",
123
153
"colophon"
124
154
],
125
155
"maxGraphemes": 100
126
156
},
127
157
"maxLength": 10,
128
158
"description": "Structural roles of this chunk, inspired by the EPUB structural semantics vocabulary. Readers use these to find special documents without fetching them — notably `toc`, which marks the document containing the page.cavu.blocks.toc block (the role EPUB's properties=\"nav\" manifest flag plays). Untagged entries are ordinary body matter."
129
159
},
130
160
"linear": {
131
161
"type": "boolean",
132
162
"description": "Whether this entry is part of the primary continuous reading flow; absent means true, mirroring EPUB's itemref linear attribute. False for supplementary material (appendices, indexes, notes) that should be reachable from the TOC but skipped when paginating straight through."
133
163
},
134
164
"document": {
135
165
"type": "string",
136
166
"format": "at-uri",
137
167
"description": "AT-URI of the site.standard.document record holding this chunk's content."
138
168
}
139
169
}
140
170
}
141
171
},
142
172
"$type": "com.atproto.lexicon.schema",
143
173
"lexicon": 1
144
174
}