From
bafyreih5fzu4anpxsn3i2o2jia6q42vlpakd6enuutrg4ix3r6szsdxnhq
indexed 2026-11-04 16:37 UTC
View this version
To
bafyreicfbywmroxljvo4wfozq5v3ljohebicqwonttzvjg74lxybimsn7m
indexed 2026-11-04 23:46 UTC
View this version
Compatibility
backward compatible Backward compatible. 2 non-breaking changes.
Non-breaking changes (2)
- AddedVertex AddedVertex { vertex_id: "ink.resenha.defs#bookRef.cover" }
- AddedEdge AddedEdge { src: "ink.resenha.defs#bookRef", tgt: "ink.resenha.defs#bookRef.cover", kind: "prop", name: Some("cover") }
Migration guidance
Added
AddedVertex { vertex_id: "ink.resenha.defs#bookRef.cover" }
Notes
- Non-breaking: AddedEdge { src: "ink.resenha.defs#bookRef", tgt: "ink.resenha.defs#bookRef.cover", kind: "prop", name: Some("cover") }
Changes
11
{22
"$type": "com.atproto.lexicon.schema",33
"defs": {44
"bookIdentifiers": {55
"description": "A book's numbers in every catalogue that has it. Any one of them finds the book; together they tie the catalogues to each other.",66
"properties": {77
"asin": {88
"description": "Amazon's, as Popfeed keeps it.",99
"maxLength": 16,1010
"type": "string"1111
},1212
"goodreadsId": {1313
"maxLength": 32,1414
"type": "string"1515
},1616
"hiveId": {1717
"description": "BookHive's ID for the edition.",1818
"maxLength": 64,1919
"type": "string"2020
},2121
"isbn10": {2222
"maxLength": 10,2323
"type": "string"2424
},2525
"isbn13": {2626
"maxLength": 13,2727
"type": "string"2828
},2929
"openLibraryEdition": {3030
"description": "Open Library's edition key, such as /books/OL62590811M.",3131
"maxLength": 32,3232
"type": "string"3333
},3434
"openLibraryWork": {3535
"description": "Open Library's work key, such as /works/OL45908582W: the book across its editions.",3636
"maxLength": 32,3737
"type": "string"3838
}3939
},4040
"type": "object"4141
},4242
"bookRef": {4343
"description": "Which book a record is about, in every key anyone uses, so an app finds it with the one it has: by BookHive ID, ISBN, Open Library work, or the reader's own record in another app. Resenha's records carry it beside their own keys. Nothing is required but the title, so a book no catalogue knows can still be named.",4444
"properties": {4545
"authors": {4646
"description": "Tab-separated, as BookHive stores them.",4747
"maxLength": 1024,4848
"type": "string"4949
},50
"cover": {51
"description": "A cover the writer's app showed for the book, downloaded and found to be a real cover rather than a catalogue's stand-in picture. Resenha's server keeps it as a fallback for the book's cover, after the catalogue's and Open Library's.",52
"format": "uri",53
"maxLength": 1000,54
"type": "string"55
},5056
"identifiers": {5157
"ref": "#bookIdentifiers",5258
"type": "ref"5359
},5460
"records": {5561
"description": "The reader's own records for the book in any app: their buzz.bookhive.book, their social.popfeed.feed.listItem records, a record in an app to come.",5662
"items": {5763
"format": "at-uri",5864
"type": "string"5965
},6066
"maxLength": 20,6167
"type": "array"6268
},6369
"title": {6470
"maxLength": 512,6571
"type": "string"6672
}6773
},6874
"required": [6975
"title"7076
],7177
"type": "object"7278
},7379
"bookView": {7480
"description": "Enough of a book to show a row. Cover and details come from BookHive's catalogue when the server has them; otherwise the app asks BookHive itself.",7581
"properties": {7682
"authors": {7783
"description": "Authors as BookHive stores them, tab-separated.",7884
"maxLength": 1024,7985
"type": "string"8086
},8187
"cover": {8288
"description": "For a Popfeed book, Popfeed's own cover, its surest address.",8389
"format": "uri",8490
"type": "string"8591
},8692
"covers": {8793
"description": "For a Popfeed book, every address of its cover, surest first, when there is more than one: the poster blob's address on Bluesky's CDN, isbndb's, then the item's posterUrl. A reader tries the next when one fails.",8894
"items": {8995
"format": "uri",9096
"type": "string"9197
},9298
"maxLength": 8,9399
"type": "array"94100
},95101
"genres": {96102
"items": {97103
"maxLength": 64,98104
"type": "string"99105
},100106
"maxLength": 32,101107
"type": "array"102108
},103109
"hiveId": {104110
"description": "The book's BookHive ID, or, for a Popfeed book BookHive's catalogue doesn't know, a stand-in beginning with popfeed- that no BookHive call takes.",105111
"maxLength": 64,106112
"type": "string"107113
},108114
"isbn13": {109115
"description": "The edition the reader's record names, when it names one. For a book BookHive's catalogue doesn't know, the key of the page its readers share (ink.resenha.book.getBook).",110116
"maxLength": 13,111117
"type": "string"112118
},113119
"pages": {114120
"minimum": 1,115121
"type": "integer"116122
},117123
"title": {118124
"maxLength": 512,119125
"type": "string"120126
},121127
"year": {122128
"description": "Year of publication, from BookHive's catalogue.",123129
"type": "integer"124130
}125131
},126132
"required": [127133
"hiveId"128134
],129135
"type": "object"130136
},131137
"commentView": {132138
"description": "A comment in the thread about a reader reading a book.",133139
"properties": {134140
"author": {135141
"format": "did",136142
"type": "string"137143
},138144
"cid": {139145
"format": "cid",140146
"type": "string"141147
},142148
"createdAt": {143149
"format": "datetime",144150
"type": "string"145151
},146152
"parent": {147153
"description": "The comment this one answers; absent at the top.",148154
"format": "at-uri",149155
"type": "string"150156
},151157
"removed": {152158
"description": "Removed by Resenha's maintainer but kept in place because replies hang from it: no words, no author.",153159
"type": "boolean"154160
},155161
"root": {156162
"format": "at-uri",157163
"type": "string"158164
},159165
"source": {160166
"description": "A Resenha comment, or a BookHive buzz, which is read here but answered on BookHive.",161167
"knownValues": [162168
"resenha",163169
"bookhive"164170
],165171
"type": "string"166172
},167173
"text": {168174
"maxGraphemes": 1000,169175
"maxLength": 10000,170176
"type": "string"171177
},172178
"uri": {173179
"format": "at-uri",174180
"type": "string"175181
}176182
},177183
"required": [178184
"uri",179185
"author",180186
"text",181187
"createdAt",182188
"source"183189
],184190
"type": "object"185191
},186192
"event": {187193
"description": "Something a reader did with a book.",188194
"properties": {189195
"actor": {190196
"format": "did",191197
"type": "string"192198
},193199
"book": {194200
"ref": "#bookView",195201
"type": "ref"196202
},197203
"cid": {198204
"description": "The record's version as the server last saw it, for a like or comment to name.",199205
"format": "cid",200206
"type": "string"201207
},202208
"commentCount": {203209
"description": "Comments in the event's home: the thread about the reader reading this book (Resenha comments and BookHive buzzes) for a reading or a review kept on BookHive, Popfeed's comments and replies on a Popfeed review, replies to the post of a review published from Resenha.",204210
"minimum": 0,205211
"type": "integer"206212
},207213
"date": {208214
"format": "datetime",209215
"type": "string"210216
},211217
"excerpt": {212218
"description": "The start of the review, plain text.",213219
"maxGraphemes": 300,214220
"maxLength": 3000,215221
"type": "string"216222
},217223
"kind": {218224
"description": "What they did. wantsToRead and abandoned are dated by when the server saw the status change, else by when the book was added; progress by the record.",219225
"knownValues": [220226
"started",221227
"finished",222228
"reviewed",223229
"wantsToRead",224230
"abandoned",225231
"progress"226232
],227233
"type": "string"228234
},229235
"likeCount": {230236
"description": "Likes in the event's home: Resenha likes on the reader's book record for a reading or a review kept on BookHive, Popfeed likes on a Popfeed review, Bluesky likes on the post that announced a review published from Resenha.",231237
"minimum": 0,232238
"type": "integer"233239
},234240
"popfeedReview": {235241
"description": "For a reviewed event from Popfeed: the social.popfeed.feed.review record, whose comments and likes are Popfeed's.",236242
"format": "at-uri",237243
"type": "string"238244
},239245
"post": {240246
"description": "For a reviewed event with source resenha: the Bluesky post that announced the review, whose likes and replies are the review's.",241247
"ref": "com.atproto.repo.strongRef",242248
"type": "ref"243249
},244250
"progress": {245251
"ref": "#progressView",246252
"type": "ref"247253
},248254
"review": {249255
"description": "The whole review, plain markdown, on reviewed events and on finished ones that carry the review.",250256
"maxGraphemes": 100000,251257
"maxLength": 1000000,252258
"type": "string"253259
},254260
"source": {255261
"knownValues": [256262
"bookhive",257263
"popfeed",258264
"resenha"259265
],260266
"type": "string"261267
},262268
"stars": {263269
"description": "In half stars, 1 to 10, as BookHive keeps them.",264270
"maximum": 10,265271
"minimum": 1,266272
"type": "integer"267273
},268274
"uri": {269275
"description": "The record it comes from: the reader's BookHive book record, or their Popfeed list item (or review, for a book reviewed but on no list).",270276
"format": "at-uri",271277
"type": "string"272278
},273279
"viewer": {274280
"ref": "#viewerState",275281
"type": "ref"276282
}277283
},278284
"required": [279285
"uri",280286
"kind",281287
"actor",282288
"book",283289
"date",284290
"source"285291
],286292
"type": "object"287293
},288294
"followerView": {289295
"description": "Someone who follows the caller.",290296
"properties": {291297
"books": {292298
"description": "How many books they keep in the index; 0 for someone who isn't a reader.",293299
"minimum": 0,294300
"type": "integer"295301
},296302
"did": {297303
"format": "did",298304
"type": "string"299305
},300306
"followedAt": {301307
"description": "When they followed, when the server heard the follow itself; absent for follows older than its listening.",302308
"format": "datetime",303309
"type": "string"304310
},305311
"follows": {306312
"description": "Whether the caller follows them back.",307313
"type": "boolean"308314
},309315
"readingNow": {310316
"items": {311317
"ref": "#bookView",312318
"type": "ref"313319
},314320
"maxLength": 3,315321
"type": "array"316322
}317323
},318324
"required": [319325
"did"320326
],321327
"type": "object"322328
},323329
"knownFollowers": {324330
"description": "Among the caller's follows, who follows a reader: social proof within Resenha's community, from the follows and followers the server keeps.",325331
"properties": {326332
"count": {327333
"minimum": 0,328334
"type": "integer"329335
},330336
"followers": {331337
"description": "Up to three of them, to name.",332338
"items": {333339
"format": "did",334340
"type": "string"335341
},336342
"maxLength": 3,337343
"type": "array"338344
}339345
},340346
"required": [341347
"count"342348
],343349
"type": "object"344350
},345351
"profileView": {346352
"description": "Someone's name and picture, as Bluesky's AppView last gave them to the server; absent for a reader it hasn't fetched yet, whose name the app then finds itself.",347353
"properties": {348354
"avatar": {349355
"format": "uri",350356
"type": "string"351357
},352358
"did": {353359
"format": "did",354360
"type": "string"355361
},356362
"displayName": {357363
"maxGraphemes": 64,358364
"maxLength": 640,359365
"type": "string"360366
},361367
"handle": {362368
"format": "handle",363369
"type": "string"364370
}365371
},366372
"required": [367373
"did"368374
],369375
"type": "object"370376
},371377
"progressView": {372378
"description": "How far through the book the reader is, as the record says.",373379
"properties": {374380
"currentPage": {375381
"minimum": 1,376382
"type": "integer"377383
},378384
"percent": {379385
"maximum": 100,380386
"minimum": 0,381387
"type": "integer"382388
},383389
"totalPages": {384390
"minimum": 1,385391
"type": "integer"386392
},387393
"updatedAt": {388394
"format": "datetime",389395
"type": "string"390396
}391397
},392398
"required": [393399
"percent",394400
"updatedAt"395401
],396402
"type": "object"397403
},398404
"readerView": {399405
"properties": {400406
"books": {401407
"description": "How many books they keep on BookHive.",402408
"minimum": 0,403409
"type": "integer"404410
},405411
"booksInCommon": {406412
"description": "With the caller, when sorted by similar.",407413
"minimum": 0,408414
"type": "integer"409415
},410416
"did": {411417
"format": "did",412418
"type": "string"413419
},414420
"followedAt": {415421
"description": "When the caller followed them, for the caller's own list.",416422
"format": "datetime",417423
"type": "string"418424
},419425
"followsYou": {420426
"description": "Whether they follow the caller, as the server knows it.",421427
"type": "boolean"422428
},423429
"joinedAt": {424430
"description": "When they started using Resenha.",425431
"format": "datetime",426432
"type": "string"427433
},428434
"lastActivity": {429435
"description": "When they last started, finished, changed or progressed in a book.",430436
"format": "datetime",431437
"type": "string"432438
},433439
"readingNow": {434440
"items": {435441
"ref": "#bookView",436442
"type": "ref"437443
},438444
"maxLength": 3,439445
"type": "array"440446
}441447
},442448
"required": [443449
"did"444450
],445451
"type": "object"446452
},447453
"reportView": {448454
"description": "A reported, or removed, Resenha comment as the maintainers see it.",449455
"properties": {450456
"author": {451457
"format": "did",452458
"type": "string"453459
},454460
"note": {455461
"type": "string"456462
},457463
"reason": {458464
"type": "string"459465
},460466
"removed": {461467
"type": "boolean"462468
},463469
"removedAt": {464470
"format": "datetime",465471
"type": "string"466472
},467473
"reportedAt": {468474
"format": "datetime",469475
"type": "string"470476
},471477
"reporter": {472478
"format": "did",473479
"type": "string"474480
},475481
"resolution": {476482
"knownValues": [477483
"remove",478484
"keep",479485
"removeAndHide",480486
"restore"481487
],482488
"type": "string"483489
},484490
"resolvedAt": {485491
"format": "datetime",486492
"type": "string"487493
},488494
"subject": {489495
"description": "The book record the thread is on.",490496
"format": "at-uri",491497
"type": "string"492498
},493499
"subjectOwner": {494500
"format": "did",495501
"type": "string"496502
},497503
"subjectTitle": {498504
"description": "That book's title, when the index has it.",499505
"type": "string"500506
},501507
"text": {502508
"description": "The comment's words, as the index keeps them.",503509
"type": "string"504510
},505511
"uri": {506512
"description": "The comment.",507513
"format": "at-uri",508514
"type": "string"509515
}510516
},511517
"required": [512518
"uri"513519
],514520
"type": "object"515521
},516522
"reviewView": {517523
"properties": {518524
"author": {519525
"format": "did",520526
"type": "string"521527
},522528
"book": {523529
"ref": "#bookView",524530
"type": "ref"525531
},526532
"createdAt": {527533
"format": "datetime",528534
"type": "string"529535
},530536
"excerpt": {531537
"maxGraphemes": 300,532538
"maxLength": 3000,533539
"type": "string"534540
},535541
"hasSpoilers": {536542
"type": "boolean"537543
},538544
"languages": {539545
"items": {540546
"format": "language",541547
"type": "string"542548
},543549
"maxLength": 8,544550
"type": "array"545551
},546552
"source": {547553
"knownValues": [548554
"bookhive",549555
"popfeed",550556
"resenha"551557
],552558
"type": "string"553559
},554560
"stars": {555561
"maximum": 10,556562
"minimum": 1,557563
"type": "integer"558564
},559565
"text": {560566
"description": "The whole review, when asked for with full.",561567
"maxGraphemes": 100000,562568
"maxLength": 1000000,563569
"type": "string"564570
},565571
"title": {566572
"maxGraphemes": 300,567573
"maxLength": 3000,568574
"type": "string"569575
},570576
"uri": {571577
"description": "The review: a Standard.site document, a Popfeed review, or a BookHive book record with a review.",572578
"format": "at-uri",573579
"type": "string"574580
}575581
},576582
"required": [577583
"uri",578584
"author",579585
"book",580586
"createdAt",581587
"source"582588
],583589
"type": "object"584590
},585591
"starterPackView": {586592
"description": "A starter pack the server keeps in the official account.",587593
"properties": {588594
"description": {589595
"type": "string"590596
},591597
"list": {592598
"description": "The reference list the pack is built on.",593599
"format": "at-uri",594600
"type": "string"595601
},596602
"members": {597603
"items": {598604
"format": "did",599605
"type": "string"600606
},601607
"maxLength": 150,602608
"type": "array"603609
},604610
"name": {605611
"type": "string"606612
},607613
"updatedAt": {608614
"format": "datetime",609615
"type": "string"610616
},611617
"uri": {612618
"format": "at-uri",613619
"type": "string"614620
}615621
},616622
"required": [617623
"uri",618624
"name",619625
"members"620626
],621627
"type": "object"622628
},623629
"suggestionView": {624630
"description": "A reader worth following, for an empty Parlor.",625631
"properties": {626632
"activeDays": {627633
"description": "Days over the last six months on which they started, finished, changed, progressed in or reviewed a book, on any source.",628634
"minimum": 0,629635
"type": "integer"630636
},631637
"books": {632638
"minimum": 0,633639
"type": "integer"634640
},635641
"did": {636642
"format": "did",637643
"type": "string"638644
},639645
"followsYou": {640646
"description": "They follow the caller already.",641647
"type": "boolean"642648
},643649
"knownFollowers": {644650
"ref": "#knownFollowers",645651
"type": "ref"646652
},647653
"languages": {648654
"description": "The languages they said their reviews are in.",649655
"items": {650656
"format": "language",651657
"type": "string"652658
},653659
"type": "array"654660
},655661
"latestReview": {656662
"properties": {657663
"date": {658664
"format": "datetime",659665
"type": "string"660666
},661667
"excerpt": {662668
"maxGraphemes": 200,663669
"type": "string"664670
},665671
"title": {666672
"type": "string"667673
}668674
},669675
"type": "object"670676
},671677
"reviews": {672678
"minimum": 0,673679
"type": "integer"674680
},675681
"source": {676682
"description": "Where they read: Resenha's readers come first, then BookHive's and Popfeed's.",677683
"knownValues": [678684
"resenha",679685
"bookhive",680686
"popfeed"681687
],682688
"type": "string"683689
},684690
"tier": {685691
"maximum": 2,686692
"minimum": 0,687693
"type": "integer"688694
}689695
},690696
"required": [691697
"did",692698
"source"693699
],694700
"type": "object"695701
},696702
"viewerState": {697703
"description": "The caller's own reactions to a book record.",698704
"properties": {699705
"like": {700706
"description": "The caller's like, to take it back.",701707
"format": "at-uri",702708
"type": "string"703709
}704710
},705711
"type": "object"706712
}707713
},708714
"description": "Views shared by the calls Resenha's server answers.",709715
"id": "ink.resenha.defs",710716
"lexicon": 1711717
}