Your compatibility reading

Begin with two
birth stories.

Share what you know. If a birth time is unknown, we’ll simply leave time-specific patterns out of the reading.

Free preview firstNo account$2.99 · one-time

What's in the full report
  • How they see me, and how I see them
  • Why we keep clashing over the same things
  • What the two of us can try right away
  • Money and home — who handles what, and where our ways rub
  • Our next twelve years — when our rhythms line up
  • Our ten-year cycles side by side (when gender is given)
  • Who fills what in the five elements
  • Words to say out loud, questions to ask each other, and a rule of our own
  • What rounds us out as a pair, in a PDF with both our names
01 · You02 · The other person03 · Preview
A

Your profile

Leave blank if unknown
Optional. Used only for the direction of the ten-year luck cycle, so the full reading can compare the two.
More options — time accuracy, solar time (optional)

Don’t have their birth date?

Fill in your side, send them a link, and the reading opens for both of you the moment they add theirs.

What this reading covers
Free, right away
  • Both charts, calculated side by side
  • Where the pillars meet — harmony and clash signals, with the working shown
  • The heart of how the two of you meet, plus four insights to start
Written out in full, in the paid report
  • How they see me, and how I see them
  • Why we keep clashing over the same things
  • What the two of us can try right away
  • Money and home — who handles what, and where our ways rub
  • Our next twelve years — when our rhythms line up
  • Our ten-year cycles side by side (when gender is given)
  • Who fills what in the five elements
  • Words to say out loud, questions to ask each other, and a rule of our own
  • What rounds us out as a pair, in a PDF with both our names

Start free — the full text opens only if you want it. For reflection, not prediction.

What this compatibility reading calculates, and what the paid version addsHow this is calculated

Nothing here is scored. Two charts are laid against each other

Two charts are built first, one each. A birth date entered on the lunar calendar is converted to the matching solar date before anything else happens, with the leap-month box in the same field. The year and month pillars are then read on the solar-term reference clock. The day and hour pillars are read on the civil clock of the place of birth — unless "Fine-tune birth time" is ticked for that person. Then the clock is moved by the minutes that come out of the chosen timezone's representative longitude and the equation of time, and the day and hour pillars are built from the moved time instead. For someone born in Japan the longitude is that of the region picked — one of five — rather than one figure for the whole timezone. The year and month pillars do not move with it. Nothing moves at all when the birth time is unknown, or when the timezone has no longitude on our list. If a birth time is unknown, no hour pillar is built for that person at all — their chart has three pillars, and the rest of the calculation proceeds at midday. Up to this point it is the single-person calculation, run twice.

The compatibility part comes after. Every pillar of yours is paired with every pillar of theirs: sixteen pairings when both birth times are known, twelve when one is missing, nine when both are. Each pairing is checked against seven tables — one for stems and six for branches. The stem table holds five pairs only: 甲 with 己, 乙 with 庚, 丙 with 辛, 丁 with 壬, 戊 with 癸. The branch tables are the six-combination, six-clash, six-harm, punishment, destruction and Wonjin, and a pair matches in either order. A pair that is in a table raises one signal; a pair that is in none raises nothing.

The seven tables overlap. 巳 with 申, for instance, appears in the six-combination table, in the punishment table and in the destruction table, so that single pairing raises three signals — one connecting, two tension. The counts you see are counts of signals, not of pairings, which is why a larger number does not mean a closer bond.

No signal carries a weight. The six-combination and the stem combination are filed as connecting, the six-clash, six-harm, punishment, destruction and Wonjin as tension; each kind is counted, and the pair is recorded as connecting only, tension only, both, or neither. The order they are listed in is fixed too: each pillar carries a number — day 0, month 1, year 2, hour 3 — and the pairings are sorted by the two numbers added together, so the day-with-day pairing sits at the top and the hour-with-hour pairing at the bottom. Giving the day pillar the 0 is a rule we chose, not a statement about which matters most.

Where the three numbers come from, and what they are not

Open the calculation panel and there are three figures. The first is element similarity. Each person's five element figures total 100, so the absolute differences across the five can total at most 200; halve that, subtract it from 100 and round to a whole number, and you have the figure. The second is yin–yang similarity: the difference between the two yang percentages, subtracted from 100 and rounded the same way. That yang percentage counts only the visible stems and branches — stems hidden inside a branch count toward the element figures at a weight of 1, but they are not counted here.

The third is those two added at weights of 0.65 and 0.35, rounded to a whole number as well. All three are rounded before they reach the screen, so if you work them out by hand, a half value can leave you one off what is shown. Treating the element distribution as the heavier of the two is a choice of ours, and it is written here rather than left implicit. What the preview screen shows is not that number but a band five either side of it, clipped at 0 and 100. It is shown as a band because it is neither a probability nor a rate of success.

The name given to the pairing comes from the same number. Is it 78 or above; is it 68 or above; failing both, is element similarity under 55 — those three cut points are the whole decision, and there are exactly four names to land on. So the name is not a description of the two of you. It is a label for the bracket the number fell into.

The individual profiles work the same way. The five element figures are sorted, and the single largest one selects the text. The essence line, what the person needs, the growth edge and the role in a relationship all come from a table with one entry per element, and the percentages themselves never appear in that prose. Two people whose heaviest element is the same read the same profile. The second-heaviest element is used twice: once on the preview screen, in the strength line about a built-in growth exchange, and again in the report section about borrowing a quality from the other person. The rhythm label is a three-way choice: yin at 57 or above is reflective, yang at 57 or above is expressive, anything else is balanced.

What the paid version changes is the writer, not the calculation

The reading stored free of charge is a template with the calculated values dropped into it. That template was written in English, and the Korean and Japanese versions of it are shortened summaries — which left the thinnest text in Japanese and Korean, on a site built with Japanese readers in mind. The paid version does not close that gap by translating. It hands the same calculated facts to a language model and has it write in the reader's language from the start.

What the model receives is fixed: the two nicknames, each person's heaviest and second-heaviest element by name, the rhythm label, the four table lines and two strengths quoted above, the pairing name and its one-line descriptor — and the calculation record itself, meaning the three figures, every signal with the pillar it came from on each side and the character involved, the counts, the uncertainty record and the standing caveats. Some things are deliberately not sent: the element percentages themselves, and the eight characters of either chart. Only the characters named in a signal reach it.

The shape of the output is fixed too. The sections are pinned down to their identifiers: the free template's nine plus two more (how each sees the other, and money and home), eleven in all. Sharing identifiers means the page rendering a report does not need to know which tier wrote it. Exactly eleven sections, exactly three practical suggestions, and a body of at least 250 characters in Japanese and Korean or 700 in English — otherwise the output is refused. The instruction asks for close to double that; these are the floors for accepting it. The ceiling is 4,000 characters.

The prohibitions travel with it. Do not invent a pillar, an element, a percentage or a signal that is not in the facts. Do not predict a breakup, a marriage, a pregnancy, illness, death, or any dated event. Give no medical, legal or financial advice. Never tell either person to leave or to stay. Do not make one of them the problem — friction is described as a loop the pair produce together. And do not echo our internal labels, the words we sort signals with, into the prose.

Only the title, the descriptor, the eleven bodies and the three suggestions are rewritten. The calculated per-person figures and the signal list are carried through untouched. Generated text is stored against the facts it was written from, so reopening the page does not regenerate it, and because the nicknames are part of those facts a different nickname is a different entry. If generation fails, the template is shown instead. The one failure not papered over that way is the daily ceiling — 400 generations a day across every paid reading on the site — where you get an honest "briefly unavailable" rather than a substitute. Asking more than six times in one minute from one connection also drops the surplus to the template. No free screen calls a model at all, and that is held in place by a test rather than by policy alone.

The result is not published. There is one address that opens it

The reading lives at an address containing a long string we generate: 32 random bytes written as 43 characters. What is stored is not that string but a hash of it. Anyone holding the address can open the reading — which also means that if you send the address to someone, they can open it too. If it is shared, you shared it; we do not show it to anyone. The responses marked not to be stored and not to send a referrer are the ones behind the page — the requests that create the reading and fetch it. The result page you actually read carries no such marking.

Crawlers are told not to fetch the result page or the preview page, with the Japanese and Korean prefixed addresses listed individually. Beyond that instruction there is no per-page noindex tag, so these pages are protected only as far as that instruction reaches.

Birth dates and times are not stored. What the stored record keeps is the two nicknames (30 characters each at most), the relationship type you picked, the version of the engine used, the generated reading, and the values that let the record be handled at all: its id, the hash of the address, which stage it is at (preview ready, paid, completed, expired), the demo flag, when it was made and last changed, and when it expires. There is also an email box near the bottom of the form. An address typed there is sent along with the request and used for one thing: a single email carrying the private link to this result, at most two a day to any one address. The email address itself is not stored — only a hash of it is kept, for about a day, to count those two — and nothing you typed into the form goes into the message. Immediately before storing, the outgoing structure is checked for the input field names themselves — date of birth, birth time, timezone, calendar type and the rest — and nothing is stored if one of them is still attached. It is a check on the key names in the structure, not a search through the prose for something that looks like a date.

Stored records expire after 30 days. A reading someone has paid to open is the exception: the first time the full reading is opened it is kept with no expiry, until the delete button is pressed. Once past that date the address stops serving the reading — the record is marked expired the next time it is opened. Removing the record itself happens later: records more than 24 hours past their expiry are deleted in a batch the next time anyone creates a reading. That clean-up is written so it can never block a new reading, which also means a failed clean-up is not retried or reported — the records simply wait for the next creation. The result page carries a delete button that removes the record there and then, after which the address opens nothing. One copy outlives both: the paid text is also kept in a cache keyed on the facts it was written from, and those facts include the two nicknames. Neither the delete button nor the expiry clean-up touches that cache.

The limits are worth stating. The tables consulted are the current list and no more: what happens when three or more branches gather, and pairs that transform into another element, are not evaluated. Pairs of the same character — 辰 with 辰, 午 with 午, 酉 with 酉, 亥 with 亥 — are counted as pairings between the two of you as well. Expert validation is still outstanding. Three things put an uncertainty record in the result: a birth time that is unknown, "Approximate" chosen under time accuracy, and a time close enough to a boundary that moving it changes a pillar. Choosing "Approximate" also widens the window we test that boundary in from five minutes either side to sixty, so the record can appear for a time that is known exactly. And the relationship type you select is saved with the reading and not used by anything: choosing dating or friendship does not change a word of the reading.

This is a calculation, not a verdict. No signal is built to mean good or bad on its own. It is not a tool for deciding whether to continue or to leave; it is material for putting into words where two people's differences are likely to show. That is the weight it is meant to carry.

How a single chart is built: read the full rules →