ai/at
ai/at
1
0
This commit is contained in:
syui 2024-10-18 22:49:50 +09:00
parent bce11adb82
commit c85771f2cc
Signed by: syui
GPG Key ID: 5417CFEBAD92DF56
20 changed files with 505 additions and 0 deletions

108
README.md
View File

@ -0,0 +1,108 @@
# atproto(at protocol)
- @
- [at]mosphere
- at://domain
## account
[@ai.syu.is](https://web.syu.is/profile/ai.syu.is)
- https://plc.syu.is/did:plc:6qyecktefllvenje24fcxnie
- https://plc.directory/did:plc:ytvoptig4ddshmwdsjmhtcym
```sh
$ curl -sL syu.is/xrpc/_health
{"version":"0.4.65"}
# latest
# https://github.com/bluesky-social/atproto/blob/main/packages/pds/package.json
$ curl -sL https://raw.githubusercontent.com/bluesky-social/atproto/refs/heads/main/packages/pds/package.json |jq -r .version
```
```sh
$ curl -sL "syu.is/xrpc/com.atproto.repo.describeRepo?repo=ai.syu.is" |jq -r .did
did:plc:6qyecktefllvenje24fcxnie
$ curl -sL "syu.is/xrpc/com.atproto.repo.listRecords?repo=ai.syu.is&collection=app.bsky.feed.post&reverse=true&limit=1"
{"records":[{"uri":"at://did:plc:6qyecktefllvenje24fcxnie/app.bsky.feed.post/3l6s2riuouk2j","cid":"bafyreibjohl7va4upkibw5twaxdd4jg3l6rmfatu4dpjjfd5xkb2ijtlx4","value":{"text":"hello","$type":"app.bsky.feed.post","langs":["ja"],"createdAt":"2024-10-18T13:21:39.809Z"}}],"cursor":"3l6s2riuouk2j"}
```
## feed
> at://did:plc:6qyecktefllvenje24fcxnie/app.bsky.feed.generator/cmd
## link
- https://github.com/bluesky-social/atproto
- https://github.com/itaru2622/bluesky-selfhost-env
- https://github.com/bluesky-social/atproto/discussions/2026
## self-host
currently, bsky and bsync require patches to function properly. additionally, social-app is not displaying avatars. for components that are not working, it's recommended to use [itaru2622/bluesky-selfhost-env](https://github.com/itaru2622/bluesky-selfhost-env). this repository provides an environment for self-hosting bluesky.
- bsky = appview
- ozone = mod
|name|service|patch|
|---|---|---|
|pds|https://github.com/bluesky-social/atproto/blob/main/services/pds/Dockerfile||
|bsky|https://github.com/bluesky-social/atproto/blob/main/services/bsky/Dockerfile|[itaru2622/bluesky-atproto-bsky](https://hub.docker.com/r/itaru2622/bluesky-atproto-bsky)|
|bsync|https://github.com/bluesky-social/atproto/blob/main/services/bsync/Dockerfile||
|ozone|https://github.com/bluesky-social/atproto/blob/main/services/ozone/Dockerfile||
|plc|https://github.com/did-method-plc/did-method-plc/tree/main/packages/server||
|bgs|https://github.com/bluesky-social/indigo/tree/main/cmd/bigsky||
|feed|https://github.com/bluesky-social/feed-generator||
|web|https://github.com/bluesky-social/social-app|[bluesky-selfhost-env](https://github.com/itaru2622/bluesky-selfhost-env/blob/master/patching/160-social-app-disable-hackModifyThumbnailPath.diff)|
```sh
# BSKY_IMG_URI_ENDPOINT, BSKY_BLOB_CACHE_LOC
# avatar link example
1. https://appview.${host}/img/avatar/plain/${did}/${cid}@jpeg
2. https://${host}/xrpc/com.atproto.sync.getBlob?did=${did}&cid=${cid}
```
docker compose will not be published unless you write ports. it is only valid internally. add ports only for what you want to publish.
## api
```sh
# create account
url=https://${pds}/xrpc/com.atproto.server.createAccount
json="{\"email\": \"$email\", \"handle\": \"$handle\", \"password\": \"$password\"}"
curl -X POST -H "Content-Type: application/json" -d $json -sL $url
```
change `src/pds/handle` to use a name of 3 characters or less. also, you cannot create an account with a name of 3 characters or less from social-app (web client). please create it from api.
- [/atproto/packages/pds/src/handle/index.ts](https://github.com/bluesky-social/atproto/blame/d4d5a6edba972c0e9976289bde8bc0b42ff547ca/packages/pds/src/handle/index.ts#L86-L88)
```sh
# invite code
admin_password=xxx
url=https://$host/xrpc/com.atproto.server.createInviteCode
json="{\"useCount\":1}"
curl -X POST -u admin:${admin_password} -H "Content-Type: application/json" -d "$json" -sL $url
```
## oauth
```sh
# https://github.com/bluesky-social/cookbook/tree/main/python-oauth-web-app
$ cd ./repos/cookbook/python-oauth-web-app
$ rye sync
$ rye run python3 -c 'import secrets; print(secrets.token_hex())'|xargs echo FLASK_SECRET_KEY|tr -d ' ' >> .env
$ rye run python3 generate_jwk.py |xargs echo FLASK_CLIENT_SECRET_JWK|tr -d ' ' >> .env
$ cat .env
$ rye run flask run
```
please access `127.0.0.1:5000`. it may not work if you use localhost.
also, oauth doesn't work on localhost. use [ngrok](https://ngrok.com/), [tailscale](https://tailscale.com/).
```sh
$ ngrok http http://localhost:5000
```

30
build.sh Executable file
View File

@ -0,0 +1,30 @@
#!/bin/zsh
d=${0:a:h}
cd $d/repos
t="
https://github.com/bluesky-social/atproto
https://github.com/did-method-plc/did-method-plc
https://github.com/bluesky-social/feed-generator
https://github.com/bluesky-social/social-app
https://github.com/bluesky-social/cookbook
https://github.com/itaru2622/bluesky-selfhost-env
"
t=`echo $t|grep -v '^$'`
n=`echo $t|wc -l`
for ((i=1;i<=$n;i++))
do
tt=`echo $t|awk "NR==$i"`
dd=$d/repos/$tt:t
if [ -d $dd ];then
echo ok
cd $dd
git pull
cd $d/repos
else
git clone $tt
fi
done

166
compose.yaml Normal file
View File

@ -0,0 +1,166 @@
services:
database:
image: postgres:16-alpine
restart: always
env_file:
- ./envs/postgres
volumes:
- ./configs/postgres/init/:/docker-entrypoint-initdb.d/
- ./data/postgres/:/var/lib/postgresql/data/
healthcheck:
test: "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"
interval: 5s
retries: 20
redis:
image: redis:alpine
restart: always
volumes:
- ./data/redis/:/data/
healthcheck:
test: ["CMD", "redis-cli", "ping", "|", "grep", "PONG"]
interval: 1s
timeout: 5s
retries: 5
pds-fix-permission:
image: alpine:latest
volumes:
- ./data/pds/:/data/
command: chown 1000.1000 /data
bsky-fix-permission:
image: alpine:latest
volumes:
- ./data/bsky/:/data/
command: chown 1000.1000 /data
plc:
ports:
- 2582:3000
build:
context: ./repos/did-method-plc/
dockerfile: packages/server/Dockerfile
restart: always
env_file:
- ./envs/plc
depends_on:
database:
condition: service_healthy
pds:
ports:
- 2583:3000
#image: itaru2622/bluesky-atproto-pds
#image: ghcr.io/bluesky-social/pds:latest
build:
context: ./repos/atproto/
dockerfile: services/pds/Dockerfile
restart: always
env_file:
- ./envs/pds
volumes:
- ./data/pds/:/data/
depends_on:
database:
condition: service_healthy
pds-fix-permission:
condition: service_completed_successfully
bgs:
ports:
- 2470:2470
build:
context: ./repos/indigo/
dockerfile: cmd/bigsky/Dockerfile
restart: always
env_file:
- ./envs/bgs
volumes:
- ./data/bgs/:/data/
depends_on:
database:
condition: service_healthy
ozone:
ports:
- 2585:3000
build:
context: ./repos/atproto/
dockerfile: services/ozone/Dockerfile
restart: always
command: node --enable-source-maps api.js
volumes:
- ./data/ozone/:/data/
- ./repos/ozone.js:/app/services/ozone/api.js:ro
env_file:
- ./envs/ozone
healthcheck:
test: "wget -q --spider http://localhost:3000/xrpc/_health"
interval: 5s
retries: 20
depends_on:
database:
condition: service_healthy
ozone-daemon:
build:
context: ./repos/atproto/
dockerfile: services/ozone/Dockerfile
restart: always
command: node --enable-source-maps daemon.js
env_file:
- ./envs/ozone
depends_on:
ozone:
condition: service_healthy
database:
condition: service_healthy
social-app:
ports:
- 8100:8100
#image: itaru2622/bluesky-social-app
build:
context: ./repos/social-app/
dockerfile: Dockerfile
restart: always
env_file:
- ./envs/social-app
command: "/usr/bin/bskyweb serve"
bsky:
ports:
- 2584:2584
image: itaru2622/bluesky-atproto-bsky
#build:
# context: ./repos/atproto/
# dockerfile: services/bsky/Dockerfile
restart: always
env_file:
- ./envs/bsky
user: root
volumes:
- ./data/bsky/:/data/
# - ./repos/bsky.js:/app/services/bsky/api.js:ro
command: node --enable-source-maps api.js
depends_on:
database:
condition: service_healthy
redis:
condition: service_healthy
bsky-fix-permission:
condition: service_completed_successfully
feed:
ports:
- 2586:2586
build:
context: ./repos/feed-generator/
restart: always
env_file:
- ./envs/feed
volumes:
- ./data/feed/:/data/

View File

@ -0,0 +1,35 @@
-- PLC
CREATE DATABASE plc;
GRANT ALL PRIVILEGES ON DATABASE plc TO postgres;
-- BGS
CREATE DATABASE bgs;
CREATE DATABASE carstore;
GRANT ALL PRIVILEGES ON DATABASE bgs TO postgres;
GRANT ALL PRIVILEGES ON DATABASE carstore TO postgres;
-- bsky(AppView)
--CREATE DATABASE appview;
--GRANT ALL PRIVILEGES ON DATABASE appview TO postgres;
CREATE DATABASE bsky;
GRANT ALL PRIVILEGES ON DATABASE bsky TO postgres;
-- ozone(Moderation)
--CREATE DATABASE moderation;
--GRANT ALL PRIVILEGES ON DATABASE moderation TO postgres;
CREATE DATABASE ozone;
GRANT ALL PRIVILEGES ON DATABASE ozone TO postgres;
-- search(palomar)
CREATE DATABASE search;
GRANT ALL PRIVILEGES ON DATABASE search TO postgres;
--CREATE DATABASE palomar;
--GRANT ALL PRIVILEGES ON DATABASE palomar TO postgres;
-- PDS
CREATE DATABASE pds;
GRANT ALL PRIVILEGES ON DATABASE pds TO postgres;
-- BSYNC
CREATE DATABASE bsync;
GRANT ALL PRIVILEGES ON DATABASE bsync TO postgres;

6
envs/bgs Normal file
View File

@ -0,0 +1,6 @@
DATABASE_URL=postgres://postgres:postgres@database/bgs
CARSTORE_DATABASE_URL=postgres://postgres:postgres@database/carstore
DATA_DIR=/data
ATP_PLC_HOST=https://plc.${host}
BGS_ADMIN_KEY

19
envs/bsky Normal file
View File

@ -0,0 +1,19 @@
BSKY_PORT=2584
BSKY_BLOB_CACHE_LOC=/data/
BSKY_BSYNC_HTTP_VERSION=1.1
BSKY_BSYNC_PORT=3002
BSKY_BSYNC_URL=http://bsky:3002
BSKY_COURIER_URL=http://fake-courier.example.invalid/
BSKY_DATAPLANE_HTTP_VERSION=1.1
BSKY_DATAPLANE_PORT=3001
BSKY_DATAPLANE_URLS=http://bsky:3001
BSKY_DB_POSTGRES_URL=postgres://postgres:postgres@database/bsky
BSKY_DID_PLC_URL=https://plc.${host}
BSKY_PUBLIC_URL=https://bsky.${host}
BSKY_REPO_PROVIDER=wss://bgs.${host}
BSKY_SERVER_DID=did:web:bsky.${host}
MOD_SERVICE_DID=did:web:ozone.${host}
#BSKY_IMG_URI_ENDPOINT=https://bsky.${host}/img
BSKY_ADMIN_PASSWORDS
BSKY_SERVICE_SIGNING_KEY

21
envs/ozone Normal file
View File

@ -0,0 +1,21 @@
OZONE_SERVER_DID=did:web:ozone.${host}
OZONE_PUBLIC_URL=https://ozone.${host}
OZONE_ADMIN_HANDLE=${user}.${host}
OZONE_MODERATOR_DIDS=${did}
OZONE_ADMIN_DIDS=${did}
OZONE_DB_POSTGRES_URL=postgres://postgres:postgres@database/ozone
OZONE_DID_PLC_URL=https://plc.${host}
NEXT_PUBLIC_PLC_DIRECTORY_URL=https://plc.${host}
NEXT_PUBLIC_OZONE_SERVICE_DID=did:web:ozone.${host}
NEXT_PUBLIC_SOCIAL_APP_DOMAIN=mod.${host}
NEXT_PUBLIC_SOCIAL_APP_URL=https://mod.${host}
OZONE_APPVIEW_DID=did:web:bsky.${host}
OZONE_APPVIEW_URL=https://bsky.${host}
OZONE_APPVIEW_PUSH_EVENTS=false
OZONE_PDS_DID=did:web:${host}
OZONE_PDS_URL=https://${host}
OZONE_DEV_MODE=true
OZONE_DB_MIGRATE=1
OZONE_ADMIN_PASSWORD
OZONE_SIGNING_KEY_HEX

21
envs/pds Normal file
View File

@ -0,0 +1,21 @@
PDS_HOSTNAME=${host}
PDS_DB_POSTGRES_URL=postgres://postgres:postgres@database/pds
PDS_DATA_DIRECTORY=/data
PDS_BLOBSTORE_DISK_LOCATION=/data/img/static
#PDS_BLOBSTORE_DISK_TMP_LOCATION=/data/img/tmp
PDS_BSKY_APP_VIEW_DID=did:web:bsky.${host}
PDS_BSKY_APP_VIEW_URL=https://bsky.${host}
PDS_CRAWLERS=https://bgs.${host}
PDS_DEV_MODE=true
PDS_DID_PLC_URL=https://plc.${host}
PDS_ENABLE_DID_DOC_WITH_SESSION=true
PDS_INVITE_INTERVAL=604800000
PDS_SERVICE_DID=did:web:${host}
PDS_EMAIL_FROM_ADDRESS=no-reply@${host}
PDS_INVITE_REQUIRED=true
PDS_EMAIL_SMTP_URL=smtps://${user}:${app_password}@smtp.gmail.com
PDS_ADMIN_PASSWORD
PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX
PDS_REPO_SIGNING_KEY_K256_PRIVATE_KEY_HEX
PDS_JWT_SECRET

4
envs/plc Normal file
View File

@ -0,0 +1,4 @@
DATABASE_URL=postgres://postgres:postgres@database/plc
DB_CREDS_JSON='{"username":"postgres","password":"postgres","host":"database","port":"5432","database":"plc"}'
ENABLE_MIGRATIONS=true
DB_MIGRATE_CREDS_JSON='{"username":"postgres","password":"postgres","host":"database","port":"5432","database":"plc"}'

4
envs/postgres Normal file
View File

@ -0,0 +1,4 @@
#POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=healthcheck

1
envs/social-app Normal file
View File

@ -0,0 +1 @@
ATP_APPVIEW_HOST=https://bsky.${host}

52
icons/Logotype.tsx Normal file
View File

@ -0,0 +1,52 @@
import React from 'react'
import Svg, {Path, SvgProps, PathProps} from 'react-native-svg'
import {usePalette} from '#/lib/hooks/usePalette'
const ratio = 17 / 64
export function Logotype({
fill,
...rest
}: {fill?: PathProps['fill']} & SvgProps) {
const pal = usePalette('default')
// @ts-ignore it's fiiiiine
const size = parseInt(rest.width || 32)
return (
<Svg
fill="none"
viewBox="0 0 2821.6379 794.29016"
{...rest}
width={size}
height={Number(size) * ratio}>
<g
transform="matrix(0.1,0,0,-0.1,-282.80153,1445)"
fill="#000000"
stroke="none"
>
<path
d="m 24787,14443 c -4,-3 -7,-224 -7,-490 v -483 h 545 545 v 490 490 h -538 c -296,0 -542,-3 -545,-7 z"
/>
<path
d="m 5190,13285 c -8,-3 -96,-12 -195,-20 -199,-16 -296,-32 -430,-70 -49,-14 -115,-32 -145,-40 -153,-39 -504,-198 -662,-301 -21,-13 -57,-36 -80,-51 -24,-16 -72,-50 -109,-78 -241,-182 -377,-315 -528,-517 -119,-158 -120,-160 -106,-188 23,-45 140,-140 560,-457 110,-84 319,-242 465,-353 146,-110 369,-279 495,-375 791,-600 723,-549 1049,-799 269,-207 398,-307 524,-403 l 114,-86 -49,-49 c -128,-131 -378,-258 -588,-299 -66,-13 -357,-13 -420,0 -115,23 -172,39 -202,54 -18,10 -37,17 -43,17 -24,0 -171,81 -255,141 -50,35 -146,121 -215,192 -69,70 -133,127 -142,127 -19,0 -153,-63 -177,-83 -9,-7 -54,-35 -101,-62 -47,-26 -110,-64 -140,-85 -30,-20 -97,-61 -148,-91 -51,-30 -107,-62 -124,-72 -18,-10 -57,-38 -87,-61 -70,-53 -252,-168 -446,-281 -82,-49 -158,-95 -168,-104 -16,-16 -14,-21 34,-106 165,-289 544,-666 867,-860 9,-6 35,-22 58,-37 36,-23 267,-138 349,-173 108,-47 160,-67 240,-93 150,-48 201,-62 228,-62 14,0 64,-9 109,-19 197,-46 302,-56 573,-56 197,1 281,5 345,17 47,9 110,19 141,22 31,3 75,13 99,21 23,8 56,15 72,15 17,0 51,7 77,15 25,8 80,24 121,36 41,12 125,41 185,66 61,25 124,50 140,56 17,7 89,42 160,78 113,58 177,98 395,246 82,56 273,232 403,371 127,136 237,271 237,291 0,12 -208,179 -425,342 -186,140 -1121,843 -1720,1294 -264,199 -589,444 -723,546 -134,101 -274,208 -312,237 -39,29 -70,58 -70,66 0,21 107,115 203,179 95,64 237,133 295,143 20,4 49,12 63,20 96,48 519,48 619,-1 14,-7 41,-16 60,-20 65,-13 262,-118 360,-191 99,-74 250,-230 372,-384 34,-44 70,-80 80,-80 9,0 39,15 67,33 28,17 70,44 94,58 23,15 121,76 217,136 96,60 254,156 350,213 96,56 272,160 390,230 118,70 230,135 248,144 41,21 41,45 -3,116 -18,30 -46,75 -61,100 -64,106 -252,348 -352,454 -106,112 -169,171 -293,274 -197,164 -310,235 -594,376 -215,106 -519,205 -735,240 -137,22 -574,51 -610,41 z"
/>
<path
d="m 29095,12736 c -421,-44 -744,-157 -975,-342 -259,-207 -396,-446 -465,-809 -16,-84 -23,-301 -14,-425 36,-518 257,-859 694,-1070 166,-80 284,-116 716,-215 449,-103 514,-121 646,-186 218,-107 308,-253 306,-494 -2,-303 -188,-477 -588,-551 -140,-26 -640,-27 -825,-1 -275,38 -486,94 -776,203 -94,35 -174,64 -178,64 -3,0 -6,-175 -6,-389 v -388 l 88,-41 c 404,-187 905,-282 1486,-282 675,0 1154,150 1465,459 196,194 311,434 362,756 20,121 17,476 -5,600 -89,517 -358,800 -945,994 -130,43 -241,71 -616,156 -137,31 -299,73 -360,92 -331,106 -455,246 -455,511 1,249 127,412 387,501 272,92 801,76 1269,-39 116,-28 326,-96 432,-138 l 52,-22 -2,406 -3,406 -66,28 c -154,66 -413,140 -604,174 -279,49 -756,69 -1020,42 z"
/>
<path
d="m 9630,12676 c 0,-2 403,-996 896,-2208 493,-1211 898,-2211 901,-2220 6,-21 -135,-386 -193,-499 -104,-202 -256,-324 -471,-380 -118,-30 -340,-43 -516,-29 -84,6 -185,17 -225,24 -40,7 -75,10 -77,7 -3,-2 -5,-163 -5,-357 v -353 l 63,-30 c 194,-93 493,-138 801,-120 414,23 683,115 937,319 174,140 357,402 474,680 26,62 1945,5159 1945,5167 0,2 -232,2 -516,1 l -517,-3 -556,-1550 c -485,-1350 -560,-1550 -578,-1553 -18,-3 -26,11 -62,105 -23,59 -295,758 -605,1553 l -562,1445 -567,3 c -312,1 -567,0 -567,-2 z"
/>
<path
d="m 15690,10867 c 0,-1970 -1,-1936 56,-2153 128,-497 461,-787 1014,-885 147,-26 440,-36 605,-20 413,40 834,200 1181,447 35,25 73,44 88,44 14,0 26,-1 26,-3 0,-2 20,-94 45,-205 25,-111 45,-204 45,-207 0,-3 209,-5 465,-5 h 465 v 2400 2400 h -535 -535 l -2,-1866 -3,-1866 -115,-50 c -425,-185 -743,-252 -1088,-227 -302,21 -472,109 -562,293 -79,161 -74,11 -77,1969 l -3,1747 h -535 -535 z"
/>
<path
d="m 24785,12668 c -3,-7 -4,-1086 -3,-2398 l 3,-2385 538,-3 537,-2 v 2400 2400 h -535 c -419,0 -537,-3 -540,-12 z"
/>
<path
d="m 21660,8275 v -545 h 565 565 v 545 545 h -565 -565 z"
/>
</g>
</Svg>
)
}

32
icons/title.svg Normal file
View File

@ -0,0 +1,32 @@
<svg
viewBox="0 0 2821.6379 794.29016"
preserveAspectRatio="xMidYMid"
xmlns:svg="http://www.w3.org/2000/svg">
<g
transform="matrix(0.1,0,0,-0.1,-282.80153,1445)"
fill="#000000"
stroke="none"
>
<path
d="m 24787,14443 c -4,-3 -7,-224 -7,-490 v -483 h 545 545 v 490 490 h -538 c -296,0 -542,-3 -545,-7 z"
/>
<path
d="m 5190,13285 c -8,-3 -96,-12 -195,-20 -199,-16 -296,-32 -430,-70 -49,-14 -115,-32 -145,-40 -153,-39 -504,-198 -662,-301 -21,-13 -57,-36 -80,-51 -24,-16 -72,-50 -109,-78 -241,-182 -377,-315 -528,-517 -119,-158 -120,-160 -106,-188 23,-45 140,-140 560,-457 110,-84 319,-242 465,-353 146,-110 369,-279 495,-375 791,-600 723,-549 1049,-799 269,-207 398,-307 524,-403 l 114,-86 -49,-49 c -128,-131 -378,-258 -588,-299 -66,-13 -357,-13 -420,0 -115,23 -172,39 -202,54 -18,10 -37,17 -43,17 -24,0 -171,81 -255,141 -50,35 -146,121 -215,192 -69,70 -133,127 -142,127 -19,0 -153,-63 -177,-83 -9,-7 -54,-35 -101,-62 -47,-26 -110,-64 -140,-85 -30,-20 -97,-61 -148,-91 -51,-30 -107,-62 -124,-72 -18,-10 -57,-38 -87,-61 -70,-53 -252,-168 -446,-281 -82,-49 -158,-95 -168,-104 -16,-16 -14,-21 34,-106 165,-289 544,-666 867,-860 9,-6 35,-22 58,-37 36,-23 267,-138 349,-173 108,-47 160,-67 240,-93 150,-48 201,-62 228,-62 14,0 64,-9 109,-19 197,-46 302,-56 573,-56 197,1 281,5 345,17 47,9 110,19 141,22 31,3 75,13 99,21 23,8 56,15 72,15 17,0 51,7 77,15 25,8 80,24 121,36 41,12 125,41 185,66 61,25 124,50 140,56 17,7 89,42 160,78 113,58 177,98 395,246 82,56 273,232 403,371 127,136 237,271 237,291 0,12 -208,179 -425,342 -186,140 -1121,843 -1720,1294 -264,199 -589,444 -723,546 -134,101 -274,208 -312,237 -39,29 -70,58 -70,66 0,21 107,115 203,179 95,64 237,133 295,143 20,4 49,12 63,20 96,48 519,48 619,-1 14,-7 41,-16 60,-20 65,-13 262,-118 360,-191 99,-74 250,-230 372,-384 34,-44 70,-80 80,-80 9,0 39,15 67,33 28,17 70,44 94,58 23,15 121,76 217,136 96,60 254,156 350,213 96,56 272,160 390,230 118,70 230,135 248,144 41,21 41,45 -3,116 -18,30 -46,75 -61,100 -64,106 -252,348 -352,454 -106,112 -169,171 -293,274 -197,164 -310,235 -594,376 -215,106 -519,205 -735,240 -137,22 -574,51 -610,41 z"
/>
<path
d="m 29095,12736 c -421,-44 -744,-157 -975,-342 -259,-207 -396,-446 -465,-809 -16,-84 -23,-301 -14,-425 36,-518 257,-859 694,-1070 166,-80 284,-116 716,-215 449,-103 514,-121 646,-186 218,-107 308,-253 306,-494 -2,-303 -188,-477 -588,-551 -140,-26 -640,-27 -825,-1 -275,38 -486,94 -776,203 -94,35 -174,64 -178,64 -3,0 -6,-175 -6,-389 v -388 l 88,-41 c 404,-187 905,-282 1486,-282 675,0 1154,150 1465,459 196,194 311,434 362,756 20,121 17,476 -5,600 -89,517 -358,800 -945,994 -130,43 -241,71 -616,156 -137,31 -299,73 -360,92 -331,106 -455,246 -455,511 1,249 127,412 387,501 272,92 801,76 1269,-39 116,-28 326,-96 432,-138 l 52,-22 -2,406 -3,406 -66,28 c -154,66 -413,140 -604,174 -279,49 -756,69 -1020,42 z"
/>
<path
d="m 9630,12676 c 0,-2 403,-996 896,-2208 493,-1211 898,-2211 901,-2220 6,-21 -135,-386 -193,-499 -104,-202 -256,-324 -471,-380 -118,-30 -340,-43 -516,-29 -84,6 -185,17 -225,24 -40,7 -75,10 -77,7 -3,-2 -5,-163 -5,-357 v -353 l 63,-30 c 194,-93 493,-138 801,-120 414,23 683,115 937,319 174,140 357,402 474,680 26,62 1945,5159 1945,5167 0,2 -232,2 -516,1 l -517,-3 -556,-1550 c -485,-1350 -560,-1550 -578,-1553 -18,-3 -26,11 -62,105 -23,59 -295,758 -605,1553 l -562,1445 -567,3 c -312,1 -567,0 -567,-2 z"
/>
<path
d="m 15690,10867 c 0,-1970 -1,-1936 56,-2153 128,-497 461,-787 1014,-885 147,-26 440,-36 605,-20 413,40 834,200 1181,447 35,25 73,44 88,44 14,0 26,-1 26,-3 0,-2 20,-94 45,-205 25,-111 45,-204 45,-207 0,-3 209,-5 465,-5 h 465 v 2400 2400 h -535 -535 l -2,-1866 -3,-1866 -115,-50 c -425,-185 -743,-252 -1088,-227 -302,21 -472,109 -562,293 -79,161 -74,11 -77,1969 l -3,1747 h -535 -535 z"
/>
<path
d="m 24785,12668 c -3,-7 -4,-1086 -3,-2398 l 3,-2385 538,-3 537,-2 v 2400 2400 h -535 c -419,0 -537,-3 -540,-12 z"
/>
<path
d="m 21660,8275 v -545 h 565 565 v 545 545 h -565 -565 z"
/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

0
repos/.keep Normal file
View File

1
repos/atproto Submodule

@ -0,0 +1 @@
Subproject commit 8f2b80a0dcf118652452ea09764a947b09991e0f

@ -0,0 +1 @@
Subproject commit 3e384e3b58b8284c68e9562d16920867f8905340

1
repos/cookbook Submodule

@ -0,0 +1 @@
Subproject commit 03739f5268d5915e0dc7e8815723575f4b457bda

1
repos/did-method-plc Submodule

@ -0,0 +1 @@
Subproject commit 13da315787e50bd79548d5b695f4f597b43b4015

1
repos/feed-generator Submodule

@ -0,0 +1 @@
Subproject commit 9a887dd8f2ee634c5e524cfa802f754878a91e5a

1
repos/social-app Submodule

@ -0,0 +1 @@
Subproject commit f6649e22a762fa8f4d3060da0a274f3b83ecb06f