open source is social v-it.org
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

replace app.bsky.feed.like with custom org.v-it.vouch lexicon

- add lexicons/org/v-it/vouch.json with subject, createdAt, ref, beacon fields
- add VOUCH_COLLECTION constant to src/lib/constants.js
- rewrite vouch.js to create org.v-it.vouch records via putRecord with TID key
- update vouched.jsonl schema: vouchUri replaces likeUri, add beacon field
- update ARCHITECTURE.md: record types table, reused section, directory layout, future work
- update VOCAB.md and README.md: remove like-based vouch references

+62 -17
+1 -1
README.md
··· 36 36 - **follow** — subscribe to ATProto handles for cap discovery 37 37 - **skim** — read caps from followed agents and the beacon repo 38 38 - **vet** — run local evaluation on a cap in a sandbox environment 39 - - **vouch** — publicly endorse a vetted cap by liking it 39 + - **vouch** — publicly endorse a vetted cap 40 40 - **remix** — derive a vetted cap into the local codebase and create an implementation plan 41 41 - **ship** — publish a new cap to your feed (or a recap when sourced from a remix) 42 42
+6 -7
docs/ARCHITECTURE.md
··· 7 7 | record type | NSID | custom? | key | purpose | 8 8 |---|---|---|---|---| 9 9 | cap | `org.v-it.cap` | yes | `tid` | structured change description | 10 - | like | `app.bsky.feed.like` | no (reused) | `tid` | endorse a cap | 10 + | vouch | `org.v-it.vouch` | yes | `tid` | endorse a cap | 11 11 | follow | `app.bsky.graph.follow` | no (reused) | `tid` | subscribe to a handle | 12 12 13 13 ### why caps use a custom NSID ··· 19 19 - vit tooling can query caps independently without filtering out posts. 20 20 - the cap schema can evolve independently of `app.bsky.feed.post`. 21 21 22 - ### why likes and follows are reused 22 + ### why follows are reused 23 23 24 - `app.bsky.feed.like` and `app.bsky.graph.follow` are generic enough to use as-is: 24 + `app.bsky.graph.follow` is generic enough to use as-is: 25 25 26 - - a like's `subject` is a `strongRef` (URI + CID) — it works for any record, including caps. 27 26 - a follow's `subject` is a DID — it works regardless of what record types the followed account publishes. 28 - - reusing official lexicons means likes and follows are visible in Bluesky clients, which is acceptable and useful for cross-network discoverability. 27 + - reusing the official follow lexicon means follows are visible in Bluesky clients, which is useful for cross-network discoverability. 29 28 30 29 ## cap lexicon 31 30 ··· 62 61 lexicons/ 63 62 org/ 64 63 v-it/ 65 - cap.json # org.v-it.cap 64 + cap.json # org.v-it.cap 65 + vouch.json # org.v-it.vouch 66 66 ``` 67 67 68 68 this mirrors the convention used in the ATProto repository. 69 69 70 70 ## future work 71 71 72 - - custom lexicons for vouch (`org.v-it.vouch`) and other vit interaction record types. 73 72 - provenance tracking across vet, remix, vouch, and ship lineage. 74 73 - runtime lexicon validation (currently `validate: false` in CLI write commands).
+1 -1
docs/VOCAB.md
··· 171 171 172 172 ### vouch 173 173 174 - publicly endorse a vetted cap by liking it. 174 + publicly endorse a vetted cap. 175 175 176 176 ```bash 177 177 vit vouch <cap-ref>
+38
lexicons/org/v-it/vouch.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.v-it.vouch", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "Record endorsing a vit cap.", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "required": ["subject", "createdAt", "ref", "beacon"], 12 + "properties": { 13 + "subject": { 14 + "type": "ref", 15 + "ref": "lex:com.atproto.repo.strongRef", 16 + "description": "The cap being endorsed." 17 + }, 18 + "ref": { 19 + "type": "string", 20 + "maxLength": 128, 21 + "maxGraphemes": 64, 22 + "description": "Three lowercase words separated by dashes, e.g. fast-cache-invalidation" 23 + }, 24 + "beacon": { 25 + "type": "string", 26 + "maxLength": 512, 27 + "description": "Beacon URI scoping this vouch to a project." 28 + }, 29 + "createdAt": { 30 + "type": "string", 31 + "format": "datetime", 32 + "description": "Client-declared timestamp when this vouch was created." 33 + } 34 + } 35 + } 36 + } 37 + } 38 + }
+15 -8
src/cmd/vouch.js
··· 2 2 // Copyright (c) 2026 sol pbc 3 3 4 4 import { requireDid } from '../lib/config.js'; 5 - import { CAP_COLLECTION } from '../lib/constants.js'; 5 + import { CAP_COLLECTION, VOUCH_COLLECTION } from '../lib/constants.js'; 6 + import { TID } from '@atproto/common-web'; 6 7 import { restoreAgent } from '../lib/oauth.js'; 7 8 import { appendLog, readProjectConfig, readFollowing, readLog } from '../lib/vit-dir.js'; 8 9 import { resolveRef, REF_PATTERN } from '../lib/cap-ref.js'; ··· 90 91 } 91 92 92 93 const now = new Date().toISOString(); 93 - const likeRecord = { 94 - $type: 'app.bsky.feed.like', 94 + const vouchRecord = { 95 + $type: VOUCH_COLLECTION, 95 96 subject: { 96 97 uri: match.uri, 97 98 cid: match.cid, 98 99 }, 99 100 createdAt: now, 101 + ref, 102 + beacon, 100 103 }; 101 - if (verbose) console.log(`[verbose] creating like for ${match.uri}`); 102 - const res = await agent.com.atproto.repo.createRecord({ 104 + if (verbose) console.log(`[verbose] creating vouch for ${match.uri}`); 105 + const rkey = TID.nextStr(); 106 + const res = await agent.com.atproto.repo.putRecord({ 103 107 repo: did, 104 - collection: 'app.bsky.feed.like', 105 - record: likeRecord, 108 + collection: VOUCH_COLLECTION, 109 + rkey, 110 + record: vouchRecord, 111 + validate: false, 106 112 }); 107 113 108 114 try { ··· 110 116 ref, 111 117 uri: match.uri, 112 118 cid: match.cid, 113 - likeUri: res.data.uri, 119 + vouchUri: res.data.uri, 120 + beacon, 114 121 ts: now, 115 122 }); 116 123 } catch (logErr) {
+1
src/lib/constants.js
··· 2 2 // Copyright (c) 2026 sol pbc 3 3 4 4 export const CAP_COLLECTION = 'org.v-it.cap'; 5 + export const VOUCH_COLLECTION = 'org.v-it.vouch';