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.
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.defs |
Shared types: bodyPosition, houseCusp, westernData, jyotishData, vargaChart, dashaTree, etc. |
space.chartid.natalChart |
Birth chart. key: "tid" — users can hold multiple (Western, Jyotish, rectified versions). |
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. |
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.
Artiji — first consumer app writing
space.chartid.natalChart records. Astrological greeting card platform;
chart data generated at card creation, written to user ATProto repo on consent.
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.
Lexicon definitions: CC0 — no rights reserved. Use freely.