Replies: 5 comments 8 replies
-
|
By the way, the |
Beta Was this translation helpful? Give feedback.
-
|
Here are some examples of records using the proposed Lexicon to help illustrate: |
Beta Was this translation helpful? Give feedback.
-
|
Account profiles are an interesting use case. They represent common elements like display name, description, and avatar, but how and where they are used is very specific to the applications that create them. They also don't imply that information should be shared or used outside of the application. I suspect that my frontpage.fyi profile would be different from my bsky.app profile, and same for smokesignal.events. I think it'd be useful to have someone from Bluesky Social to weigh in and give some context around how they landed "self" in |
Beta Was this translation helpful? Give feedback.
-
|
Hello! I had a chat with folks in my community about this proposal, and here's some thoughts we have. You can see the live discussion in this video. This is our first time contributing to an effort like this, and we hope this feedback matches what you're looking for 🤞
...and this is all for now! Thanks for this initiative, very happy to see it! We'll also be looking at the social graph proposal soon :D |
Beta Was this translation helpful? Give feedback.
-
|
Please note that due to protocol specifications, multiple schemas cannot be directly linked to one collection. The FYI, followings are some alternatives that I can think of. Details
Refer to the same information from multiple servicesOnly generic information (base profile) is defined, and other information is defined in the collection for each service. {
"lexicon": 1,
"id": "community.lexicon.actor.profile",
"defs": {
"main": {
"type": "record",
"key": "literal:self",
"record": {
"type": "object",
"properties": {
"displayName": { "type": "string" }
}
}
}
}
}The service can be explicitly referenced from the record or automatically mixed in with the API. {
"lexicon": 1,
"id": "example.service.profile",
"defs": {
"main": {
"type": "record",
"key": "literal:self",
"record": {
"type": "object",
"properties": {
"importFrom" : {
"type": "string",
"format": "at-uri"
},
"serviceInfo": { "type": "string" }
}
}
}
}
}There is also a way to separate records by field to show partial references. Commonize the structure of the profileAllow the content to be defferent for each service, and if you want to unify only the type, define the type for the field, not the record. {
"lexicon": 1,
"id": "community.lexicon.actor.profile",
"defs": {
"main": {
"type": "object",
"properties": {
"displayName": { "type": "string" }
}
}
}
}The profile record of each service refers to this. {
"lexicon": 1,
"id": "example.service.profile",
"defs": {
"main": {
"type": "record",
"key": "literal:self",
"record": {
"type": "object",
"properties": {
"genericProfile" : {
"type": "ref",
"ref": "community.lexicon.actor.profile"
},
"serviceInfo": { "type": "string" }
}
}
}
}
}Collect profiles in one collectionIn contrast to the previous one, refer to the object definition of each service. Please note that {
"lexicon": 1,
"id": "community.lexicon.actor.profile",
"defs": {
"main": {
"type": "record",
"key": "nsid",
"record": {
"type": "object",
"required": ["body"],
"properties": {
"body": { "type": "union", "refs": ["#generic"] }
}
}
},
"generic": {
"type": "object",
"properties": {
"displayName": { "type": "string" }
}
}
}
}The service defines the object to be referenced to this record and creates an {
"lexicon": 1,
"id": "example.service.profile",
"defs": {
"main": {
"type": "object",
"properties": {
"generic" : {
"type": "string",
"format": "nsid",
"default": "community.lexicon.actor.profile"
},
"serviceInfo": { "type": "string" }
}
}
}
}List the profileIf you want to make a collection to make it easier to discover profiles for other services, simply collecting references may be enough. {
"lexicon": 1,
"id": "community.lexicon.actor.profile",
"defs": {
"main": {
"type": "record",
"key": "literal:self",
"record": {
"type": "object",
"properties": {
"profiles": {
"type": "array",
"items": { "type": "string", "format": "at-uri" }
}
}
}
}
}
}There are few uses for such references, but they may be meaningful for services that refer to records from any service. For example, AT Profile has a field that declares the collection to be imported, which is similar to this. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Intent and Rationale
Within a social graph, users have personal information they want to be able to manage and present to others. The most popular Lexicon namespace,
app.bsky, contains a record type for describing a user's social profile on Bluesky. Other AT Protocol services have adopted a variety of methods for managing user profiles, including:Intended Use
This Lexicon aims to bring consistency to profile behavior by allowing a user to declare their profile information independent of any service, override their generic profile for specific ATProto services, and declare service-specific profile information.
The new record type
community.lexicon.actor.profilewill be defined and primarily defined with rkeycom.atprototo declare a user's profile to be used in the absence of applicable service-specific profile records. Service-specific profile records should use their service's NSID (the service's homepage as a reverse-URI) as the rkey, and inherit all object properties from the generic profile record Lexicon. Services are free to define and store additional properties in their profiles.Care should be taken to ensure user interfaces appropriately inform the user of the difference between the generic profile and the service-specific profile, especially when editing the profile information.
Lexicon
Generic profile (rkey
com.atproto){ "lexicon": 1, "id": "community.lexicon.actor.profile", "defs": { "main": { "type": "record", "description": "A declaration of an AT Protocol account profile.", "key": "literal:com.atproto", "record": { "type": "object", "properties": { "displayName": { "type": "string", "maxGraphemes": 64, "maxLength": 640 }, "description": { "type": "string", "description": "Free-form profile description text.", "maxGraphemes": 256, "maxLength": 2560 }, "avatar": { "type": "blob", "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'", "accept": ["image/png", "image/jpeg"], "maxSize": 1000000 }, "banner": { "type": "blob", "description": "Larger horizontal image to display behind profile view." "accept": ["image/png", "image/jpeg"], "maxSize": 1000000 } } } } } }Bluesky profile (rkey
app.bsky){ "lexicon": 1, "id": "community.lexicon.actor.profile", "defs": { "main": { "type": "record", "description": "A declaration of a Bluesky account profile.", "key": "literal:app.bsky", "record": { "type": "object", "properties": { "joinedViaStarterPack": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, "pinnedPost": { "type": "ref", "ref": "com.atproto.repo.strongRef" } } } } } }Smoke Signal profile (rkey
events.smokesignal){ "lexicon": 1, "id": "community.lexicon.actor.profile", "defs": { "main": { "type": "record", "description": "A declaration of a Smoke Signal account profile.", "key": "literal:events.smokesignal", "record": { "type": "object", "properties": { "tz": { "type": "string", "description": "The time zone of the profile (e.g. 'America/New_York')." } } } } } }Beta Was this translation helpful? Give feedback.
All reactions