Parakeet is a Rust-based Bluesky AppView aiming to implement most of the functionality required to support the Bluesky client

feat: pronouns and websites

https://github.com/bluesky-social/atproto/pull/4224

handle.invalid b2548b8c 9ca43755

verified
Changed files
+27 -2
consumer
lexica
src
app_bsky
migrations
2025-09-24-205239_profiles-4224
parakeet
src
hydration
parakeet-db
+2
consumer/src/db/record.rs
··· 576 576 &pinned_cid, 577 577 &joined_sp_uri, 578 578 &joined_sp_cid, 579 + &rec.pronouns, 580 + &rec.website, 579 581 &rec.created_at.unwrap_or(Utc::now()).naive_utc(), 580 582 ], 581 583 )
+4 -2
consumer/src/db/sql/profile_upsert.sql
··· 1 1 INSERT INTO profiles (did, cid, avatar_cid, banner_cid, display_name, description, pinned_uri, pinned_cid, 2 - joined_sp_uri, joined_sp_cid, created_at) 3 - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) 2 + joined_sp_uri, joined_sp_cid, pronouns, website, created_at) 3 + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13) 4 4 ON CONFLICT (did) DO UPDATE SET cid=EXCLUDED.cid, 5 5 avatar_cid=EXCLUDED.avatar_cid, 6 6 banner_cid=EXCLUDED.banner_cid, ··· 10 10 pinned_cid=EXCLUDED.pinned_cid, 11 11 joined_sp_uri=EXCLUDED.joined_sp_uri, 12 12 joined_sp_cid=EXCLUDED.joined_sp_cid, 13 + pronouns=EXCLUDED.pronouns, 14 + website=EXCLUDED.website, 13 15 indexed_at=NOW()
+4
consumer/src/indexer/records.rs
··· 23 23 pub labels: Option<SelfLabels>, 24 24 pub joined_via_starter_pack: Option<StrongRef>, 25 25 pub pinned_post: Option<StrongRef>, 26 + #[serde_as(as = "utils::safe_string")] 27 + pub pronouns: Option<String>, 28 + #[serde_as(as = "utils::safe_string")] 29 + pub website: Option<String>, 26 30 pub created_at: Option<DateTime<Utc>>, 27 31 } 28 32
+4
lexica/src/app_bsky/actor.rs
··· 199 199 pub verification: Option<VerificationState>, 200 200 #[serde(skip_serializing_if = "Option::is_none")] 201 201 pub status: Option<StatusView>, 202 + #[serde(skip_serializing_if = "Option::is_none")] 203 + pub pronouns: Option<String>, 204 + #[serde(skip_serializing_if = "Option::is_none")] 205 + pub website: Option<String>, 202 206 203 207 pub created_at: DateTime<Utc>, 204 208 pub indexed_at: NaiveDateTime,
+3
migrations/2025-09-24-205239_profiles-4224/down.sql
··· 1 + alter table profiles 2 + drop column pronouns, 3 + drop column website;
+3
migrations/2025-09-24-205239_profiles-4224/up.sql
··· 1 + alter table profiles 2 + add column pronouns text, 3 + add column website text;
+3
parakeet-db/src/models.rs
··· 37 37 pub joined_sp_uri: Option<String>, 38 38 pub joined_sp_cid: Option<String>, 39 39 40 + pub pronouns: Option<String>, 41 + pub website: Option<String>, 42 + 40 43 pub created_at: NaiveDateTime, 41 44 pub indexed_at: NaiveDateTime, 42 45 }
+2
parakeet-db/src/schema.rs
··· 301 301 joined_sp_cid -> Nullable<Text>, 302 302 created_at -> Timestamp, 303 303 indexed_at -> Timestamp, 304 + pronouns -> Nullable<Text>, 305 + website -> Nullable<Text>, 304 306 } 305 307 } 306 308
+2
parakeet/src/hydration/profile.rs
··· 229 229 labels: map_labels(labels), 230 230 verification, 231 231 status, 232 + pronouns: profile.pronouns, 233 + website: profile.website, 232 234 created_at: profile.created_at.and_utc(), 233 235 indexed_at: profile.indexed_at, 234 236 }