An open AT Protocol Lexicon for astrological charts as self-sovereign identity records.
Steward domain: chartid.space
Lexicon namespace: space.chartid
Status: RFC / Pre-release — open for comment
Every AT Protocol user has a DID. Their astrological chart - if they want one — should live in their own repo, portable across the entire Atmosphere, not locked inside any single app.
space.chartid.* defines the data model. No app owns the records. No app owns the standard.
Birth dates and times are personally identifiable information (PII). ChartID provides optional privacy controls:
- Visibility flags: Mark charts as
public,private, orfriends - Birth time trust: Declare confidence level (
exact,approximate,unknown) - Encryption: For private charts, encrypt
birthDatetimeas JWE before posting and store inencryptedData - Erasure: Charts are your data — delete anytime via your PDS
See PRIVACY.md for implementation guidance.
Professional astrologers and institutions can attest to chart accuracy via space.chartid.chartVerification records:
- birth-certificate-verified: Hospital or official records confirmed
- astrologer-attested: Professional verification of accuracy
- historical-figure: Verified data for a public historical person
- self-declared: User-provided, unverified
Verification is composable — multiple sources can attest to the same chart. Feed generators and apps can surface high-confidence records.
Example use case: A feed generator that shows "Verified charts only" for serious astrology research.
A natal chart record at space.chartid.natalChart in a user's repo is:
- Signed by their repo key
- Readable by any Atmosphere app with Lexicon support
- Deletable by the user at any time
- Not migrated when they switch PDS — it's their data
A record looks like:
{
"$type": "space.chartid.natalChart",
"schemaVersion": "1.0.0",
"traditions": ["western", "jyotish"],
"birthDatetime": "1990-04-15T14:32:00Z",
"birthPlace": {
"placeName": "Oakland, CA, USA",
"coordinate": { "latitude": "37.804363", "longitude": "-122.271111" },
"timezone": "America/Los_Angeles"
},
"timeConfidence": "exact",
"roddenRating": "AA",
"western": { ... },
"jyotish": { ... },
"createdAt": "2025-01-01T00:00:00Z"
}subjectDID optionally links the chart to an AT identity. A person can point their own DID to their own chart — or keep them separate. Consent is explicit, not assumed.
attestedBy is an array of astrologer DIDs. Multiple practitioners can attest to chart accuracy without creating a separate attestation service. Each attesting DID is expected to publish a corresponding attestation record of their own.
traditions is an array. A single record can carry both Western tropical and Jyotish sidereal data:
{
"traditions": ["western", "jyotish"],
"western": { "houseSystem": "Placidus", "planets": [...] },
"jyotish": { "ayanamsa": "Lahiri", "ayanamsaDegrees": "24.112300", "planets": [...], "vargaCharts": [...] }
}Apps that only understand one tradition ignore the other. The record serves both without forking.
birthDatetime is optional. timeConfidence signals the reliability of the time:
exact— birth certificate / hospital recordapproximate— family memory, close estimateunknown— date known, time notrectified— time derived by rectification (seerectificationNote)
A chart with timeConfidence: "unknown" is a valid, useful partial record — rising sign and houses are absent, planets are present.
| File | Description |
|---|---|
space.chartid.natalChart |
Birth chart. key: "tid" — users can hold multiple (Western, Jyotish, rectified versions). |
space.chartid.chartVerification |
Attestation by a third party (astrologer, institution). Links to a natalChart via chartUri. |
space.chartid.settings |
User profile settings. key: "self" — one per DID. Primary chart URI, visibility defaults, traditions. |
space.chartid.eventChart |
Moment in time: eclipses, launches, IPOs. eventDatetime required. |
space.chartid.entityChart |
Organization, country, institution. entityName required. |
space.chartid.horaryChart |
Horary / Prashna: a sincere question at a moment. questionDatetime required. |
space.chartid.electionalChart |
Elected / Muhurta: chosen auspicious timing. electionalDatetime required. |
Core natal chart record. Birth data + astrological placements.
visibility: Who can see (public|private|friends)birthTimeTrust: Confidence in time accuracy (exact|approximate|unknown)encryptedData: Optional JWE-encryptedbirthDatetimefor private chartsattestedBy: Array of verifier DIDs (each expected to have a correspondingchartVerificationrecord)
Attestation by a third party (astrologer, institution).
- Links to a
natalChartviachartUri(AT URI) verificationLabel:birth-certificate-verified|astrologer-attested|historical-figure|self-declaredverifierDidis public — creates accountability- Multiple verifiers can attest to the same chart
User profile settings. One record per DID (key: "self").
primaryChartUri: Which chart appears on the user's profiledefaultVisibility: Privacy default for new chartsbio&traditions: Astrology context (jyotish, western, hellenistic, etc.)
No floats in ATProto Lexicon. All degree values are decimal degree strings ("254.378500"). Explicit, lossless, no float precision surprises.
schemaVersion: "1.0.0" is a const field. Breaking schema changes will bump to 2.0.0 with a new lexicon file, not in-place mutation. Old records stay valid under old readers.
extensions: unknown at top level and within each tradition block. Tradition-specific fields not yet in spec go here without breaking existing record validation. This is how Hellenistic lots, Uranian midpoints, and shadbala scores get added incrementally.
traditions is an array, not an enum. One record, multiple simultaneous traditions. Compare western and Jyotish placements in a single query.
houseSystem and ayanamsa are explicit fields, never inferred from context or packed into a planet position string. A chart without a declared house system is ambiguous. These fields make it unambiguous.
- Declare
space.chartid.natalChartas a supported collection in your PDS config - Point to
lexicons/in this repo for schema validation - Write records via
com.atproto.repo.createRecordwithcollection: "space.chartid.natalChart"
chartid.space — protocol overview, demo space.chartid.natalChart record rendered as a North Indian Jyotish chart, full Lexicon namespace listing. Hosted on Cloudflare Pages from this repo (index.html).
jyotish-mcp — reference calculator. Swiss Ephemeris, TypeScript, Lahiri ayanamsa. Produces ChartID-format Jyotish output. Vimshottari dasha calculation.
Open discussion: bluesky-social/atproto Discussions
Feedback on: namespace choice, field naming, extension model, multi-tradition record vs separate records per tradition.
See CONTRIBUTING.md.
Schema changes follow semantic versioning:
- Patch: clarifications, description improvements
- Minor: new optional fields, new
knownValuesentries - Major: required field additions, type changes, field removals
All changes via PR with rationale. Breaking changes require RFC comment period before merge.
New fields containing PII must pass the privacy review checklist.
Lexicon definitions: CC0 — no rights reserved. Use freely.