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.

01 · Birth profiles02 · Preview03 · Full reading
A

Your profile

Leave blank if unknown
B

Their profile

Leave blank if unknown

Your connection

Birth details are used to calculate this beta pattern and are not retained on the server. Only nicknames and the generated reading are saved for your private link.

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
  • Five angles on the pair — affection, conflict, money, pace, and the long run
  • Where the friction actually comes from, named rather than softened
  • What each of you can do about it, in practical terms

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 adds

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. 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 working them out by hand on a half value lands 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 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 the language this site is aimed at. 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 that 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 nine sections are pinned down to their identifiers, and they are the same identifiers the free template uses, so the page rendering a report does not need to know which tier wrote it. Exactly nine sections, exactly three practical suggestions, and a body of at least 250 characters in Japanese and Korean or 700 in English or 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 nine 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. What comes back marked not to be stored and not to send a referrer is the traffic behind the page — the calls 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 what protects these pages is exactly as far as that instruction reaches.

Birth dates and times are not stored. What the row 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 row 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. Whatever you type there is not put into the request — it is dropped in the browser. It is not stored, and no result link is sent to it. Immediately before storing, the outgoing structure is walked 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 rows expire after 30 days. Once past that date the address stops serving the reading — the row is marked expired the next time it is opened. Removing the row itself happens later: rows more than 24 hours past their expiry are deleted in a batch the next time anyone creates a reading. That sweep is written so it can never block a new reading, which also means a failed sweep is not retried or reported — the rows simply wait for the next creation. The result page carries a delete button that removes the row 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 sweep 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 stored on the row and used by nothing: 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