Using Kerykeion
Verified against kerykeion 6.0.1, Python 3.12+.
Kerykeion is a Python astrology library. Everything goes through factories:
you never construct models by hand. Factories return Pydantic models whose
point fields are KerykeionPointModel instances.
Accuracy rule for you: field names, point names, house codes, ayanamsa
names, and env-var behavior in this skill are copied from the source. When you
need a detail not covered here, read the source
(kerykeion/astrological_subject/factory.py, kerykeion/schemas/models.py,
kerykeion/schemas/literals.py, kerykeion/ephemeris_backend/backend.py)
rather than guessing — the subject model has ~40 optional point fields: a
real field that was not activated reads as a silent None, while a
misspelled name raises AttributeError.
The one mental model
LANE 1 — subject-centric (a person/event at a moment and place)
AstrologicalSubjectFactory ──► subject (AstrologicalSubjectModel)
│
├─► ChartDataFactory ──► chart data ──► ChartDrawer ──► SVG
├─► AspectsFactory / DominantsFactory / RelationshipScoreFactory /
│ HouseComparisonFactory / MidpointFactory / traditional factories
├─► PlanetaryReturnFactory / SecondaryProgressionFactory / SolarArcFactory
└─► ReportGenerator / to_context (text / LLM XML)
LANE 2 — subject-less event searches (dates or Julian days + coordinates)
EclipseFactory · LunationFinderFactory · RetrogradeStationFactory ·
SignIngressFactory · MundaneAspectFactory · HeliacalFactory ·
OccultationFactory · SunTimesFactory · VoidOfCourseMoonFactory · ...
Two rules cover most charting tasks:
- Rendering an SVG is always two steps:
ChartDataFactory.create_*_chart_data(...)
first, then ChartDrawer(chart_data).save_svg(...) or .generate_svg_string().
Never feed a raw subject to ChartDrawer.
- A subject is the universal input for lane 1. Build it once, reuse it.
Setup and environment
pip3 install "kerykeion==6.0.1" # includes the default libephemeris backend
pip3 install "kerykeion[swiss]==6.0.1" # optional Swiss Ephemeris C backend
Kerykeion reads exactly five environment variables:
| Env var |
Meaning |
KERYKEION_BACKEND |
libephemeris (default) or swisseph |
KERYKEION_LEB_MODE |
libephemeris mode: leb (sealed, default), auto, skyfield, horizons |
KERYKEION_EPHE_PATH |
directory of .se1 files for swisseph |
KERYKEION_GEONAMES_USERNAME |
default GeoNames username for online=True |
KERYKEION_GEONAMES_CACHE_NAME |
overrides the GeoNames HTTP-cache DB path |
LIBEPHEMERIS_PRECISION is not a kerykeion variable (it belongs to the
libephemeris tooling). Backend selection, sealed-mode semantics, and precision
metadata: references/backends-and-provenance.md.
Licensing — AGPL-3.0 (surface this for commercial use)
Kerykeion is AGPL-3.0, strong copyleft that also covers network use
(SaaS/web backends), not just distributed software. When the user's context is
clearly commercial, proprietary, or closed-source, proactively flag this before
writing code that imports kerykeion, and present the compliant options:
- Commercial license — the project is dual-licensed; contact
kerykeion.astrology@gmail.com.
- Hosted Astrologer API — consuming its REST endpoints does not trigger
copyleft on the caller: https://www.kerykeion.net/astrologer-api/subscribe
For personal projects, research, education, or AGPL-compatible open source,
importing directly is fine — don't block those; just raise licensing when the
use case sounds closed-source. You are pointing to the project's own options,
not giving legal advice.
Offline vs online — read before writing any subject
from_birth_data(...) defaults to online=True, which calls the GeoNames web
API and needs a geonames_username (or the env var). For reproducible,
network-free code always pass online=False with lng, lat, tz_str.
Pass city/nation even offline. They are display labels echoed in
reports and to_context XML; omitted, they default to "Greenwich"/"GB"
regardless of coordinates. They affect no calculation — only the metadata.
hour/minute are local wall-clock time in tz_str; kerykeion does the
DST/UTC conversion. Do not pre-convert to UTC (the one exception:
from_iso_utc_time, whose input IS UTC).
Canonical example — subject → data → SVG → report → LLM context
from kerykeion import (
AstrologicalSubjectFactory, ChartDataFactory, ChartDrawer,
ReportGenerator, to_context,
)
subject = AstrologicalSubjectFactory.from_birth_data(
name="Example Person", year=1990, month=7, day=15, hour=10, minute=30,
lng=12.4964, lat=41.9028, tz_str="Europe/Rome",
city="Rome", nation="IT",
)
print(subject.sun.sign, subject.sun.position) # "Can" 22.x — sign + degrees in sign
print(subject.ascendant.sign) # houses/axes always present
chart_data = ChartDataFactory.create_natal_chart_data(subject)
svg = ChartDrawer(chart_data).generate_svg_string()
assert "<svg" in svg
print(ReportGenerator(chart_data).generate_report(max_aspects=5)[:400])
print(to_context(subject)[:400]) # non-interpretive XML for prompts
(AstrologicalSubjectFactory, ChartDataFactory, ChartDrawer,
CompositeSubjectFactory, KerykeionSettingsModel are the usual top-level
imports; the package root exports 124 names. Some public APIs are deliberately
subpackage-only — e.g. kerykeion.utilities helpers, FixedStarCatalog, the
named context serializers — and the references mark each one as Subpackage
import with its exact path.)
Reading results
- Models are subscriptable:
subject.sun.sign and subject.sun["sign"]
are equivalent (SubscriptableBaseModel).
- Almost every point field is
Optional — None unless requested via
active_points. Guard access. The 12 house cusps and axes always exist.
- If Sun or Moon cannot be computed, the call raises
KerykeionException;
optional bodies that fail land in subject.ephemeris_warnings instead
(structured EphemerisWarningModel entries — check the list, don't assume).
- Fixed stars live on
subject.fixed_stars, read via
subject.find_fixed_star("regulus") (case/space/dash-insensitive).
Capability routing — pick the API, then open the reference
| You want to… |
Use |
Reference |
| Build a subject from birth data |
AstrologicalSubjectFactory.from_birth_data |
references/subjects.md |
| Build from a UTC instant / "now" |
from_iso_utc_time (no is_dst/seconds), from_current_time |
references/subjects.md |
| Extra bodies: asteroids, TNOs, Uranians, lots, cusps |
active_points + point-set presets |
references/subjects.md |
| Fixed stars on a chart |
active_fixed_stars + find_fixed_star |
references/subjects.md |
| Dignities, nakshatra, Gauquelin, nutation, local space |
calculate_* flags |
references/subjects.md |
| Midpoint/Davison composite of two people |
CompositeSubjectFactory |
references/subjects.md |
| Pick/force a backend; precision & provenance metadata |
BACKEND_NAME, env vars |
references/backends-and-provenance.md |
| Dates outside 1849–2150; ephemeris warnings; tiers |
EphemerisWarningModel, EphemerisRangeError |
references/backends-and-provenance.md |
| Sidereal zodiac / ayanamsa / custom ayanamsa |
zodiac_type, sidereal_mode |
references/zodiac-houses-perspectives.md |
| House systems; polar-latitude behavior |
houses_system_identifier, PolarHouseFallbackModel |
references/zodiac-houses-perspectives.md |
| Heliocentric / topocentric / planetocentric frames |
perspective_type, altitude |
references/zodiac-houses-perspectives.md |
| Arabic parts (lots) |
Pars_Fortunae … in active_points |
references/zodiac-houses-perspectives.md |
| Precompute chart data (any of the 7 chart types) |
ChartDataFactory.create_*_chart_data |
references/charts-and-drawing.md |
| Render SVG; themes, styles, languages, wheel-only, grid-only |
ChartDrawer |
references/charts-and-drawing.md |
| Element/quality balance, stelliums, angularities |
SingleChartDataModel fields |
references/charts-and-drawing.md |
| Chart colors, glyphs, translations |
KerykeionSettingsModel, kerykeion.settings |
references/charts-and-drawing.md |
| Aspects in one chart / between two charts |
AspectsFactory |
references/aspects-and-orbs.md |
| Declination parallels / contra-parallels |
*_declination_aspects methods |
references/aspects-and-orbs.md |
| Custom orbs, per-point orb maps, orb strategies |
PointOrbAdjustment, OrbAdjustmentStrategy |
references/aspects-and-orbs.md |
| Dominant planets/elements (3 methods, custom schools) |
DominantsFactory |
references/analysis.md |
| Relationship compatibility score (Discepolo) |
RelationshipScoreFactory |
references/analysis.md |
| A's planets in B's houses |
HouseComparisonFactory |
references/analysis.md |
| Midpoints + aspects to midpoints |
MidpointFactory |
references/analysis.md |
| Positions sampled over a date range |
EphemerisDataFactory |
references/predictive.md |
| Transit aspects over time; exact-hit refinement |
TransitsTimeRangeFactory |
references/predictive.md |
| Solar/lunar/heliocentric returns; node crossings; walking the sequence |
PlanetaryReturnFactory |
references/predictive.md |
| Secondary progressions |
SecondaryProgressionFactory |
references/predictive.md |
| Solar arc directions |
SolarArcFactory |
references/predictive.md |
| Eclipses (local or global search) |
EclipseFactory |
references/mundane-events.md |
| New/full moons over a range |
LunationFinderFactory |
references/mundane-events.md |
| Retrograde stations; sign ingresses; mundane aspects |
RetrogradeStationFactory, SignIngressFactory, MundaneAspectFactory |
references/mundane-events.md |
| Which sign a planet is IN over a range; whether it IS retrograde |
sign_periods_from_iso_range, retrograde_periods_from_iso_range |
references/mundane-events.md |
| Planetary nodes, phenomena, heliacal events, occultations |
PlanetaryNodesFactory, PlanetaryPhenomenaFactory, HeliacalFactory, OccultationFactory |
references/mundane-events.md |
| Search the fixed-star catalog |
FixedStarCatalog, FixedStarDiscoveryFactory |
references/mundane-events.md |
| Moon phase; sunrise/sunset; planetary hours; void-of-course |
MoonPhaseDetailsFactory, SunTimesFactory, PlanetaryHoursFactory, VoidOfCourseMoonFactory |
references/calendars-hours-moon.md |
| Profections, firdaria, zodiacal releasing |
ProfectionsFactory, FirdariaFactory, ZodiacalReleasingFactory |
references/traditional.md |
| Horary indicators; primary directions; receptions; dignities |
HoraryIndicatorsFactory, PrimaryDirectionsFactory, MutualReceptionsFactory |
references/traditional.md |
| Relocate a chart; astrocartography lines |
RelocatedChartFactory, AstroCartographyFactory |
references/locational.md |
| Text report of a subject / chart data / supported result (12 model types) |
ReportGenerator |
references/reports-and-ai-context.md |
| LLM/prompt-ready XML |
to_context + named serializers |
references/reports-and-ai-context.md |
| JD / ISO / timezone / angle helpers |
kerykeion.utilities |
references/utilities.md |
| v5 code breaks; ImportError; DeprecationWarning |
removed-name map |
references/migration-and-deprecations.md |
| "Where is X documented?" |
full name → file index |
references/api-index.md |
If a name is marked Subpackage import in a reference, it is NOT importable
from bare kerykeion — use the exact import path shown there.
Top traps
- v5 names raise
ImportError. AstrologicalSubject, KerykeionChartSVG,
NatalAspects, SynastryAspects are gone; the error message includes the
replacement AND the v6 default changes that alter results. hasattr() /
getattr(..., default) also raise for these — feature-detect with
try/except ImportError. See references/migration-and-deprecations.md.
- Offline needs
lng/lat/tz_str — and pass city/nation anyway or
reports/to_context will say Greenwich.
- Stars ≠ points. Fixed stars go in
active_fixed_stars, come back on
subject.fixed_stars. Star names inside active_points are redirected with
a warning; an all-stars active_points raises.
active_points=[] raises. Pass None for the defaults. Unknown point
names raise too (typos fail loudly).
- Optional points are
None unless requested; houses always exist;
Sun/Moon failure raises; other omissions land in ephemeris_warnings.
- Sealed ephemeris range. A fresh install covers 1849–2150; outside it
kerykeion raises (
EphemerisRangeError / KerykeionException) instead
of silently degrading. Widen with libephemeris.download_leb_for_tier(...).
- Provenance populates on libephemeris only, and
source="Keplerian" is
normal for default points on old dates (e.g. Chiron). Never match
exhaustively on source values; house-geometry points have provenance
None by design, and fixed stars carry source/precision_class but keep
their coverage and review fields None.
ChartDrawer: theme defaults to "classic" but style defaults to
"modern" — two orthogonal knobs. Default filenames carry the style
suffix (" - Modern.svg" / " - Classic.svg"). external_view,
show_degree_indicators, show_aspect_icons are classic-only; glyph_size
("small"/"medium"/"large") and show_zodiac_background_ring are
modern-only and ignored in silence by classic.
- Time is local wall-clock +
tz_str; never pre-convert to UTC except
with from_iso_utc_time (which is UTC by contract).
- Sidereal coherence. The subject factories default a missing
sidereal_mode to FAGAN_BRADLEY, but the subject-less event factories
(and direct model construction) require it explicitly with
zodiac_type="Sidereal". sidereal_mode with Tropical raises; USER
mode needs both custom_ayanamsa_t0 and custom_ayanamsa_ayan_t0.
Also: ephemeris_session() rejects same-thread nesting (RuntimeError) — never
build a subject inside an open session (references/backends-and-provenance.md);
an empty list passed to to_context raises TypeError
(references/reports-and-ai-context.md).
Defaults worth knowing
- Zodiac Tropical · houses Placidus
"P" · perspective Apparent
Geocentric · chart style modern · chart theme classic.
- Active points (14): Sun–Pluto,
True_North_Lunar_Node, Chiron,
Ascendant, Medium_Coeli. (v5 had 18 — kerykeion.settings. V5_DEFAULT_ACTIVE_POINTS restores them.)
- Active aspects: conjunction/opposition/trine/square at 6°, sextile at 5°.
Predictive factories use a flat 3° set (
PREDICTIVE_ACTIVE_ASPECTS).
- Point-set and aspect-set presets, and where to import each:
references/subjects.md and references/aspects-and-orbs.md.
Not writing Python?
If the task is to run kerykeion from a terminal — a shell command, a
pipeline, a Makefile, cron, CI — the library ships an optional CLI
(pip install "kerykeion[cli]") that covers the same surface without any
Python, and the sibling kerykeion-cli skill documents it: the command
tree, the exit-code contract, the profile store, and the call dispatcher.
Reach for that one instead of generating a script to be run once.
Reference index
| File |
Read when the task involves |
references/api-index.md |
finding which file documents a given name |
references/subjects.md |
building/reading subjects, points, composites |
references/backends-and-provenance.md |
backends, env vars, sealed ranges, provenance |
references/zodiac-houses-perspectives.md |
sidereal, houses, perspectives, lots |
references/charts-and-drawing.md |
chart data, SVG drawing, themes, settings |
references/aspects-and-orbs.md |
aspects, orbs, declinations |
references/analysis.md |
dominants, compatibility, house comparison, midpoints |
references/predictive.md |
ephemeris series, transits, returns, progressions, solar arc |
references/mundane-events.md |
eclipses, lunations, stations, ingresses, star catalog |
references/calendars-hours-moon.md |
moon phase, sun times, planetary hours, VoC |
references/traditional.md |
profections, firdaria, ZR, horary, directions, dignities |
references/locational.md |
relocation, astrocartography |
references/reports-and-ai-context.md |
ReportGenerator, to_context |
references/utilities.md |
JD/ISO/timezone/angle helpers |
references/migration-and-deprecations.md |
v5→v6 migration, deprecations |
Scripts (run them, don't just read them):
scripts/quickstart.py — offline end-to-end sanity check (--svg DIR optional).
scripts/env_report.py — backend / env / ephemeris-coverage diagnostic; run it
when dates raise or the active backend is unclear.
1---2name: kerykeion3description: Write correct Python against kerykeion v6, the astrology library. Use this skill WHENEVER a task touches astrology or imports kerykeion: natal / synastry / transit / composite / return / progression / solar-arc charts and SVG wheels; aspects, orbs, declinations; dominants, relationship score, house comparison, midpoints, receptions; ephemeris series and transit timing; eclipses, lunations, stations, ingresses, heliacal / mundane / occultation events, planetary nodes and phenomena; profections, firdaria, zodiacal releasing, horary, primary directions; astrocartography and relocation; moon phase, sun times, planetary hours, void-of-course Moon; sidereal / ayanamsa, house systems, fixed stars, Arabic parts; text reports and LLM context (to_context). Trigger even if the user only says "birth chart", "zodiac", "horoscope", or "ephemeris", or pastes code importing kerykeion. Documents the real v6 API (factories in, models out), both ephemeris backends, sealed ranges, provenance, and the traps that break v5 code.4license: AGPL-3.05---67# Using Kerykeion89Verified against **kerykeion 6.0.1**, Python 3.12+.1011Kerykeion is a Python astrology library. Everything goes through **factories**:12you never construct models by hand. Factories return **Pydantic models** whose13point fields are `KerykeionPointModel` instances.1415**Accuracy rule for you:** field names, point names, house codes, ayanamsa16names, and env-var behavior in this skill are copied from the source. When you17need a detail not covered here, read the source18(`kerykeion/astrological_subject/factory.py`, `kerykeion/schemas/models.py`,19`kerykeion/schemas/literals.py`, `kerykeion/ephemeris_backend/backend.py`)20rather than guessing — the subject model has ~40 optional point fields: a21real field that was not activated reads as a silent `None`, while a22misspelled name raises `AttributeError`.2324## The one mental model2526```27LANE 1 — subject-centric (a person/event at a moment and place)2829AstrologicalSubjectFactory ──► subject (AstrologicalSubjectModel)30 │31 ├─► ChartDataFactory ──► chart data ──► ChartDrawer ──► SVG32 ├─► AspectsFactory / DominantsFactory / RelationshipScoreFactory /33 │ HouseComparisonFactory / MidpointFactory / traditional factories34 ├─► PlanetaryReturnFactory / SecondaryProgressionFactory / SolarArcFactory35 └─► ReportGenerator / to_context (text / LLM XML)3637LANE 2 — subject-less event searches (dates or Julian days + coordinates)3839EclipseFactory · LunationFinderFactory · RetrogradeStationFactory ·40SignIngressFactory · MundaneAspectFactory · HeliacalFactory ·41OccultationFactory · SunTimesFactory · VoidOfCourseMoonFactory · ...42```4344Two rules cover most charting tasks:45461. **Rendering an SVG is always two steps**: `ChartDataFactory.create_*_chart_data(...)`47 first, then `ChartDrawer(chart_data).save_svg(...)` or `.generate_svg_string()`.48 Never feed a raw subject to `ChartDrawer`.492. **A subject is the universal input** for lane 1. Build it once, reuse it.5051## Setup and environment5253```bash54pip3 install "kerykeion==6.0.1" # includes the default libephemeris backend55pip3 install "kerykeion[swiss]==6.0.1" # optional Swiss Ephemeris C backend56```5758Kerykeion reads exactly **five** environment variables:5960| Env var | Meaning |61|---|---|62| `KERYKEION_BACKEND` | `libephemeris` (default) or `swisseph` |63| `KERYKEION_LEB_MODE` | libephemeris mode: `leb` (sealed, default), `auto`, `skyfield`, `horizons` |64| `KERYKEION_EPHE_PATH` | directory of `.se1` files for swisseph |65| `KERYKEION_GEONAMES_USERNAME` | default GeoNames username for `online=True` |66| `KERYKEION_GEONAMES_CACHE_NAME` | overrides the GeoNames HTTP-cache DB path |6768`LIBEPHEMERIS_PRECISION` is **not** a kerykeion variable (it belongs to the69libephemeris tooling). Backend selection, sealed-mode semantics, and precision70metadata: `references/backends-and-provenance.md`.7172## Licensing — AGPL-3.0 (surface this for commercial use)7374Kerykeion is **AGPL-3.0**, strong copyleft that also covers network use75(SaaS/web backends), not just distributed software. When the user's context is76clearly commercial, proprietary, or closed-source, proactively flag this before77writing code that imports kerykeion, and present the compliant options:78791. **Commercial license** — the project is dual-licensed; contact80 `kerykeion.astrology@gmail.com`.812. **Hosted Astrologer API** — consuming its REST endpoints does not trigger82 copyleft on the caller: https://www.kerykeion.net/astrologer-api/subscribe8384For personal projects, research, education, or AGPL-compatible open source,85importing directly is fine — don't block those; just raise licensing when the86use case sounds closed-source. You are pointing to the project's own options,87not giving legal advice.8889## Offline vs online — read before writing any subject9091`from_birth_data(...)` defaults to `online=True`, which calls the GeoNames web92API and needs a `geonames_username` (or the env var). For reproducible,93network-free code **always pass `online=False` with `lng`, `lat`, `tz_str`**.9495**Pass `city`/`nation` even offline.** They are display labels echoed in96reports and `to_context` XML; omitted, they default to `"Greenwich"`/`"GB"`97regardless of coordinates. They affect no calculation — only the metadata.9899`hour`/`minute` are **local wall-clock time** in `tz_str`; kerykeion does the100DST/UTC conversion. Do not pre-convert to UTC (the one exception:101`from_iso_utc_time`, whose input IS UTC).102103## Canonical example — subject → data → SVG → report → LLM context104105```python106from kerykeion import (107 AstrologicalSubjectFactory, ChartDataFactory, ChartDrawer,108 ReportGenerator, to_context,109)110111subject = AstrologicalSubjectFactory.from_birth_data(112 name="Example Person", year=1990, month=7, day=15, hour=10, minute=30,113 lng=12.4964, lat=41.9028, tz_str="Europe/Rome",114 city="Rome", nation="IT", online=False,115)116print(subject.sun.sign, subject.sun.position) # "Can" 22.x — sign + degrees in sign117print(subject.ascendant.sign) # houses/axes always present118119chart_data = ChartDataFactory.create_natal_chart_data(subject)120svg = ChartDrawer(chart_data).generate_svg_string()121assert "<svg" in svg122123print(ReportGenerator(chart_data).generate_report(max_aspects=5)[:400])124print(to_context(subject)[:400]) # non-interpretive XML for prompts125```126127(`AstrologicalSubjectFactory`, `ChartDataFactory`, `ChartDrawer`,128`CompositeSubjectFactory`, `KerykeionSettingsModel` are the usual top-level129imports; the package root exports 124 names. Some public APIs are deliberately130subpackage-only — e.g. `kerykeion.utilities` helpers, `FixedStarCatalog`, the131named context serializers — and the references mark each one as **Subpackage132import** with its exact path.)133134## Reading results135136- Models are **subscriptable**: `subject.sun.sign` and `subject.sun["sign"]`137 are equivalent (`SubscriptableBaseModel`).138- Almost every *point* field is `Optional` — `None` unless requested via139 `active_points`. Guard access. The 12 house cusps and axes always exist.140- If Sun or Moon cannot be computed, the call **raises** `KerykeionException`;141 optional bodies that fail land in `subject.ephemeris_warnings` instead142 (structured `EphemerisWarningModel` entries — check the list, don't assume).143- Fixed stars live on `subject.fixed_stars`, read via144 `subject.find_fixed_star("regulus")` (case/space/dash-insensitive).145146## Capability routing — pick the API, then open the reference147148| You want to… | Use | Reference |149|---|---|---|150| Build a subject from birth data | `AstrologicalSubjectFactory.from_birth_data` | `references/subjects.md` |151| Build from a UTC instant / "now" | `from_iso_utc_time` (no `is_dst`/`seconds`), `from_current_time` | `references/subjects.md` |152| Extra bodies: asteroids, TNOs, Uranians, lots, cusps | `active_points` + point-set presets | `references/subjects.md` |153| Fixed stars on a chart | `active_fixed_stars` + `find_fixed_star` | `references/subjects.md` |154| Dignities, nakshatra, Gauquelin, nutation, local space | `calculate_*` flags | `references/subjects.md` |155| Midpoint/Davison composite of two people | `CompositeSubjectFactory` | `references/subjects.md` |156| Pick/force a backend; precision & provenance metadata | `BACKEND_NAME`, env vars | `references/backends-and-provenance.md` |157| Dates outside 1849–2150; ephemeris warnings; tiers | `EphemerisWarningModel`, `EphemerisRangeError` | `references/backends-and-provenance.md` |158| Sidereal zodiac / ayanamsa / custom ayanamsa | `zodiac_type`, `sidereal_mode` | `references/zodiac-houses-perspectives.md` |159| House systems; polar-latitude behavior | `houses_system_identifier`, `PolarHouseFallbackModel` | `references/zodiac-houses-perspectives.md` |160| Heliocentric / topocentric / planetocentric frames | `perspective_type`, `altitude` | `references/zodiac-houses-perspectives.md` |161| Arabic parts (lots) | `Pars_Fortunae` … in `active_points` | `references/zodiac-houses-perspectives.md` |162| Precompute chart data (any of the 7 chart types) | `ChartDataFactory.create_*_chart_data` | `references/charts-and-drawing.md` |163| Render SVG; themes, styles, languages, wheel-only, grid-only | `ChartDrawer` | `references/charts-and-drawing.md` |164| Element/quality balance, stelliums, angularities | `SingleChartDataModel` fields | `references/charts-and-drawing.md` |165| Chart colors, glyphs, translations | `KerykeionSettingsModel`, `kerykeion.settings` | `references/charts-and-drawing.md` |166| Aspects in one chart / between two charts | `AspectsFactory` | `references/aspects-and-orbs.md` |167| Declination parallels / contra-parallels | `*_declination_aspects` methods | `references/aspects-and-orbs.md` |168| Custom orbs, per-point orb maps, orb strategies | `PointOrbAdjustment`, `OrbAdjustmentStrategy` | `references/aspects-and-orbs.md` |169| Dominant planets/elements (3 methods, custom schools) | `DominantsFactory` | `references/analysis.md` |170| Relationship compatibility score (Discepolo) | `RelationshipScoreFactory` | `references/analysis.md` |171| A's planets in B's houses | `HouseComparisonFactory` | `references/analysis.md` |172| Midpoints + aspects to midpoints | `MidpointFactory` | `references/analysis.md` |173| Positions sampled over a date range | `EphemerisDataFactory` | `references/predictive.md` |174| Transit aspects over time; exact-hit refinement | `TransitsTimeRangeFactory` | `references/predictive.md` |175| Solar/lunar/heliocentric returns; node crossings; walking the sequence | `PlanetaryReturnFactory` | `references/predictive.md` |176| Secondary progressions | `SecondaryProgressionFactory` | `references/predictive.md` |177| Solar arc directions | `SolarArcFactory` | `references/predictive.md` |178| Eclipses (local or global search) | `EclipseFactory` | `references/mundane-events.md` |179| New/full moons over a range | `LunationFinderFactory` | `references/mundane-events.md` |180| Retrograde stations; sign ingresses; mundane aspects | `RetrogradeStationFactory`, `SignIngressFactory`, `MundaneAspectFactory` | `references/mundane-events.md` |181| Which sign a planet is IN over a range; whether it IS retrograde | `sign_periods_from_iso_range`, `retrograde_periods_from_iso_range` | `references/mundane-events.md` |182| Planetary nodes, phenomena, heliacal events, occultations | `PlanetaryNodesFactory`, `PlanetaryPhenomenaFactory`, `HeliacalFactory`, `OccultationFactory` | `references/mundane-events.md` |183| Search the fixed-star catalog | `FixedStarCatalog`, `FixedStarDiscoveryFactory` | `references/mundane-events.md` |184| Moon phase; sunrise/sunset; planetary hours; void-of-course | `MoonPhaseDetailsFactory`, `SunTimesFactory`, `PlanetaryHoursFactory`, `VoidOfCourseMoonFactory` | `references/calendars-hours-moon.md` |185| Profections, firdaria, zodiacal releasing | `ProfectionsFactory`, `FirdariaFactory`, `ZodiacalReleasingFactory` | `references/traditional.md` |186| Horary indicators; primary directions; receptions; dignities | `HoraryIndicatorsFactory`, `PrimaryDirectionsFactory`, `MutualReceptionsFactory` | `references/traditional.md` |187| Relocate a chart; astrocartography lines | `RelocatedChartFactory`, `AstroCartographyFactory` | `references/locational.md` |188| Text report of a subject / chart data / supported result (12 model types) | `ReportGenerator` | `references/reports-and-ai-context.md` |189| LLM/prompt-ready XML | `to_context` + named serializers | `references/reports-and-ai-context.md` |190| JD / ISO / timezone / angle helpers | `kerykeion.utilities` | `references/utilities.md` |191| v5 code breaks; ImportError; DeprecationWarning | removed-name map | `references/migration-and-deprecations.md` |192| "Where is X documented?" | full name → file index | `references/api-index.md` |193194If a name is marked **Subpackage import** in a reference, it is NOT importable195from bare `kerykeion` — use the exact import path shown there.196197## Top traps1981991. **v5 names raise `ImportError`.** `AstrologicalSubject`, `KerykeionChartSVG`,200 `NatalAspects`, `SynastryAspects` are gone; the error message includes the201 replacement AND the v6 default changes that alter results. `hasattr()` /202 `getattr(..., default)` also raise for these — feature-detect with203 `try/except ImportError`. See `references/migration-and-deprecations.md`.2042. **Offline needs `lng`/`lat`/`tz_str`** — and pass `city`/`nation` anyway or205 reports/`to_context` will say Greenwich.2063. **Stars ≠ points.** Fixed stars go in `active_fixed_stars`, come back on207 `subject.fixed_stars`. Star names inside `active_points` are redirected with208 a warning; an all-stars `active_points` raises.2094. **`active_points=[]` raises.** Pass `None` for the defaults. Unknown point210 names raise too (typos fail loudly).2115. **Optional points are `None` unless requested**; houses always exist;212 Sun/Moon failure raises; other omissions land in `ephemeris_warnings`.2136. **Sealed ephemeris range.** A fresh install covers **1849–2150**; outside it214 kerykeion **raises** (`EphemerisRangeError` / `KerykeionException`) instead215 of silently degrading. Widen with `libephemeris.download_leb_for_tier(...)`.2167. **Provenance populates on libephemeris only**, and `source="Keplerian"` is217 normal for default points on old dates (e.g. Chiron). Never match218 exhaustively on `source` values; house-geometry points have provenance219 `None` by design, and fixed stars carry `source`/`precision_class` but keep220 their coverage and review fields `None`.2218. **`ChartDrawer`: `theme` defaults to `"classic"` but `style` defaults to222 `"modern"`** — two orthogonal knobs. Default filenames carry the style223 suffix (`" - Modern.svg"` / `" - Classic.svg"`). `external_view`,224 `show_degree_indicators`, `show_aspect_icons` are classic-only; `glyph_size`225 (`"small"`/`"medium"`/`"large"`) and `show_zodiac_background_ring` are226 modern-only and ignored in silence by classic.2279. **Time is local wall-clock** + `tz_str`; never pre-convert to UTC except228 with `from_iso_utc_time` (which is UTC by contract).22910. **Sidereal coherence.** The subject factories default a missing230 `sidereal_mode` to `FAGAN_BRADLEY`, but the subject-less event factories231 (and direct model construction) require it explicitly with232 `zodiac_type="Sidereal"`. `sidereal_mode` with Tropical raises; `USER`233 mode needs both `custom_ayanamsa_t0` and `custom_ayanamsa_ayan_t0`.234235Also: `ephemeris_session()` rejects same-thread nesting (`RuntimeError`) — never236build a subject inside an open session (`references/backends-and-provenance.md`);237an empty list passed to `to_context` raises `TypeError`238(`references/reports-and-ai-context.md`).239240## Defaults worth knowing241242- **Zodiac** Tropical · **houses** Placidus `"P"` · **perspective** Apparent243 Geocentric · **chart style** `modern` · **chart theme** `classic`.244- **Active points (14)**: Sun–Pluto, `True_North_Lunar_Node`, `Chiron`,245 `Ascendant`, `Medium_Coeli`. (v5 had 18 — `kerykeion.settings.246 V5_DEFAULT_ACTIVE_POINTS` restores them.)247- **Active aspects**: conjunction/opposition/trine/square at 6°, sextile at 5°.248 Predictive factories use a flat 3° set (`PREDICTIVE_ACTIVE_ASPECTS`).249- Point-set and aspect-set presets, and where to import each:250 `references/subjects.md` and `references/aspects-and-orbs.md`.251252## Not writing Python?253254If the task is to run kerykeion from a **terminal** — a shell command, a255pipeline, a Makefile, cron, CI — the library ships an optional CLI256(`pip install "kerykeion[cli]"`) that covers the same surface without any257Python, and the sibling **`kerykeion-cli`** skill documents it: the command258tree, the exit-code contract, the profile store, and the `call` dispatcher.259Reach for that one instead of generating a script to be run once.260261## Reference index262263| File | Read when the task involves |264|---|---|265| `references/api-index.md` | finding which file documents a given name |266| `references/subjects.md` | building/reading subjects, points, composites |267| `references/backends-and-provenance.md` | backends, env vars, sealed ranges, provenance |268| `references/zodiac-houses-perspectives.md` | sidereal, houses, perspectives, lots |269| `references/charts-and-drawing.md` | chart data, SVG drawing, themes, settings |270| `references/aspects-and-orbs.md` | aspects, orbs, declinations |271| `references/analysis.md` | dominants, compatibility, house comparison, midpoints |272| `references/predictive.md` | ephemeris series, transits, returns, progressions, solar arc |273| `references/mundane-events.md` | eclipses, lunations, stations, ingresses, star catalog |274| `references/calendars-hours-moon.md` | moon phase, sun times, planetary hours, VoC |275| `references/traditional.md` | profections, firdaria, ZR, horary, directions, dignities |276| `references/locational.md` | relocation, astrocartography |277| `references/reports-and-ai-context.md` | `ReportGenerator`, `to_context` |278| `references/utilities.md` | JD/ISO/timezone/angle helpers |279| `references/migration-and-deprecations.md` | v5→v6 migration, deprecations |280281Scripts (run them, don't just read them):282283- `scripts/quickstart.py` — offline end-to-end sanity check (`--svg DIR` optional).284- `scripts/env_report.py` — backend / env / ephemeris-coverage diagnostic; run it285 when dates raise or the active backend is unclear.