Skip to content
Schedule Social Media

Press Esc to close.

Breaking Bluesky Severity: low

Bluesky pinned posts clash with a field third-party apps already used

Announced16 Oct 2024
Effective10 Oct 2024
StatusIn effect

What changed

Bluesky app version 1.92, released October 10, 2024, added a pinnedPost field to the app.bsky.actor.profile record as a com.atproto.repo.strongRef. Several independent clients had used a pinnedPost field as a plain URI string since April 2024, so existing records became invalid under the new schema and some users saw errors. In an October 16 post Bluesky called it an unintentional mistake and recommended sidecar records (for example com.yourapp.profile) or long unique prefixes such as app.graysky.pinnedPost for extension fields.

What it means

Profile records written by some third-party apps became invalid under Bluesky's new pinnedPost field, causing errors for some users, and Bluesky now tells developers not to add their own fields to Bluesky records.

Who is affected

Developers of Bluesky clients and tools that write or read profile records, or add custom fields to Bluesky record types.

What to do by 10 Oct 2024

Treat pinnedPost on app.bsky.actor.profile as a strongRef (URI plus CID). Store custom data in your own sidecar record type, or use a long unique prefix for any extension field.

What this means for you

In October 2024 Bluesky added pinned posts, a post that stays at the top of your profile. A few other Bluesky apps had already built the same thing in a slightly different way, and the two clashed, so some people saw errors. If you pin posts from a non-Bluesky app, check that your pin still shows up correctly in the Bluesky app.

The details

  • The change: app version 1.92 (October 10, 2024) declared pinnedPost on app.bsky.actor.profile as a com.atproto.repo.strongRef, an object with both the record URI and its CID.
  • The collision: since April 2024, clients including Klearsky, Tokimeki and Hagoromo had written pinnedPost as a plain URL string. Under the new schema those records became "invalid", and records valid under the new schema could be invalid for the older software.
  • Bluesky's position: the schema for app.bsky.* is controlled by Bluesky (authority follows the NSID's domain). Off-schema fields are allowed and passed through, but Bluesky does not see inserting fields into other parties' records "as a reliable or responsible practice in the long run."
  • Recommended pattern: a sidecar record in your own namespace, fetched alongside the original. For records with fixed keys (like self) or TID keys (like posts), use the same record key so a simple GET finds it. app.bsky.feed.threadgate uses this pattern for posts.
  • If you must extend: use a long, unique prefix or a full NSID, for example app.graysky.pinnedPost or grayskyPinnedPost, not pinnedPost or extPinnedPost.
  • Also noted: clarified validation for the unknown and union Lexicon types and updated schema validation when records are created at PDS instances.

What to do next

  • Business owners: If you pin a post, check it appears pinned in the Bluesky app.
  • Marketers and agencies: Nothing, unless a client's pinned post looks wrong; re-pin it in the Bluesky app.
  • Developers: Write pinnedPost as a strongRef, never write custom fields with generic names into app.bsky.* records, and move extension data to sidecar records.

Primary sources

Checked against the source 7 Nov 2026

Get an email when a new API change is added

Follow new entries with the RSS feed. Each platform also has its own feed, for example X or Meta.