2026-03-18
Bugfixes:
- Modern chart decluttering order (v5.12.8): Fixed a bug where planets in a tight cluster on
style="modern"charts could be pushed past their neighbours, violating true zodiacal order (e.g. Neptune at 5° Aquarius rendered after Uranus at 17° Aquarius). The collision-resolution algorithm in_resolve_planet_collisionswas rewritten from a 5-pass iterative push (vulnerable to wraparound overshoots) to a single-pass largest-gap linearization that is monotonic by construction: planets are cut at the largest gap in their true zodiacal angles and walked forward once withdisplay_angle = max(desired_linear, prev_linear + sep). Order is preserved andmin_separationis respected without iterative refinement. Reproduced by any dense stellium (≥3 planets within ~8°); regression covered bytests/core/test_modern_decluttering.py.
New Features:
-
Retrograde indicator on classic wheel (v5.12.7): The ℞ (retrograde) symbol is now rendered next to retrograde planet glyphs directly on the classic style chart wheel. Previously, retrograde status was only visible in the sidebar grid and in modern style charts. The symbol appears at the bottom-right foot of each retrograde planet glyph on both inner-ring (natal) and outer-ring (transit/synastry) planets. A
kr:retrograde="true"attribute is also added to the planet group elements for programmatic consumers. -
House cusp speeds (v5.12.1): Replaced
swe.houses_ex()withswe.houses_ex2()to expose cusp velocities. All 12 house cusps and the 4 angular points (ASC, MC, DSC, IC) now carry aspeedfield (degrees/day) representing the real rate of diurnal motion. Useful for primary directions and profection techniques. -
Expanded fixed stars (v5.12.2): Grew the fixed star catalogue from 2 to 23 stars. The 21 new stars are: Aldebaran, Antares, Sirius, Fomalhaut, Algol, Betelgeuse, Canopus, Procyon, Arcturus, Pollux, Deneb, Altair, Rigel, Achernar, Capella, Vega, Alcyone, Alphecca, Algorab, Deneb_Algedi, and Alkaid. The set now includes all 15 Behenian stars of the medieval/Hermetic tradition and the 4 Royal Stars of Persian/Hellenistic astrology (Regulus, Aldebaran, Antares, Fomalhaut). Each fixed star now also reports apparent visual magnitude via
swe.fixstar2_mag()and equatorial declination. -
Expanded sidereal modes (v5.12.3): Grew supported ayanamsa systems from 20 to 47 named modes plus a
USERmode for custom ayanamsa definitions (48 total). New mode families include additional Indian/Vedic variants (Aryabhata, Suryasiddhanta, True Citra/Pushya/Revati, Lahiri sub-variants), Babylonian systems (Britton), galactic alignment systems, and the Valens Moon ayanamsa. TheUSERmode acceptscustom_ayanamsa_t0(reference epoch as Julian Day) andcustom_ayanamsa_ayan_t0(ayanamsa offset in degrees at that epoch). -
Ayanamsa value exposure (v5.12.4): Added
ayanamsa_valuefield toAstrologicalBaseModel. For sidereal charts, this contains the computed angular offset (in degrees) between tropical and sidereal 0 Aries at the chart's date/time.Nonefor tropical charts. Calculated viaswe.get_ayanamsa_ex_ut(). -
SVG rendering for new stars: Added SVG symbol definitions, CSS color variables (all 6 themes), chart default settings, and weighted point weights for all 21 new fixed stars. Each star has a unique icon representing its traditional astronomical/astrological character.
-
Right-panel aspect layout: Charts with more than 24 active points now render the aspect list/grid to the right of the wheel instead of below it, preventing excessive vertical growth. Controlled by the internal
_RIGHT_PANEL_POINTS_THRESHOLDconstant. -
Fixed star color contrast: Darkened 7 fixed star colors in the classic theme (Sirius, Procyon, Canopus, Capella, Deneb, Altair, Pollux) for better visibility against white/light backgrounds.
-
styleandshow_zodiac_background_ringon constructor: Promotedstyleandshow_zodiac_background_ringfrom render-method-only arguments (v5.11) toChartDrawer.__init__()keyword arguments. This allows setting a per-instance default that applies to all subsequent render calls, while still permitting per-render overrides via the_UNSETsentinel pattern.
New Fields (all Optional, default None -- no breaking changes):
KerykeionPointModel.speed-- daily motion in degrees/dayKerykeionPointModel.declination-- equatorial declination in degreesKerykeionPointModel.magnitude-- apparent visual magnitude (fixed stars only)AstrologicalBaseModel.ayanamsa_value-- ayanamsa offset in degrees (sidereal only)AstrologicalBaseModel.aldebaranthrough.alkaid-- 21 new fixed star fieldsChartConfiguration.custom_ayanamsa_t0-- Julian Day reference epoch for USER modeChartConfiguration.custom_ayanamsa_ayan_t0-- ayanamsa degrees at t0 for USER mode
Documentation:
- Comprehensive docstrings for all new/modified functions explaining Indian astrology concepts (ayanamsa, sidereal zodiac, precession) for Western astrology users
SiderealModeliteral now includes a full docstring with mode families, typical ayanamsa values, and USER mode usageAstrologicalPointliteral docstring corrected and expanded with fixed star categorization (Royal Stars, navigational stars)- All factory methods (
from_birth_data,from_iso_utc_time,from_current_time) document custom ayanamsa parameters _calculate_housesdocstring documentshouses_ex2switch and cusp speed semantics_calculate_planetsfixed stars section updated for 23 stars with magnitude/declinationFIXED_STARSconstant annotated with star identifications and magnitudesALL_ACTIVE_POINTSandDEFAULT_ACTIVE_POINTSorganized with section comments
Tests:
- 266 dedicated v5.12 tests across 9 test classes covering house cusp speeds, expanded fixed stars, star magnitudes, star declinations, sidereal modes, USER-defined ayanamsa, ayanamsa value exposure, and guiding principles (no breaking changes)
2026-03-18
New Features:
-
Added modern chart style — a concentric-ring layout alternative to the classic wheel. Pass
style="modern"tosave_svg(),generate_svg_string(),save_wheel_only_svg_file(), orgenerate_wheel_only_svg_string(). The modern layout renders 5 rings: cusp/zodiac signs, graduated ruler scale, planet data clusters, house numbers, and aspect lines with midpoint glyphs. Works with all six themes and all chart types (Natal, Synastry, Transit, Lunar/Solar Return, Composite). -
Added
show_zodiac_background_ringparameter (modern style only) — when set toFalse, omits the colored zodiac wedges from the outer ring. -
Added
KerykeionChartStyleliteral type ("classic"|"modern") tokerykeion.schemas. -
New drawing module
kerykeion.charts.draw_modernwithdraw_modern_horoscope()anddraw_modern_dual_horoscope()functions. -
New SVG template
kerykeion/charts/templates/modern_wheel.xmlfor standalone modern wheel rendering.
Bugfixes:
- Fixed modern chart zodiac background ring using only 2 alternating colors instead of the full per-element color cycle. The outer ring now matches the classic chart's 4-color element pattern (fire/earth/air/water) in the default theme, with all 12
--kerykeion-modern-zodiac-bg-*CSS variables properly defined across all 6 themes. - Fixed ruler ring ticks to be uniformly spaced across the full 360° circle.
- Fixed planet cluster sub-element sizes and reduced size progression for better readability.
Documentation:
- Added 2×2 chart style showcase grid (classic/modern × default/dark) to README
- Added Modern Chart Style section to README with examples for Natal, Synastry, Transit, and Wheel-Only
- Added
site/examples/modern-charts.mdexample page - Added
site/docs/charts.mddocumentation with modern style API reference - Added several new example/documentation pages (active points, ephemeris data, house comparison, transits time range)
- Simplified
MIGRATION_V4_TO_V5.md— content moved to main documentation site
Tests:
- Added 36+ comprehensive modern chart style tests covering all chart types, themes, and rendering modes
- Added tests for
show_zodiac_background_ring=Falseacross chart types - Added modern SVG baselines to the regeneration pipeline (
regenerate:svg:modernpoe task)
Maintenance:
- Updated all 6 CSS themes with modern-style variables
- Added
scripts/generate_modern_baselines.pyandscripts/regenerate_docs_charts.py - Added example script
examples/modern_chart_john_lennon.py
Released 26/02/2026
Breaking Changes:
- Context Serializer XML Migration: The
to_context()function and all*_to_context()helper functions now produce well-formed XML output instead of plain text. This affects all 13 converter functions. XML uses semantic tags with attributes (e.g.<point name="Sun" sign="Capricorn" ... />), self-closing tags for atomic data, and nested tags for structured data. Optional/Nonefields are omitted from the output rather than rendered as empty tags. All values are properly escaped viaxml.sax.saxutils.
New Features:
- Added
moon_phase_overview_to_context()— serializesMoonPhaseOverviewModelto XML with full support for all nested fields (moon summary, sun info, location, zodiac, upcoming phases, eclipses, visibility, illumination details, events) - Added
MoonPhaseOverviewModelsupport in theto_context()dispatcher
Bugfixes:
- Fixed house cusp sign abbreviation in context serializer output (e.g.
"Ari"now correctly rendered as"Aries"viaSIGN_FULL_NAMESmapping) - Fixed
llms.txtimport example (added missingAstrologicalSubjectFactory,ChartDataFactoryimports)
Documentation:
- Updated
README.mdAI Context Serializer section with XML output examples - Updated
site/docs/context_serializer.mdwith XML format documentation and examples - Updated
kerykeion/llms.txtSection 6 to document XML output format - Updated
examples/context_serializer_example.pywith Element/Quality Distribution and Moon Phase Overview examples
Tests:
- Rewrote all context serializer test assertions for XML format in
tests/core/test_context_serializer.py - Added 17 tests for
MoonPhaseOverviewToContextcovering all nested branches (zodiac, moonrise/moonset, eclipses, detailed position, visibility, illumination, events, sun info, extended location) - Extended
TestNonQualitativeOutputto verify subject, natal chart, synastry chart, and moon phase overview outputs - Added synastry relationship score, transit data, house comparison, and point-in-house assertion enhancements
- Removed 2 dead stub tests
- Updated 7 context serializer edge case test classes for XML assertions
Released 26/02/2026
New Features:
-
Added
MoonPhaseDetailsFactory— a new factory class that computes detailed moon phase information from anAstrologicalSubjectModel. Uses Swiss Ephemeris binary search (1-second precision) to find exact times of upcoming and previous New Moon, First Quarter, Full Moon, and Last Quarter. Also computes illumination percentage, waxing/waning stage, moon age, lunar cycle progress, next lunar/solar eclipses, sunrise/sunset, solar noon, day length, and Sun/Moon zodiac signs. -
Added
MoonPhaseOverviewModelreport support inReportGenerator— a new"moon_phase_overview"report kind that renders all moon phase details as a human-readable text report with sections for Moon Summary, Illumination Details, Upcoming Phases, Next Lunar Eclipse, Sun Info, Next Solar Eclipse, and Location.
Documentation:
- Added
moon_phase_details_factory.mddocumentation page with API reference, nested data access patterns, JSON serialization, precision notes, and edge cases - Added
moon-phase-details.mdexamples page with practical usage examples (basic usage, upcoming phases, eclipses, sun times, report generation, JSON export, zodiac info, location metadata) - Updated
report.mdwith Moon Phase Overview Report section and configuration table - Updated
index.mdwith Moon Phase Details Factory link in the Forecasting section - Updated
README.mdwith Moon Phase Details section, code example, and links to documentation
Tests:
- Added 54 mocked unit tests for
MoonPhaseDetailsFactory(helper functions, fullfrom_subject()with mocked Swiss Ephemeris layer, null/failure edge cases, phase angle boundary tests) - Added 21 report tests with golden snapshot fixture for moon phase overview
- Added 2042 historical verification tests against AstroPixels reference data (2001–2040), covering angle accuracy, phase names, emojis, factory major_phase, illumination, waxing/waning stage, upcoming phases, eclipse predictions, synodic month bounds, and 28-phase boundary mapping
Bugfixes:
- Fixed
ReportGeneratorcrash when_primary_subjectisNone(added defensiveassertguards in_build_subject_report,_build_single_chart_report, and_build_dual_chart_report) - Fixed pre-existing
RelationshipScoreFactorycode snippet bug inREADME.md(wrong method name and field names) - Fixed frontmatter ordering collision between
transits_time_range_factory.mdandephemeris_data_factory.md
Maintenance:
- Added
charts_output/to.gitignore - Added example scripts:
moon_phase_report_example.py,moon_phase_json_example.py
Released 26/02/2026
Bugfixes:
- Fixed degree label rotation on SVG chart outer ring.
Maintenance:
- Removed legacy chart drawing module (
draw_planets_legacy.py)
Released 24/02/2026
New Features:
-
Added
is_diurnalfield toAstrologicalSubjectModel— a boolean indicating whether the chart is diurnal (Sun above horizon) or nocturnal (Sun below horizon). This sect classification is calculated using the Sun's geometric altitude viaswe.azalt(), making it independent of house system, zodiac type, and perspective type. -
Added
--arabic-partsoption toregenerate_all.pyfor generating Arabic Parts snapshots (expected_arabic_parts.py)
Bugfixes:
-
Fixed day/night chart detection for Arabic Parts (Pars Fortunae, Spiritus). The previous logic used house position (
house < 7) which was astronomically inverted — houses 1-6 are below the horizon (night), not above. The fix uses the Sun's geometric altitude, which is astronomically precise and house-system independent. -
Fixed Arabic Parts calculation for sidereal and heliocentric charts. Previously, the day/night detection used the Sun's position from the chart's coordinate system (sidereal or heliocentric), which gave incorrect results. Now it always uses a tropical geocentric reference position.
Improvements:
-
Refactored
regenerate_all.pyto usemodel_dump(exclude_none=True)instead of manual field extraction, making it future-proof for new model fields -
Simplified
_compute_is_diurnal()with a single fallback toTrue(diurnal) when calculation fails, with clear warning logging -
Added comprehensive test coverage for
is_diurnal(15 tests) and Arabic Parts (68 tests total)
Released 18/02/2026
Bugfixes:
- Fixed floating point comparison in
is_point_between()function that causedValueErrorcrashes when a planet falls exactly on a house cusp (difference ~1e-15°). The fix usesmath.isclose()instead of exact equality (==). This affected Carter, Krusinski, and Uranian house systems.
Released 05/02/2026
New Features:
- Added support for
KERYKEION_GEONAMES_USERNAMEenvironment variable to configure GeoNames API username without code changes
Bugfixes:
- Regenerated extended chart SVG baselines (strawberry theme, sidereal×theme combinations, house system×chart type combinations) to align with the precise orb comparison fix from v5.7.1
- Updated relationship score test expectations to reflect stricter aspect filtering
- Fixed
regenerate:alltask to includeregenerate_test_charts_extended.pyscript, preventing future baseline drift
Maintenance:
- Added
regenerate:charts-extendedpoe task for regenerating extended test charts
Released 08/01/2023
Bugfixes:
- fixing float-int presidence bug
Dependency Updates:
- Updated
pydanticto2.5
Credits:
- Thanks to @jackklika for the PR, more details here
Released 05/03/2024
New Features:
Allow UTC datetime to be passed in the constructor as an alternative to year, month, day, hour, minute and timezone (#108)
Credits:
- Thanks to @jackklika for the PR, more details here
- AstrologicalSubject Is now possible to disable Chiron calculation with
disable_chiron=Truefor better compatibility with older dates. - New module enums added for better type hinting, still to be expanded and really used.
- Fixed | bug for compatibility with Python 3.9
- Now the
lunar_phasecontains also thelunar_phase_nameproperty, which is a string representation of the phase. - Minor general cleanup and refactoring of the codebase.
A lot of refactoring and clean up.
Fix: In the old version the 4 last planets of the Transit chart were always removed, now we check if those are Axes and then
remove them.
Added the optional minify argument to makeTemplate in the charts module.
- Added the
sidereal_modeargument to theAstrologicalChartclass to allow differet Ayanamsa calculation methods.
- Added different House Systems to the
AstrologicalChartclass.
- Added Lilith to astrological calculations and chart rendering.
- Deprecated
disable_chironin favor ofdisable_chiron_and_lilithwith deprecation warning. - Updated configuration in
kr.config.jsonfor Lilith settings.
- Added themed astrological charts (
themeparameter), including Classic, Dark, Dark High Contrast, and Light themes. - Added wheel-only charts and separate aspect table SVG.
- Added grid view for aspect tables in synastry and transit charts.
- Added
chart_languageparameter to set chart language (EN, FR, PT, ES, TR, RU, IT, CN, DE). - Enhanced
get_settingsfunction to accept a dictionary orKerykeionSettingsModelinstance.
- Added support for True and Mean Lunar Nodes (
true_node,true_south_node,mean_node,mean_south_node). - Default activation of mean nodes; configurable activation of true nodes via
kr.config.json.
- Customizable Geonames cache timeout (default extended from 24 hours to 30 days).
Credits:
- Thanks to @tomshaffner for the idea and implementation.
- Explicit calculation of Ascendant (AC), Descendant (DC), Midheaven (MC), and Imum Coeli (IC) axes.
- Introduced
axial_cusps_names_listparameter and replacedcheck_if_betweenwithis_point_betweenutility. - Configuration updates for axes in
kr.config.json.
Credits:
- Thanks to @fkostadinov for implementing these changes in PR #138.
- Added
active_pointsparameter toKerykeionChartSVGfor runtime specification of active planets and axial cusps.
- Added
active_aspectsparameter toKerykeionChartSVGfor runtime specification of active aspects and orbs.
- Added composite charts feature: create composite subjects and charts using the midpoint method.
- Introduced
TransitsTimeRangeFactoryfor calculating transit events across specified time ranges. - Added
get_ephemeris_data_as_astrological_subjectsmethod inEphemerisDataFactory. - Added
p*_ownerfields in aspect models for subject identification innatal_aspectsandsynastry_aspects.