PRF · 01
Adults
A data-dense daily view: energy level, communication friction, which centres are defined today, and a recommended focus. Reads like a status board, not a horoscope.
Focus energy · friction score · defined centres · recommended action
Raw ephemeris in. One age-appropriate suggestion per person out — every morning, for a family of four.
A backend laid out like a brain: spherical trigonometry at the stem, pattern mapping in the cerebellum, fixed natal memory in the hippocampus, and a synthesis layer that branches on developmental stage before anything reaches a screen. Human Design is the symbolic vocabulary; the engineering underneath is ordinary and testable. The synthesis layer now runs live, in this tab — enter a birth date below and get today's actual feed.
A working copy of the synthesis layer below, running entirely in this browser tab — same 64-gate wheel, same 36-channel map, computed against today's real planetary positions. Add a profile for each of you and it turns your birth data into a personalized daily feed.
Privacy
Everything on this page runs in your browser. Birth data is saved only to this browser's local storage — never sent to any server, this site included — and stays on this device. Use Remove or Clear all profiles any time to delete it.
The math is a public-domain low-precision ephemeris (Paul Schlyter's method), accurate to roughly 1 arcminute — thousands of times finer than the 5.625° a gate needs. Verified against real dates before shipping: the Sun's longitude lands within 0.3° of 0/90/180/270 at all four 2026 equinoxes/solstices, and Sun/Moon land within 0.07° of exact opposition at the moment of the real 2026-03-03 total lunar eclipse.
On what this is (and isn't)
This is a real implementation of the architecture doc's wheel and channel math, not a mockup — but it's a simplified public demo of it, not the private instance. There's no natal memory database, no Ray workers, no graph or RAG layer here; profiles live in this tab's local storage and the chart recomputes from scratch on every visit. The prompts each channel shows are original, secular, written by hand for this page — framed as a possibility for the day, not a claim about you.
The feed above uses one moment and 10 bodies — enough for a daily signal. A full chart uses two: Personality (conscious, the exact birth moment) and Design (unconscious, the moment the Sun was exactly 88° of ecliptic arc earlier — solved numerically here, not approximated as a flat "88 days", since Earth's orbital speed varies enough across the year to shift that by several days). Together, 13 points each side reveal Type, Strategy, Authority, Profile, and which of the 9 centers are defined — drawn below as an actual bodygraph, not just a list.
Add a profile above to see a full chart.
What's deliberately not here
Full Type/Authority/Profile computation, relationship compatibility, tropical Sun/Moon/planet signs, an informal chakra cross-reference, and this glossary cover what a typical paid Human Design app's chart, relationship, and astrology screens do. Three things are still deliberately left out: a conversational AI assistant (needs a real backend and an ongoing LLM bill this static site doesn't have), a Rising sign / house system (needs your birth location, not just date and time — more personal data than this chart currently asks for), and any account, subscription, or payment system (this is a private family tool, not a product).
Seven layers, each with one job and one module. Naming them after brain regions is not decoration — it forces the boundary. Physics never reaches the API, and the API never does math.
Scope of this page
This documents the architecture. Natal baselines, daily journal entries, mood check-ins and game scores live only in the private instance — none of that data is on this site, and no family member's chart values or birth details are published here.
The whole symbolic system reduces to one integer division. The Human Design wheel starts at Gate 41 sitting at 302.25° of the zodiac, and the 64 gates are distributed evenly from there — so mapping a longitude to a gate is an offset, a modulo, and an index into a fixed sequence.
302.25°
Wheel start — Gate 41
5.625°
Arc per gate (360 ÷ 64)
64
Gates in the sequence
10
Bodies tracked daily
HD_START_DEGREE = 302.25
GATE_WIDTH = 360 / 64 # 5.625 degrees
WHEEL_SEQUENCE = [
41, 19, 13, 49, 30, 55, 37, 63, 22, 36, 25, 17, 21, 51, 42, 3,
27, 24, 2, 23, 8, 20, 16, 35, 45, 12, 15, 52, 39, 53, 62, 56,
31, 33, 7, 4, 29, 59, 40, 64, 47, 6, 46, 18, 48, 57, 32, 50,
28, 44, 1, 43, 14, 34, 9, 5, 26, 11, 10, 58, 38, 54, 61, 60,
]
def calculate_gate(longitude: float) -> int:
adjusted_long = (longitude - HD_START_DEGREE) % 360
index = int(adjusted_long // GATE_WIDTH)
return WHEEL_SEQUENCE[index]
Longitudes come from the layer below it. swe.julday() converts the timestamp, swe.calc_ut() returns the ecliptic position, and the first element of that result is the only number the cerebellum ever sees.
def get_daily_planets(dt: datetime.datetime) -> Dict[str, float]:
"""Calculates precise ecliptic longitudes for a given timestamp."""
fractional_hour = dt.hour + (dt.minute / 60.0) + (dt.second / 3600.0)
jd = swe.julday(dt.year, dt.month, dt.day, fractional_hour)
longitudes = {}
for name, planet_id in PLANETS.items():
calc_result, _ = swe.calc_ut(jd, planet_id)
longitudes[name] = calc_result[0]
return longitudes
The same four steps every night, off the request path entirely. By the time anyone opens the app, the day's answer already exists.
A Ray actor wakes at midnight and pulls ten ecliptic longitudes for the new date.
Each longitude becomes a gate. Ten floats collapse into ten integers.
Transit gates are checked against each stored natal chart for completed channels, then routed by age.
The finished per-person payload is written once. FastAPI only ever reads it.
@ray.remote
def process_daily_transits():
today_longitudes = get_daily_planets(datetime.datetime.utcnow())
today_gates = {
planet: calculate_gate(lon)
for planet, lon in today_longitudes.items()
}
daily_cache = {}
for member in db.get_family("family_id_1"):
daily_cache[member.name] = generate_insights(
member.natal_gates, today_gates, member.age
)
db.save_daily_weather(daily_cache)
Four people, two output shapes. An adult reads their own weather and decides what to do with it. A child never sees theirs — it is written for the parent, as an instruction about the environment, not a label about the kid.
PRF · 01
A data-dense daily view: energy level, communication friction, which centres are defined today, and a recommended focus. Reads like a status board, not a horoscope.
Focus energy · friction score · defined centres · recommended action
PRF · 02
One parenting instruction per day, phrased as something to offer. An activated throat centre becomes "expect high verbal output — good day for singing, storytelling, or interactive play."
Parenting focus · emotional regulation cue · energy outlet
PRF · 03
Environment only — routine stability, sensory load, nap timing. No cognitive claims about a one-year-old, because there is nothing defensible to claim.
Routine stability · sensory tracking · nap-window guidance
PRF · 04
An activation fires when a transiting gate completes a channel with a natal gate — one end from the sky, one end from memory. Everything above is a rendering of that one test.
Channel map · frozenset pair lookup · age branch
CHANNELS = {
frozenset([1, 8]): "Inspiration",
frozenset([2, 14]): "The Beat",
frozenset([3, 60]): "Mutation",
frozenset([43, 23]): "Structuring",
}
def generate_insights(natal_gates, transit_gates, age) -> dict:
"""Detects chart activations and generates age-specific daily weather."""
activations = []
natal = set(natal_gates.values())
transit = set(transit_gates.values())
for pair, name in CHANNELS.items():
a, b = list(pair)
if (a in natal and b in transit) or (b in natal and a in transit):
activations.append(name)
if age >= 18:
return {
"focus": "Deep Work" if "Structuring" in activations else "Adaptive",
"communication_friction": "Low" if "Inspiration" in activations else "Moderate",
"activations": activations,
}
return {
"parenting_focus": parenting_copy(age, activations),
"activations": activations,
}
One endpoint. GET /api/v1/daily-weather returns the whole family in a single read, already split by output shape so the frontend does no branching of its own.
{
"date": "2026-07-30",
"family_weather": {
"adults": [
{
"focus": "Deep Work",
"communication_friction": "Low",
"activations": ["Structuring", "Inspiration"]
}
],
"kids": [
{
"focus": "High creative drive today; good for structured projects.",
"gates_activated": ["Inspiration"]
}
]
}
}
A calculator that says the same thing every year is not worth building. The graph layer is what turns this from a lookup into something that accumulates — it records what actually happened alongside what the sky was doing, and lets the two be queried together.
GRP · 01
Profiles, gates, planets, daily summary text, and mini-game scores — each a first-class node rather than a column on a row.
profile · gate · planet · summary · score
GRP · 02
Experienced-transit, activated-channel, achieved-milestone. The relationships are the data; the nodes are just endpoints.
experienced · activated · achieved
GRP · 03
Daily summaries, mood check-ins and project notes are embedded on write, building a searchable vector space of the family's own history.
Text embedding pipeline · vector search
GRP · 04
Today's transits become the query. Historical context comes back as evidence, and the suggestion is grounded in it rather than in the symbolism alone.
RAG over personal history · Ray-side index updates
What retrieval sounds like
"The last three times Mars transited your Gate 34, your notes indicated high distributed-systems productivity but increased communication friction. Route today's energy into solo architecture rather than collaborative design."
That sentence is only possible because the notes were stored next to the transits. The astrology supplies the index; the useful part is the correlation with things that were actually written down.
The frontend consumes the daily payload and the graph history to build something age-appropriate to actually do — a dashboard for the adults, an adaptive game for everyone else.
Prior art
Referenced while building: dturkuler/humandesign_api for the FastAPI shape of a Human Design service, jdempcy/hdkit for bodygraph and planetary toolkits, and astrorigin/pyswisseph, which does the actual ephemeris work.
Happy to talk about the architecture — the layer split, the Ray-versus-cron tradeoff, or the graph schema. The instance itself stays private.
Side project · not affiliated with any employer · public/free-tier only