Sheet 06 · Family app Side project · private instance

Family Neural Architecture.

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.

Your 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.

Full chart

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.

Glossary

Type One of five energy strategies — Manifestor, Generator, Manifesting Generator, Projector, or Reflector — derived from which centers are defined and whether a motor center (Sacral, Heart, Solar Plexus, or Root) has a defined channel reaching the Throat.
Strategy A fixed, one-line rule of thumb attached to Type — not computed per person, just looked up.
Authority Which defined center gets first say in a decision, checked in a fixed priority order: Solar Plexus, then Sacral, then Spleen, then Heart, then a G-to-Throat connection, then "Mental" if only awareness centers are defined, then Lunar for Reflectors.
Profile Two numbers 1–6, e.g. "2/4" — the line of your Personality Sun gate over the line of your Design Sun gate. Each gate spans 6 lines of 0.9375° apiece.
Defined centers A center counts as defined only when a full channel — both its gates — is activated somewhere across your 26 possible activations (13 Personality + 13 Design). A single gate alone never defines a center.
Bodygraph The 9-center diagram — shapes filled where defined, all 36 possible channels drawn faint with the active ones bold on top. Tap a shape or line for its name. An original layout built only from the same verified gate/center/channel data as the rest of this page, not traced from any app's artwork.
Zodiac signs The standard tropical zodiac — the same ecliptic longitude the gate wheel uses, just cut into 12 equal 30° signs starting at the equinox point instead of 64 gates starting at 302.25°. No new astronomy, no new margin of error.
Chakra bridge An informal cross-reference some practitioners draw between Human Design's 9 centers and the classical 7-chakra system — not canon in either system. Six centers have a near-universal pairing (several share the literal name); three don't, since 9 doesn't divide evenly into 7, and those are marked as having no single agreed match rather than guessed.

Scope

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).

The brain model

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.

  1. Brain stem core/ephemeris.py — pyswisseph over NASA JPL ephemeris data. Datetime to Julian day, Julian day to ecliptic longitude for ten bodies. Pure numbers, no interpretation.
  2. Cerebellum core/hd_math.py — the pattern map. 360° of longitude onto 64 hexagrams at 5.625° apiece, following a fixed wheel sequence. One function, no state.
  3. Hippocampus models/profiles.py — fixed natal baselines for each family member, schema-enforced with Pydantic. Written once, read every day.
  4. Prefrontal services/synthesis.py — the delta between today's transits and natal memory, then a branch on age. An adult gets metrics; a child gets a parenting instruction.
  5. Autonomic workers/cron.py — Ray actors run the whole chain at midnight and cache the result. Nothing is computed inside a request.
  6. Motor main.py — FastAPI serves the precomputed payload. The endpoint is a cache read, which is why it stays fast under a toddler's tapping.
  7. Network Second brain — a graph database and embedding pipeline that correlates what the family actually experienced against what the sky was doing. The only layer that learns.

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 wheel

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

The 64-gate wheel A circle divided into 64 evenly spaced ticks of 5.625 degrees each, with a marker at 302.25 degrees indicating where Gate 41 begins the sequence. GATE 41 302.25° 5.625° / GATE
One tick per gate. Subtract the wheel's origin from a body's longitude, take it modulo 360, floor-divide by the gate width, and use the result as an index into the wheel sequence. The sequence is not numerically ordered — Gate 41 is followed by 19, then 13 — so the lookup table is the map, and the arithmetic is only there to find the slot.
core/hd_math.pyCerebellum
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.

core/ephemeris.pyBrain stem
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

Daily run

The same four steps every night, off the request path entirely. By the time anyone opens the app, the day's answer already exists.

Compute

A Ray actor wakes at midnight and pulls ten ecliptic longitudes for the new date.

Map

Each longitude becomes a gate. Ten floats collapse into ten integers.

Synthesize

Transit gates are checked against each stored natal chart for completed channels, then routed by age.

Cache

The finished per-person payload is written once. FastAPI only ever reads it.

workers/cron.pyAutonomic system
@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)

Profiles

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

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

PRF · 02

Preschool age

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

Toddler age

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

Activation logic

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

services/synthesis.pyPrefrontal cortex
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,
    }

The payload

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.

Method GET — idempotent, no query parameters. The date is whatever the last cron run wrote.
Latency Cache read only. No ephemeris calls, no Ray work, no graph traversal inside the request.
Shape Adults return metric objects; kids return a parenting focus string plus the activations that produced it.
Auth Private instance. Nothing about this family is served publicly, including from this documentation page.
GET /api/v1/daily-weatherMotor cortex
{
  "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"]
      }
    ]
  }
}

The second brain

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

Nodes

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

Edges

Experienced-transit, activated-channel, achieved-milestone. The relationships are the data; the nodes are just endpoints.

experienced · activated · achieved

GRP · 03

Embeddings

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

Retrieval

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.

Output layer

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.

Adult dashboards and mini-brain games

  • Dashboard — energetic weather, historical graph correlations, and the day's recommended focus in one dense view
  • Adaptive difficulty — when the day's transit indicates strong strategic energy, puzzle difficulty scales up to match it
  • Feedback loop — completion metrics write back into the graph, so cognitive sharpness becomes a tracked series rather than a vibe
  • Aesthetic — 1:1 pixel art, retro, closer to a handheld cartridge than to a productivity app

Kids

  • Preschool — daily challenges that follow the energetic weather; an expressive transit serves a vocal or storytelling game themed around whatever she is currently attached to
  • Toddler — cause-and-effect sensory taps and algorithmically selected audio for calming the transition into a nap
  • Parent-facing by default — the tip is for the adult reading it. The child's screen only ever has the activity on it

Stack

pyswisseph NASA JPL ephemeris FastAPI Ray Pydantic Graph database Text embeddings RAG Python

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.

Ask about it

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

jcdavis131@gmail.com