My books are open! You can find information about readings with me at the end of this newsletter. I hope to meet you soon! :)
Edit 2025-08-12: this project is now named Ephem and can be found on PyPI! Wait for a devlog installment on the Virgo new moon.
I wrote an entire post about getting my feet wet with pyswisseph, a Python extension to the Swiss Ephemeris C library, that I'm leaving up on my new devlog for archival purposes, milestone purposes. I look back on it and feel like I've aged because what's transpired in the mere work week since is the Python bootcamp I've lacked for the last half-year of halfassing learning this language. What I needed was a project and a dataset that I would actually use.
Basically, my complaints about Astrolog are very few but fairly large:
Makefile
into my path, it can't find my astrolog.as
unless I'm working from the root directory. This also means it can't find its own dang ephemeris files, at least not all of them, so it throws an error like SwissEph file 'seas_18.se1' not found in PATH '.;:;:~/astrolog/'
and then tells you the five default asteroids are all at 0 Aries 0 00. I don't know C++ and barely know what I'm doing when I build Neovim from source, so I get that this could be circumvented by make install
but don't have any idea how to get there.astrolog.as
when I run astrolog -n
for the chart of the moment, which I very much deeply understand is important since I read Bruce Scofield's Astrological Chart Calculations and not truly secret if you have an ascendant and midheaven from which to reverse engineer, but you can imagine I, a Linux user, am a little weird about privacy.My goal in writing my own astrology CLI was basically to truncate the output of astrolog -n
, which I run for electional astrology, and make a wee ascendant clock for my tiling window manager. That part is a success:
This is really all I need for day-to-day elections (e.g. when to hit "post") if I have a fairly good visualization of current transits in my head, but degrees are good to know for comparison to my natal chart.
My CLI is creatively called chart
π (throwing the emoji after it in case the code
formatting isn't clear), and it's literally brand new. I mean three days old. I have another offline repo called electional
that's a few days older for the monstrous first draft that's an about 400-line single .py
file because I didn't know any better until I had the bright idea of looking at Python projects on GitHub to see how real devs structure these things and break them apart into files, so I started anew. Here's its birth data (first commit):
commit 7587dc9634fd682a5a1b40da0f4e54498d34adde
Author: sailorfe <sailorfe@proton.me>
Date: Wed Aug 6 13:57:13 2025 -0400
And here's what that looks like in itself:
11th house chart ruler! hope that means this is my first open source project to ever get an outside contribution lol
The three adjectives I'm using for chart
π are "minimal, opinionated and configurable." Opinionated is the most relevant word to readers of this letter, though, because this isn't a devlog and you all aren't programmers, in general, so instead I'll talk briefly about the philosophy behind this very consuming project that I'm deep (deep) inside of and what it's taught me about the recent history of astrology.
The math of astrology is actually dead simple, though I made an ephemeris-less sidereal time calculator a while back as basically my notes while reading Scofield. It's been relatively easy for centuries because astronomers and astrologers have been writing ephemerides for centuries, and tables of houses for quadrant systems (Placidus and Koch) for decades, at least. All the pre-computer astrologer had to do was algebra.
Developers, especially for UIs, like to use the phrase "sane defaults" to mean user-friendly, plug-and-play software. Sanity is a loaded word on its own, but in the context of astrology or anything with a long history and plural traditions, it's a bit violent. The order I'm writing chart
π and some of its featuresβor lack of featuresβare incredibly biased toward premodern astrology in revival among my peers, but no more biased than Astrolog or SolarFire.
The majority of widely used astrology software began development in the 80s and 90s, so logically at the tail end of the era of, say, psychological and humanistic astrologers like Stephen Arroyo and Dane Rudhyar (a white man). Before I ever used Astrolog offline, I read Walter Pullen's by-sign-and-house interpretations you can get by combing through Astro.com's 'Extended chart selection,' which are really two sentence-strings concatenatd together like:
Moon in Virgo and 7th House: Your emotional nature, moods, feelings, and caring tendencies is analytical, critical, modest, helpful, and works toward perfection. Most often this manifests in the area of life dealing with personal relationships and intimacy.
This seems innocuous, right? But to any other astrologer my age, it's so specific and obvious in what tradition it comes from. This concern with context and grounding one's practice and studies in some sort of lineage is fairly new, which is to say I only ever hear astrologers my age speak in these terms. Otherwise, I think the pseudoscience of this art lets people get away with speaking authoritatively without showing their work or who they learned from. To bring the tech term to the table, here are some of Astrolog and its peers' "sane defaults":
astrolog
called with no command switches prompts you to input information for specific event, assuming you do not want to see the chart of the current moment.I don't begrudge any of these software or their developers these biases because I have plenty of my own! The difference is i'm declaring chart
's π defaults as delibrately narrow:
houses
function to get the Asscendant and Midheaven.chart now
with no arguments and no config file, you get an angle-less list of placements like the "ββ½βΏ" at the top right of the Astro.com UI gives you. So chart
π biases electional astrology and the premise that astrology is alive.if key == "hg":
hg_lng = planets[2]['lng']
ae_lng = planets[0]['lng']
color = "red" if hg_lng < ae_lng else "blue"
else:
color = default_color
Even the code that no end-user sees, little in-jokes to myself betray my context as a medievalist: I use the heavenly metals from alchemy as variable names for the planets! Mercury is Hg (mercury/quicksilver), the sun is Ae (gold).
The project is literally a baby. It has so much more in store. You can take a look at the source code on my Codeberg, though I apologize for the state (outdatedness) of the README. I think it's an the "alpha" stage of it development, so please bear with me. Here are some of the things I want, mostly lifted from Astrolog:
chart
currently only takes UTC$ chart cast -d 2025-08-09 -t 7:54 -p
π Using location from config.
2025-08-09 07:54 UTC
β 16 Leo 59 54
β½ 16 Aquarius 59 52
βΏ 4 Leo 28 2 r
β 10 Cancer 39 44
β 1 Libra 28 7
β 13 Cancer 27 59
β 1 Aries 19 41 r
β
1 Gemini 8 19
β 1 Aries 51 6 r
β 2 Aquarius 14 23 r
Tβ 18 Pisces 33 18 r
AC 6 Cancer 44 47
MC 23 Pisces 56 39
I'm so sorry if you're expecting someting on the Aquarius full moon here. It's in my 12th house, and I've been full hermit mode in this code for the week leading up to it. It'll be exact on Saturday, Aug. 9 at 3:54 a.m. ET. And I did find this using my own app!!
I'll be back to my planets-through-their-joys series for Jupiter with the Pisces Full Moon in a month. I fear come the Virgo New Moon two weeks from now I'll still be talking about this damn Python project. It may be in... video form. I almost called this "should i become a tech youtuber."
Hi hi! I have quite an open menu of offerings that only varies based on length:
If you're interested, reply here or email me directly hello@sailorfe.dev.