Install
openclaw skills install @dynamicsalex/astro-natal-chartCalculates and interprets the natal chart by date, time and place of birth with the positions of planets, houses and main aspects. Windows OS 10/11 Required.
openclaw skills install @dynamicsalex/astro-natal-chartThis skill uses pyswisseph 2.10.3.2 for astrological computation and Pillow 12.x for graphical chart rendering.
| Requirement | Details |
|---|---|
| OS | Windows (x64) — tested on Windows 10/11 |
| Python | 3.14.x (bundled .pyd compiled for CPython 3.14) |
| Runtime | Microsoft Visual C++ Redistributable 2015–2022 (x64) — required for the bundled native extension |
| Pillow | 12.x — pip install pillow (for graphical wheel chart rendering) |
Installation steps:
winget install Microsoft.VCRedist.2015+.x64)pip install pillowAll astrological calculations flow through a single source of truth:
natal_chart_swe.py --json → JSON data → draw_wheel.py → PNG image
↕
natal_chart_swe.py → text output
natal_chart_swe.py is the sole calculation engine. draw_wheel.py only renders — it calls natal_chart_swe.py --json via subprocess and draws the wheel from that data. This guarantees text and graphical output always match.
python scripts/natal_chart_swe.py <date DD.MM.YYYY> <time HH:MM> <city>
python scripts/natal_chart_swe.py 14.12.1991 18:30 Ижевск
python scripts/natal_chart_swe.py <date> <time> <city> --json
python scripts/natal_chart_swe.py 14.12.1991 18:30 Ижевск --json
JSON structure:
{
"date": "14.12.1991", "time": "18:30", "city": "Ижевск",
"city_full": "Ижевск, Россия",
"lat": 56.8519, "lon": 53.2114, "tz": "Europe/Samara",
"tz_offset": 4, "jd": 2448605.104167,
"planets": {
"Sun": {"lon": 262.097, "speed": 1.017, "retro": false},
"Moon": {"lon": 354.459, "speed": 12.461, "retro": false},
...
},
"houses": [116.94, 130.43, ...],
"asc": 116.94, "mc": 352.89,
"planet_houses": {"Sun": 6, "Moon": 10, ...},
"aspects": [
{"p1": "Mercury", "p2": "Venus", "type": "semisextile", "orb": 0.5},
...
]
}
The skill includes scripts/draw_wheel.py — a full-featured natal chart wheel renderer that produces a composite PNG image.
Important: draw_wheel.py does NOT perform its own astrological calculations. It calls natal_chart_swe.py --json and renders the returned data. This eliminates data discrepancies between text and graphical output.
# English (default)
python scripts/draw_wheel.py
# Russian
python scripts/draw_wheel.py --lang ru
# Arbitrary birth data
python scripts/draw_wheel.py 24.04.1983 06:00 Ижевск --lang ru
# Explicit English
python scripts/draw_wheel.py --lang en
| File | Language |
|---|---|
natal_full.png | English chart (5760×2880) |
natal_full_ru.png | Russian chart (5760×2880) |
| | | |
| NATAL WHEEL | ESSENTIAL DATA | ZODIAC CIRCLE |
| (2160×2160) | (1440×2880) | (2160×2160) |
| | | |
| - Sign sectors | - Date, time, place | - Sign sectors |
| - House cusps | - Coordinates, timezone | - Planet marks |
| - Planet marks | - ASC / MC positions | - ASC/DSC/MC |
| - Aspect lines | | - Same size as |
| - ASC/MC lines | | natal wheel |
| | | |
| --- Legends --- | | |
| Planet|Element | | |
| |Aspect | | |
+------------------+---------------------------+------------------+
+------------------+---------------------------------------------+
| | |
| NATAL WHEEL | INTERPRETATION PANEL |
| (2160×2160) | (3600×2880) |
| | |
| - "NATAL CHART" | - Date, time, place, coordinates, tz |
| title + name | - ASC / MC positions |
| - Sign sectors | - Sun/Moon/ASC sign interpretation |
| - House cusps | - Dominant element, stelliums, retrogrades |
| - Planet marks | - All 12 houses with cusp positions, |
| - Aspect lines | house meanings, and planets in each |
| - ASC/MC lines | |
| | |
| --- Legends --- | |
| Planet|Element | |
| |Aspect | |
| | ClawHub link | |
+------------------+---------------------------------------------+
### Font Handling
Two bundled fonts in `scripts/`:
| Font | Purpose | Glyphs |
|---|---|---|
| `seguisym.ttf` (2.4 MB) | Zodiac symbols | ♈♉♊♋♌♍♎♏♐♑♒♓ (U+2648–U+2653) + latin |
| `segoeuisl.ttf` (854 KB) | All other text | Cyrillic, latin, digits, punctuation |
The `rtext()` function selects fonts **per character**: zodiac symbols → `seguisym.ttf`, everything else → `segoeuisl.ttf`. This ensures correct rendering of mixed content like "♈ Овен AR".
**Why not a single font?** No standard Windows font contains both zodiac symbols AND cyrillic. `seguisym.ttf` has zodiac but no cyrillic. `segoeui.ttf` has cyrillic but no zodiac. Per-character selection is the solution.
### Pillow Dependencies
`draw_wheel.py` uses these Python modules:
| Module | Purpose | Install |
|---|---|---|
| `PIL` (Pillow) | Image creation, drawing (circle, ellipse, line, pieslice, text) | `pip install pillow` |
| `math` | Trigonometric calculations (cos, sin, radians) | Stdlib |
| `json` | Parse natal_chart_swe.py JSON output | Stdlib |
| `subprocess` | Call natal_chart_swe.py --json | Stdlib |
| `os`, `sys` | File path operations | Stdlib |
| `argparse` | CLI argument parsing (`--lang en/ru`) | Stdlib |
Note: `draw_wheel.py` does NOT import `swisseph` directly. It receives all planetary data from `natal_chart_swe.py --json`.
---
## Standard Text Output Format
🌟 NATAL CHART [Swiss Ephemeris vX.XX] 📅 Date: [date] ⏰ Time: [time] 📍 Place: [city] 🌍 Coordinates: [lat], [lon] 🕐 Timezone: [tz] (UTC+/-offset) 📊 JD: [julian_day]
⬆️ ASC — [sign] [degrees]′ 🜨 MC — [sign] [degrees]′
PLANETS: ☀️ Sun — [sign] [degrees]′ [house] [℞] (speed °/day) 🌙 Moon — [sign] [degrees]′ [house] ...
HOUSES: I house — [sign] [degrees]′ ... (all 12 houses)
MAJOR ASPECTS: ☌ Conjunction: [planet]-[planet] (orb: X.X°) ...
INTERPRETATION: [detailed interpretation]
## Aspect Orbs
| Aspect | Symbol | Orb |
|--------|--------|-----|
| Conjunction | ☌ | ±8° |
| Opposition | ☍ | ±8° |
| Square | □ | ±7° |
| Trine | △ | ±7° |
| Sextile | ✶ | ±5° |
| Semisextile | ⚺ | ±2° |
| Quincunx | ⚹ | ±2° |
| Semisquare | ∠ | ±2° |
## Zodiac Signs — Keywords
- ♈ Aries: initiative, energy, impulsiveness
- ♉ Taurus: stability, sensuality, stubbornness
- ♊ Gemini: sociability, intellect, curiosity
- ♋ Cancer: emotionality, nurturing, intuition
- ♌ Leo: creativity, leadership, pride
- ♍ Virgo: analytical, practical, perfectionist
- ♎ Libra: harmony, diplomacy, partnership
- ♏ Scorpio: depth, transformation, intensity
- ♐ Sagittarius: optimism, philosophy, freedom
- ♑ Capricorn: ambition, discipline, responsibility
- ♒ Aquarius: originality, independence, innovation
- ♓ Pisces: intuition, compassion, dreaminess
## Planets — Meanings
- **Sun** — ego, essence, vitality, father
- **Moon** — emotions, subconscious, mother, instincts
- **Mercury** — thinking, communication, learning
- **Venus** — love, beauty, values, finances
- **Mars** — energy, action, aggression, sexuality
- **Jupiter** — expansion, luck, wisdom, growth
- **Saturn** — limitations, discipline, karma, structure
- **Uranus** — change, rebellion, innovation, suddenness
- **Neptune** — illusion, spirituality, creativity, dissolution
- **Pluto** — transformation, power, death/rebirth
## Houses — Life Areas
1. **I (ASC)** — personality, appearance, self-presentation
2. **II** — money, values, resources
3. **III** — communication, siblings, learning
4. **IV (IC)** — home, family, roots
5. **V** — creativity, children, romance
6. **VI** — health, work, routine
7. **VII (DSC)** — partnership, marriage
8. **VIII** — transformation, shared resources, intimacy
9. **IX** — philosophy, travel, higher education
10. **X (MC)** — career, reputation, goals
11. **XI** — friends, hopes, groups
12. **XII** — solitude, subconscious, karma
## Interpretation Guidelines
When interpreting, consider:
1. **Sun** — core personality
2. **Moon** — emotional nature
3. **Ascendant** — mask, first impression
4. **MC** — career aspirations
5. **Stelliums** (3+ planets in one sign/house)
6. **Retrograde planets** — energy turned inward
7. **Major aspects** — personality dynamics
8. **Dominant elements** (fire, earth, air, water)
## Disclaimer
This is an entertainment/educational tool, not a scientific method. Do not make medical or financial predictions based on astrological readings.
---
## Scripts Reference
| Script | Purpose | Dependencies |
|---|---|---|
| `scripts/natal_chart_swe.py` | **Sole calculation engine.** Text natal chart with `--json` export | swisseph (bundled .pyd), math, os |
| `scripts/draw_wheel.py` | **Renderer only.** Calls `natal_chart_swe.py --json`, draws 5760×2880 chart PNG | subprocess, json, math, os, argparse, Pillow |
| `scripts/seguisym.ttf` | **Zodiac symbol font.** Bundled for correct ♈♉♊... rendering. ~2.4 MB. | — |
| `scripts/segoeuisl.ttf` | **Cyrillic/latin font.** Bundled for cyrillic, digits, latin text. ~854 KB. | — |
| `scripts/swisseph.cp314-win_amd64.pyd.dat` | Bundled Swiss Ephemeris binary (2 MB) | MSVC++ Redist |
### draw_wheel.py — Quick Reference
```bash
# Generate chart with interpretation (English, default Matvey's data)
python scripts/draw_wheel.py
# Generate for any person (Russian)
python scripts/draw_wheel.py 24.04.1983 06:00 Ижевск --lang ru --name "Алексей"
# Generate for any person (English)
python scripts/draw_wheel.py 25.10.1985 21:35 Можга --lang en
# Options:
# --name "Person Name" — name shown above the wheel
# --lang ru|en — language of interpretation (default: en)
# --conclusion FILE — path to text file with AI-generated conclusion
# --frame FILE — path to .png.dat image (QR code). Default: bundled frame_small.png.dat
# Output files:
# natal_full.png — English version
# natal_full_ru.png — Russian version
# AI Conclusion workflow (for OpenClaw agents):
# Step 1: python scripts/natal_chart_swe.py <date> <time> <city> --json
# Step 2: AI analyzes JSON and writes conclusion to a file
# Step 3: python scripts/draw_wheel.py <date> <time> <city> --lang ru --name "Name" --conclusion <file>
# Text chart
python scripts/natal_chart_swe.py 14.12.1991 18:30 Ижевск
# JSON export (used by draw_wheel.py)
python scripts/natal_chart_swe.py 14.12.1991 18:30 Ижевск --json
segoeuisl.ttf does not contain them — now all aspect symbols use seguisym.ttf via extended is_z() checkseguisym--conclusion FILE flag: draw_wheel.py accepts a path to a text file with an AI-generated conclusion
natal_chart_swe.py --json → (2) AI generates conclusion → (3) draw_wheel.py ... --conclusion file.txtwrap_text() now uses per-panel width (1200px for Info, 2400px for Interp) — long descriptions properly wrap instead of being clipped--lang en)--lang ruscripts/interp_data.pyHOUSE_TEXTS_RU/EN, PLANET_MEANING_RU/EN, SIGN_KEYWORDS_RU/EN, ASPECT_MEANING_RU/EN{Name}_full_natal_{lang}.png (e.g. Анна_full_natal_ru.png, Anna_full_natal_en.png)interp_data.py contains all text constants, draw_wheel.py contains rendering logicPillow pieslice() uses a different coordinate system than cos/sin — sectors were drawn at mirrored positions, causing wrong element colors (Fire showed as Earth's green, Air as Water's blue, etc.). Replaced pieslice() with draw.polygon() using explicit aof(d) = radians(90-d) coordinate math, which is consistent with planet/symbol positioning.seguisym.ttf (2.4 MB, zodiac symbols) and segoeuisl.ttf (854 KB, cyrillic/latin) are both included in scripts/ and published with the pack.seguisym.ttf for zodiac symbols (large, 44pt), segoeuisl.ttf for cyrillic/latin/digits — bundled in scripts/rtext() automatically picks the right font per character — no more tofuseguisym.ttf (zodiac) + segoeuisl.ttf (cyrillic/latin) in scripts/get_symbol_font()/get_font() with single cached font() function that scans fallback chain and verifies glyph coveragecy + R_OUTER + 50, guaranteed zero overlap with the circular chartdraw_wheel.py removed all duplicate astrological calculation code
natal_chart_swe.py --json via subprocess for all planetary/house/aspect data--json flag to natal_chart_swe.py: exports all calculated data (planets, houses, aspects, metadata) as parseable JSONdraw_wheel.py [date] [time] [city] [--lang en/ru]
scripts/draw_wheel.py) using Pillow (PIL)
--lang en / --lang ru)
pip install pillow).pyd.dat loading on Windows — importlib.util.spec_from_file_location does not recognize non-standard extensions; added auto-copy to temporary .pyd before loading.pyd compiled with MSVC 14.44 requires vcruntime140.dll and friendsswe.calc_ut() using NASA JPL DE431 ephemeridesswe.houses_ex() (exact iterative Placidus) instead of analytical approximationsFLG_SPEED flag (velocity sign)swisseph.cp314-win_amd64.pyd (2 MB) in scripts/ — no system-wide pip installation requiredswe.__version__ returns int 20230604 — formatted as vYY.MM.BLD stringswe.julday()natal_chart.py, placidus_iterative.py, placidus_meeus.py and all debug/fix scripts (11 files)