Aug. 8, 2025, 2:47 a.m.

...*my* astrology CLI app? β™’πŸŒ•

hackstrology

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.

image.png

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:

  • Because I build it from source and symlink the binary from its 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.
  • I'm disproportionately annoyed it prints the coordinates I gave it in my 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:

asc clock

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:

chart CLI

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":

  1. Natal astrology, which is only a branch of astrology. 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.
  2. The tropical zodiac over the sidereal zodiac. Of course these software support sidereal and the SwissEph has functions for it, but out of the box, you get tropical.
  3. Placidus houses. Of course; it's the most popular house system in the west, though we with our WSH are growing slowly but surely.

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:

  • It calculates no house cusps. I only touch the SwissEph houses function to get the Asscendant and Midheaven.
  • It's easier to calculate the chart of the moment than it is to get a specific event chart like a nativity. If you pass 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.
  • Its ANSI colors (toggleable, per --no-color) mimic Astro.com's Hellenistic chart style of dividing the visible planets by sect. I'm so proud of figuring out the condition to decide Mercury's color here:
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:

  • the ability to save and read plain text chart data, probably as JSON or YAML;
  • an alternate color scheme that's more "normal," e.g. based on sign elements;
  • time zone support; chart currently only takes UTC

sailorfe@hackstrology $ chart cast -d 2025-08-09 -t 7:54

$ 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:

  • 60-minute reading, $100 USD: This is a good fit if you're new to astrology or don't quite know what you're looking for. We'll take a tour of your natal chart starting from the ground with your ascendant and its ruler, then look up at the sky at the lights and other planets.
  • 90-minute reading, $150 USD: Your foundational natal reading with something on the side, such as current or past transits, or timing techniques for your birthday or Saturn return.

If you're interested, reply here or email me directly hello@sailorfe.dev.


website | codeberg | mastodon

You just read issue #4 of hackstrology. You can also browse the full archives of this newsletter.

Read more:

  • the astrolog CLI β™‹πŸŒ‘

    Much like I'm a medievalist who feels closer to this tradition's forebears by hand-drawing birth charts, I interact with my computer through a Linux shell....

Share on Facebook Share on Twitter Share via email Share on Mastodon Share on Bluesky
Powered by Buttondown, the easiest way to start and grow your newsletter.