Lexicons are the schema language of the AT Protocol. They define how data is structured, validated, and exchanged across the decentralized network. Every record stored on a user's PDS (Personal Data Server) must conform to a lexicon schema.
This package defines the id.sifa.* namespace -- the data contract between a user's PDS and the Sifa AppView. Because the schemas live on the protocol layer, all professional profile data (positions, education, skills, endorsements) is portable: users own their data and can move between services without loss.
Every schema in this repo is published as a com.atproto.lexicon.schema record on the namespace authority DID's PDS, with the DNS proof _lexicon.sifa.id TXT did=did:plc:2f2ahswozqy4v5lvu676375y in place. Third-party tools that resolve id.sifa.* lexicons at runtime get the canonical schema directly from the protocol -- no dependency on this repo being reachable.
Profile records
| NSID | Purpose |
|---|---|
id.sifa.profile.self |
Professional profile singleton |
id.sifa.profile.position |
Work experience |
id.sifa.profile.education |
Education |
id.sifa.profile.skill |
Skills |
id.sifa.profile.certification |
Certifications and licenses |
id.sifa.profile.project |
Projects |
id.sifa.profile.volunteering |
Volunteer experience |
id.sifa.profile.publication |
Publications |
id.sifa.profile.course |
Courses |
id.sifa.profile.honor |
Honors and awards |
id.sifa.profile.language |
Language proficiency |
id.sifa.profile.location |
Locations (residential, business, travel) |
id.sifa.profile.externalAccount |
Linked external accounts and websites |
Social graph
| NSID | Purpose |
|---|---|
id.sifa.graph.follow |
Professional follows |
id.sifa.graph.connection |
Deprecated, not implemented. See the note below. |
id.sifa.graph.connectionis deprecated and was never implemented. It described an explicit two-record connection handshake: you create a record naming someone, they accept by creating their own naming you. Sifa instead derives a connection from two mutualid.sifa.graph.followrecords, so nothing writes or reads this collection. The definition is retained so the NSID is not reused for something else; do not build against it.
id.sifa.graph.followis a distinct graph, not a Bluesky superset. Sifa's follow graph captures the intent "I want to see this person's professional content on Sifa." It is not a superset, mirror, or extension ofapp.bsky.graph.follow. A Bluesky-only client must not assume the two are interchangeable: following on Bluesky does not imply a Sifa follow, and vice versa. Each graph is owned by its own AppView contract. Users who want both relationships create both records.
Collaborative projects
| NSID | Purpose |
|---|---|
id.sifa.project.self |
Collaborative project record |
id.sifa.project.member |
Deprecated. Use id.sifa.confirmation |
id.sifa.project.membership |
Deprecated. Use id.sifa.confirmation |
Project members are named inline on id.sifa.profile.project and affirm the claim
with an id.sifa.confirmation record in their own repository.
Social interactions
| NSID | Purpose |
|---|---|
id.sifa.endorsement |
Skill endorsements |
id.sifa.endorsement.confirmation |
Endorsement confirmations |
id.sifa.confirmation |
Affirmation that a record naming you is accurate |
id.sifa.meeting |
Face-to-face meeting attestation |
OAuth permission sets
| NSID | Purpose |
|---|---|
id.sifa.authProfile |
Profile editing and follows |
id.sifa.authProfileAccess |
Profile access (legacy permission set) |
id.sifa.authMeet |
Meeting attestation |
id.sifa.authConnection |
Deprecated, not implemented. See the note below. |
id.sifa.authProject |
Project creation and team management |
Only
id.sifa.authProfileandid.sifa.authMeetare recognised by the Sifa AppView. The others are published but unregistered: a PDS granting them viainclude:confers nothing today.
id.sifa.authConnectionis deprecated. It grants write access toid.sifa.graph.connection, which is itself deprecated and unimplemented, so the set cannot usefully be granted. Retained so the NSID is not reused.
Query methods
| NSID | Purpose |
|---|---|
id.sifa.getProfileView |
Aggregated public profile view served by AppViews |
Shared types
| NSID | Purpose |
|---|---|
id.sifa.defs |
Shared tokens and types |
npm install
npx lex validate ./lexiconsnpx lex gen-api ./lexicons --output ./src/typesCopy the lexicons/ directory into your AT Protocol project, or reference the schemas directly from this repository.
These lexicons reference types from:
community.lexicon.*-- Location and calendar types (lexicon-community)com.atproto.*-- Core AT Protocol types (strongRef, selfLabels)
Prerequisites: Node.js 26+, npm.
git clone https://github.com/singi-labs/sifa-lexicons.git
cd sifa-lexicons
npm installnpm test # Run tests
npm run build # Compile TypeScript
npm run lint # LintSee CONTRIBUTING.md for branching strategy, commit format, and code review process.
| Repository | Description |
|---|---|
| sifa-api | AppView backend (Fastify, AT Protocol) |
| sifa-web | Frontend (Next.js, React, TailwindCSS) |
| sifa-deploy | Docker Compose + Caddy deployment config |
| sifa-workspace | Project coordination |
| Resource | Description |
|---|---|
| lexicon.garden | Discovery platform for AT Protocol lexicons -- browse, search, and explore schemas. |
| lexicon-community/lexicon | Shared community lexicons for cross-app interoperability. |
| AT Protocol Lexicon Spec | Official specification for the Lexicon schema language. |
- Website: sifa.id
- Bluesky: @sifa.id
- Issues: Report bugs
MIT
See LICENSE for full terms.
Made with ♥ in 🇪🇺 by Singi Labs