This skill calculates daily transits over a natal chart and generates an astrological forecast for any target date specified by the user (past, present, or future). It renders a composite 2-column chart showing a combined natal+transit wheel and a wide textual forecast panel.
All planetary positions are computed using the Swiss Ephemeris library (pyswisseph 2.10.3.2), which is based on NASA's JPL DE431 ephemerides. This ensures planetary position accuracy of approximately 0.003° — the same engine used by professional astrologers and astronomy software worldwide. House cusps are calculated using the Placidus system with exact iterative methods ( swe.houses_ex()).
RequirementDetailsOSWindows (x64)Python3.14.xRuntime****Microsoft Visual C++ Redistributable 2015–2022 (x64)Pillow12.x — pip install pillowSwiss EphemerisBundled as swisseph.cp314-win_amd64.pyd.dat
text
daily_transits.py --json → JSON data (natal + transits + aspects + houses) → draw_daily.py → PNG image
↕
daily_transits.py → text forecast output
daily_transits.py is the sole calculation engine powered by Swiss Ephemeris. draw_daily.py renders the chart by calling it via subprocess. This guarantees text and graphical output always match.
The natal chart is the birth snapshot — positions of planets at the moment of birth. This never changes. Computed once from birth date, time, and location.
Transit positions are where the planets are on the user-specified target date (default: today). The user can request a forecast for any date — yesterday, tomorrow, or years in advance.
When a transit planet forms an angle (aspect) with a natal planet, it activates that natal planet's energy. Aspect lines are drawn directly on the wheel:
AspectSymbolMeaningLine StyleConjunction☌Fusion of energies — powerful, direct impactSolidOpposition☍Tension, confrontation, awareness through contrastSolidTrine△Harmony, flow, luck — energy works naturallySolidSquare□Challenge, friction — crisis that mobilizesSolidSextile✶Opportunity — potential that needs actionSolidSemisextile⚺Subtle influence, minor adjustmentsSolidSemisquare∠Irritation, minor tensionSolidQuincunx⚹Adjustment needed, discomfortSolidRetrograde℞Transit planet moving backwardDashed
Transit planets falling in specific natal houses show which life areas are activated. Each house is displayed with:
HouseLife AreaIPersonality, appearance, selfIIMoney, values, resourcesIIICommunication, siblings, learningIVHome, family, rootsVCreativity, children, romanceVIHealth, work, routineVIIPartnership, marriageVIIITransformation, shared resourcesIXPhilosophy, travel, higher educationXCareer, reputation, public lifeXIFriends, groups, hopesXIISubconscious, solitude, karma
An extended forecast summary is generated, including:
When run through OpenClaw, the AI agent can provide an enhanced conclusion via the --conclusion flag.
bash
# Forecast for today
python scripts/daily_transits.py 24.04.1983 07:00 Ижевск --lang ru --name "Алексей"
# Forecast for any specific date (past, present, or future)
python scripts/daily_transits.py 24.04.1983 07:00 Ижевск --target-date 04.06.2026 --lang ru
# English output
python scripts/daily_transits.py 24.04.1983 07:00 Ижевск --lang en
# JSON output (for renderers / AI)
python scripts/daily_transits.py 24.04.1983 07:00 Ижевск --json --target-date 04.06.2026
bash
# Chart for today (Russian)
python scripts/draw_daily.py 24.04.1983 07:00 Ижевск --lang ru --name "Алексей"
# Chart for any specific date
python scripts/draw_daily.py 24.04.1983 07:00 Ижевск --target-date 04.06.2026 --lang ru --name "Алексей"
# With AI-generated conclusion from file
python scripts/draw_daily.py 24.04.1983 07:00 Ижевск --target-date 04.06.2026 --lang ru --name "Алексей" --conclusion conclusion.txt
# English
python scripts/draw_daily.py 24.04.1983 07:00 Ижевск --target-date 04.06.2026 --lang en --name "Alexey"
ArgumentDescriptiondateBirth date DD.MM.YYYYtimeBirth time HH:MMcityBirth city--target-dateForecast date DD.MM.YYYY (default: today). Can be any date — past, present, or future.--langLanguage: ru or en (default: ru)--namePerson's name for display--jsonOutput JSON instead of text--conclusionPath to text file with AI-generated conclusion (for draw_daily.py)
json
{
"name": "Алексей",
"birth_date": "24.04.1983",
"birth_time": "07:00",
"birth_city": "Ижевск, Россия",
"target_date": "04.06.2026",
"natal": {
"Sun": {"lon": 33.38, "speed": 0.974, "retro": false},
"Moon": {"lon": 172.92, "speed": 14.116, "retro": false},
...
},
"transits": {
"Sun": {"lon": 103.5, "speed": 0.955, "retro": false},
...
},
"transit_houses": {"Sun": 12, "Moon": 9, ...},
"planet_houses": {"Sun": 12, "Moon": 6, ...},
"houses": [asc_deg, ..., mc_deg],
"asc": 1.83,
"mc": 22.92,
"aspects": [
{"transit": "Sun", "natal": "Venus", "type": "conjunction", "symbol": "☌", "name": "Соединение", "nature": "powerful", "orb": 1.3}
],
"engine": "Swiss Ephemeris v20230604"
}
text
+------------------+---------------------------------------------+
| | |
| COMBINED | FORECAST PANEL |
| WHEEL | (3600×2880) |
| (2160×2160) | |
| | - Date header + name |
| - Sign sectors | - Key aspects (colored planet names) |
| - House cusps | - Aspect descriptions (word-wrapped) |
| - Natal planets | - House activations (detailed, like natal |
| (pale, inner | chart skill): |
| orbit RP=520) | • House title + description |
| - Transit | • Transit planet (ME ♉ 12°30') in house |
| planets | • Interpretation of transit in house |
| (bright, outer| • Natal planet activation context |
| orbit RP=720) | - AI Conclusion (extended forecast) |
| - Aspect lines | |
| (solid=color, | |
| dashed=retro) | |
| | |
| --- Legends --- | |
| Planet|Element | |
| |Aspect|Retro | |
+------------------+---------------------------------------------+
Two bundled fonts in scripts/:
FontPurposeExtensionseguisym.ttf.datZodiac symbols ♈♉♊... + aspect symbols ☌☍△□....dat (ClawHub-compatible)segoeuisl.ttf.datCyrillic, latin, digits.dat (ClawHub-compatible)
Both are auto-copied to .ttf at runtime for Pillow compatibility. Per-character font selection ensures zodiac and aspect symbols render correctly alongside Cyrillic/Latin text.
ScriptPurposeDependenciesscripts/daily_transits.pySole calculation engine. Swiss Ephemeris planetary positions, house cusps (Placidus), aspect detection. Text forecast + JSON export.swisseph, math, jsonscripts/draw_daily.pyRenderer. Calls daily_transits.py --json, draws 5760×2880 chart with combined wheel + forecast panel.subprocess, json, math, Pillowscripts/swisseph.cp314-win_amd64.pyd.datSwiss Ephemeris binary (2 MB) — JPL DE431 ephemeridesMSVC++ Redistscripts/seguisym.ttf.datZodiac + aspect symbol font (2.4 MB)—scripts/segoeuisl.ttf.datCyrillic/latin font (854 KB)—
text
Step 1: python scripts/daily_transits.py <date> <time> <city> --json --target-date <date>
Step 2: AI analyzes JSON and writes enhanced conclusion to a file
Step 3: python scripts/draw_daily.py <date> <time> <city> --lang ru --name "Name" --conclusion <file>
When --conclusion is provided, the AI-generated text is used verbatim. Otherwise, the script generates a built-in conclusion.
This is an entertainment/educational tool, not a scientific method. Do not make medical or financial decisions based on astrological readings.