Auto-indexing service and GraphQL API for AT Protocol Records quickslice.slices.network/
atproto gleam graphql

remove /example folder, move docker-compose to root

+25 -361
+25
docker-compose.yml
··· 1 + version: "3.8" 2 + 3 + services: 4 + quickslice: 5 + image: ghcr.io/bigmoves/quickslice:latest 6 + ports: 7 + - "8080:8080" 8 + environment: 9 + - HOST=0.0.0.0 10 + - PORT=8080 11 + - JETSTREAM_URL=wss://jetstream2.us-west.bsky.network/subscribe 12 + # NOTE: Do NOT use in production - generate your own secure key 13 + - SECRET_KEY_BASE=Xdb/9oovpIzYRKPjfTm45QSWYyYJi35GY3n4475SBVmcyxHS9tMoFJcOwPGfA0xW 14 + - ADMIN_DIDS=did:plc:bcgltzqazw5tb6k2g3ttenbj 15 + - JETSTREAM_DISABLE_CURSOR=true 16 + - EXTERNAL_BASE_URL=http://127.0.0.1:8080 17 + # NOTE: Do NOT use in production - generate your own secure key 18 + - OAUTH_SIGNING_KEY=z42tsNCXT8jZHj37qRd1D1vBE4qns8rp43DZsm1uez3cr8h6 19 + - OAUTH_LOOPBACK_MODE=true 20 + - OAUTH_SUPPORTED_SCOPES="atproto repo:xyz.statusphere.status" 21 + - BACKFILL_REPO_TIMEOUT=30 22 + - BACKFILL_MAX_PDS_WORKERS=20 23 + - BACKFILL_PDS_CONCURRENCY=6 24 + - BACKFILL_MAX_HTTP_CONCURRENT=100 25 + restart: on-failure:5
-11
example/docker-compose.yml
··· 1 - version: "3.8" 2 - 3 - services: 4 - quickslice: 5 - image: ghcr.io/bigmoves/quickslice:latest 6 - ports: 7 - - "8080:8080" 8 - environment: 9 - - HOST=0.0.0.0 10 - - PORT=8080 11 - restart: on-failure:5
-34
example/fly.toml
··· 1 - # fly.toml app configuration file generated for quickslice on 2025-10-29T21:49:03-07:00 2 - # 3 - # See https://fly.io/docs/reference/configuration/ for information about how to use this file. 4 - # 5 - 6 - app = 'quickslice' 7 - primary_region = 'sjc' 8 - 9 - [build] 10 - image = 'ghcr.io/bigmoves/quickslice:sha-370076b' 11 - 12 - [env] 13 - HOST = '0.0.0.0' 14 - PORT = '8080' 15 - DATABASE_URL = '/data/quickslice.db' 16 - EXTERNAL_BASE_URL = 'https://quickslice.fly.dev' 17 - ADMIN_DIDS = 'did:plc:bcgltzqazw5tb6k2g3ttenbj' 18 - 19 - [http_service] 20 - internal_port = 8080 21 - force_https = true 22 - auto_stop_machines = 'stop' 23 - auto_start_machines = true 24 - min_machines_running = 1 25 - processes = ['app'] 26 - 27 - [[mounts]] 28 - source = 'app_data' 29 - destination = '/data' 30 - 31 - [[vm]] 32 - memory = '1gb' 33 - cpu_kind = 'shared' 34 - cpus = 1
-3
example/lexicons.json
··· 1 - { 2 - "lexicons": ["app.bsky.actor.profile"] 3 - }
-74
example/lexicons/app/bsky/actor/profile.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "app.bsky.actor.profile", 4 - "defs": { 5 - "main": { 6 - "key": "literal:self", 7 - "type": "record", 8 - "record": { 9 - "type": "object", 10 - "properties": { 11 - "avatar": { 12 - "type": "blob", 13 - "accept": [ 14 - "image/png", 15 - "image/jpeg" 16 - ], 17 - "maxSize": 1000000, 18 - "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 19 - }, 20 - "banner": { 21 - "type": "blob", 22 - "accept": [ 23 - "image/png", 24 - "image/jpeg" 25 - ], 26 - "maxSize": 1000000, 27 - "description": "Larger horizontal image to display behind profile view." 28 - }, 29 - "labels": { 30 - "refs": [ 31 - "com.atproto.label.defs#selfLabels" 32 - ], 33 - "type": "union", 34 - "description": "Self-label values, specific to the Bluesky application, on the overall account." 35 - }, 36 - "website": { 37 - "type": "string", 38 - "format": "uri" 39 - }, 40 - "pronouns": { 41 - "type": "string", 42 - "maxLength": 200, 43 - "description": "Free-form pronouns text.", 44 - "maxGraphemes": 20 45 - }, 46 - "createdAt": { 47 - "type": "string", 48 - "format": "datetime" 49 - }, 50 - "pinnedPost": { 51 - "ref": "com.atproto.repo.strongRef", 52 - "type": "ref" 53 - }, 54 - "description": { 55 - "type": "string", 56 - "maxLength": 2560, 57 - "description": "Free-form profile description text.", 58 - "maxGraphemes": 256 59 - }, 60 - "displayName": { 61 - "type": "string", 62 - "maxLength": 640, 63 - "maxGraphemes": 64 64 - }, 65 - "joinedViaStarterPack": { 66 - "ref": "com.atproto.repo.strongRef", 67 - "type": "ref" 68 - } 69 - } 70 - }, 71 - "description": "A declaration of a Bluesky account profile." 72 - } 73 - } 74 - }
-192
example/lexicons/com/atproto/label/defs.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "com.atproto.label.defs", 4 - "defs": { 5 - "label": { 6 - "type": "object", 7 - "required": [ 8 - "src", 9 - "uri", 10 - "val", 11 - "cts" 12 - ], 13 - "properties": { 14 - "cid": { 15 - "type": "string", 16 - "format": "cid", 17 - "description": "Optionally, CID specifying the specific version of 'uri' resource this label applies to." 18 - }, 19 - "cts": { 20 - "type": "string", 21 - "format": "datetime", 22 - "description": "Timestamp when this label was created." 23 - }, 24 - "exp": { 25 - "type": "string", 26 - "format": "datetime", 27 - "description": "Timestamp at which this label expires (no longer applies)." 28 - }, 29 - "neg": { 30 - "type": "boolean", 31 - "description": "If true, this is a negation label, overwriting a previous label." 32 - }, 33 - "sig": { 34 - "type": "bytes", 35 - "description": "Signature of dag-cbor encoded label." 36 - }, 37 - "src": { 38 - "type": "string", 39 - "format": "did", 40 - "description": "DID of the actor who created this label." 41 - }, 42 - "uri": { 43 - "type": "string", 44 - "format": "uri", 45 - "description": "AT URI of the record, repository (account), or other resource that this label applies to." 46 - }, 47 - "val": { 48 - "type": "string", 49 - "maxLength": 128, 50 - "description": "The short string name of the value or type of this label." 51 - }, 52 - "ver": { 53 - "type": "integer", 54 - "description": "The AT Protocol version of the label object." 55 - } 56 - }, 57 - "description": "Metadata tag on an atproto resource (eg, repo or record)." 58 - }, 59 - "selfLabel": { 60 - "type": "object", 61 - "required": [ 62 - "val" 63 - ], 64 - "properties": { 65 - "val": { 66 - "type": "string", 67 - "maxLength": 128, 68 - "description": "The short string name of the value or type of this label." 69 - } 70 - }, 71 - "description": "Metadata tag on an atproto record, published by the author within the record. Note that schemas should use #selfLabels, not #selfLabel." 72 - }, 73 - "labelValue": { 74 - "type": "string", 75 - "knownValues": [ 76 - "!hide", 77 - "!no-promote", 78 - "!warn", 79 - "!no-unauthenticated", 80 - "dmca-violation", 81 - "doxxing", 82 - "porn", 83 - "sexual", 84 - "nudity", 85 - "nsfl", 86 - "gore" 87 - ] 88 - }, 89 - "selfLabels": { 90 - "type": "object", 91 - "required": [ 92 - "values" 93 - ], 94 - "properties": { 95 - "values": { 96 - "type": "array", 97 - "items": { 98 - "ref": "#selfLabel", 99 - "type": "ref" 100 - }, 101 - "maxLength": 10 102 - } 103 - }, 104 - "description": "Metadata tags on an atproto record, published by the author within the record." 105 - }, 106 - "labelValueDefinition": { 107 - "type": "object", 108 - "required": [ 109 - "identifier", 110 - "severity", 111 - "blurs", 112 - "locales" 113 - ], 114 - "properties": { 115 - "blurs": { 116 - "type": "string", 117 - "description": "What should this label hide in the UI, if applied? 'content' hides all of the target; 'media' hides the images/video/audio; 'none' hides nothing.", 118 - "knownValues": [ 119 - "content", 120 - "media", 121 - "none" 122 - ] 123 - }, 124 - "locales": { 125 - "type": "array", 126 - "items": { 127 - "ref": "#labelValueDefinitionStrings", 128 - "type": "ref" 129 - } 130 - }, 131 - "severity": { 132 - "type": "string", 133 - "description": "How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing.", 134 - "knownValues": [ 135 - "inform", 136 - "alert", 137 - "none" 138 - ] 139 - }, 140 - "adultOnly": { 141 - "type": "boolean", 142 - "description": "Does the user need to have adult content enabled in order to configure this label?" 143 - }, 144 - "identifier": { 145 - "type": "string", 146 - "maxLength": 100, 147 - "description": "The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+).", 148 - "maxGraphemes": 100 149 - }, 150 - "defaultSetting": { 151 - "type": "string", 152 - "default": "warn", 153 - "description": "The default setting for this label.", 154 - "knownValues": [ 155 - "ignore", 156 - "warn", 157 - "hide" 158 - ] 159 - } 160 - }, 161 - "description": "Declares a label value and its expected interpretations and behaviors." 162 - }, 163 - "labelValueDefinitionStrings": { 164 - "type": "object", 165 - "required": [ 166 - "lang", 167 - "name", 168 - "description" 169 - ], 170 - "properties": { 171 - "lang": { 172 - "type": "string", 173 - "format": "language", 174 - "description": "The code of the language these strings are written in." 175 - }, 176 - "name": { 177 - "type": "string", 178 - "maxLength": 640, 179 - "description": "A short human-readable name for the label.", 180 - "maxGraphemes": 64 181 - }, 182 - "description": { 183 - "type": "string", 184 - "maxLength": 100000, 185 - "description": "A longer description of what the label means and why it might be applied.", 186 - "maxGraphemes": 10000 187 - } 188 - }, 189 - "description": "Strings which describe the label in the UI, localized into a specific language." 190 - } 191 - } 192 - }
-24
example/lexicons/com/atproto/repo/strongRef.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "com.atproto.repo.strongRef", 4 - "description": "A URI with a content-hash fingerprint.", 5 - "defs": { 6 - "main": { 7 - "type": "object", 8 - "required": [ 9 - "uri", 10 - "cid" 11 - ], 12 - "properties": { 13 - "cid": { 14 - "type": "string", 15 - "format": "cid" 16 - }, 17 - "uri": { 18 - "type": "string", 19 - "format": "at-uri" 20 - } 21 - } 22 - } 23 - } 24 - }
-23
example/lexicons/xyz/statusphere/status.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "xyz.statusphere.status", 4 - "defs": { 5 - "main": { 6 - "type": "record", 7 - "key": "tid", 8 - "record": { 9 - "type": "object", 10 - "required": ["status", "createdAt"], 11 - "properties": { 12 - "status": { 13 - "type": "string", 14 - "minLength": 1, 15 - "maxGraphemes": 1, 16 - "maxLength": 32 17 - }, 18 - "createdAt": { "type": "string", "format": "datetime" } 19 - } 20 - } 21 - } 22 - } 23 - }