What This Document Covers
Many fortune sites pull values like ganji or solar terms from an outside service, or simply read out a table somebody else prepared. We do neither. The calculations for ganji, the 24 solar terms, lunar conversion, son-eomneun-nal ("no-spirit days") and samjae all live in one almanac module we wrote ourselves, and the numbers you see are computed on the spot from the moment you arrive, in Korean Standard Time. Because these are pure functions - the same date always yields the same result - nothing is retrieved from storage; every value is derived again from scratch.
Doing the arithmetic ourselves also means we can get it wrong. So this page records not only how each value is derived but what we compared it against, which years came out wrong and had to be corrected, and which quantities we still do not compute at all. A regression script re-checks the anchor values on every run, and the mismatches we found are kept in a visible correction table rather than quietly patched. We think stating exactly how far we verified - and where verification stops - is more honest than claiming accuracy outright.
Ganji - The Sexagenary Cycle and Julian Day Numbers
Ganji pairs one of ten Heavenly Stems with one of twelve Earthly Branches. Since the least common multiple of 10 and 12 is 60, the pairing completes a full turn after sixty steps - the sexagenary cycle. Applied to a year it is called the year pillar, to a month the month pillar, and to a day the day pillar.
The year pillar is easy. Subtract 4 from the Common Era year, then take the remainders modulo 10 and 12 for the stem and branch, because 4 CE was a Gapja year. For 2026: 2026 − 4 = 2022; 2022 mod 10 = 2, giving the stem Byeong (丙); 2022 mod 12 = 6, giving the branch O (午). Hence Byeong-O, the year of the Fire Horse.
The day pillar is not so simple. The Gregorian calendar layers a leap year every four years, an exception every hundred, and an exception to that exception every four hundred, so you cannot count the days between two dates from the date strings alone. The fix is to convert each date to a Julian Day Number (JDN) first. A JDN is a single running integer that has been incremented once per day since a reference day in 4713 BCE, so the difference between two JDNs is exactly the number of days elapsed. We use the Fliegel–Van Flandern algorithm for the conversion.
Julian Day conversion (Fliegel–Van Flandern)
a = floor((14 - month) / 12)
y = year + 4800 - a
m = month + 12a - 3
JDN = day + floor((153m + 2) / 5) + 365y
+ floor(y/4) - floor(y/100) + floor(y/400) - 32045All that remains is one anchor. We take 1 October 1949 as a Gapja day. Its JDN is 2433191, and adding 49 gives a number divisible by 60 with no remainder - landing exactly on position 0 of the cycle, which is Gapja. From then on, any date yields a number from 0 to 59 through (JDN + 49) % 60; that number modulo 10 gives the stem and modulo 12 gives the branch. With a single correct anchor, thousands of years in either direction follow without drift.
In Korean fate calculation the year does not turn on 1 January but at Ipchun, the beginning of spring. So before assigning a year pillar we compute that year's Ipchun date, and if the date falls before it we use the previous year's ganji instead. In 2026, 3 February still belongs to the Eulsa year; Byeong-O begins on 4 February. Many people assume the zodiac animal changes on New Year's Day, but the boundary used in saju is Ipchun.
| Stem | Yin / Yang | Element | Color |
|---|---|---|---|
| Gap (甲) | Yang (陽) | Wood (木) | Blue (靑) |
| Eul (乙) | Yin (陰) | Wood (木) | Blue (靑) |
| Byeong (丙) | Yang (陽) | Fire (火) | Red (赤) |
| Jeong (丁) | Yin (陰) | Fire (火) | Red (赤) |
| Mu (戊) | Yang (陽) | Earth (土) | Yellow (黃) |
| Gi (己) | Yin (陰) | Earth (土) | Yellow (黃) |
| Gyeong (庚) | Yang (陽) | Metal (金) | White (白) |
| Sin (辛) | Yin (陰) | Metal (金) | White (白) |
| Im (壬) | Yang (陽) | Water (水) | Black (黑) |
| Gye (癸) | Yin (陰) | Water (水) | Black (黑) |
The color names attached to each year come straight out of this table. 2026 is called the year of the Red Horse because the stem Byeong (丙) carries the color red and the branch O (午) is the horse. 2024 worked the same way: Gap (甲) is blue and Jin (辰) is the dragon, hence the Blue Dragon. There is nothing mystical about the naming - it is two cells read off a table.
The 24 Solar Terms - The Shouxing Formula and Its Correction Table
The 24 solar terms mark each 15-degree step of the sun along the ecliptic. Being solar rather than lunar, they land on almost the same Gregorian date every year - which is why Ipchun always falls around 4 February and the winter solstice around 22 December. Pinning down the exact moment of entry requires solving for the sun's ecliptic longitude astronomically, but for a date alone a far simpler approximation is enough.
We use the Shouxing formula, which derives the entry date from one constant per term plus a leap-year correction.
Shouxing formula - solar term entry date
D = floor(Y × 0.2422 + C) - L Y = last two digits of the year (2026 → 26) C = constant per term, per century (Ipchun, 21C = 3.87) L = floor(Y / 4) (leap correction) ※ For January and February terms, L = floor((Y - 1) / 4)
The exception for January and February terms - Sohan, Daehan, Ipchun and Usu - has a simple cause: that year's 29 February has not yet passed, so the leap correction must lag by one year. The constant C comes in a 20th-century and a 21st-century variant, and differs for each of the 24 terms.
Take Ipchun 2026 as a worked example. Y = 26, the 21st-century constant for Ipchun is C = 3.87, and since it is a February term, L = floor(25 / 4) = 6. Then 26 × 0.2422 = 6.2972; adding 3.87 gives 10.1672; the floor is 10; subtracting 6 leaves 4. Ipchun 2026 falls on 4 February.
The trouble is that the formula is not exact. In years where the true moment of entry sits close to midnight, the computed date is off by a day. So we do not ship the raw output. Every value is compared against the dates published by the Korea Astronomy and Space Science Institute (KASI), and only the years that disagree are registered in a correction table that adds or subtracts a day.
Here is what the comparison produced, stated plainly. For 2025 we checked all 24 terms and all 24 matched. For 2024 through 2030 we took the six terms most often used as reference points - Ipchun, the spring equinox, Ipchu, the summer solstice, the autumn equinox and the winter solstice - which gave 42 data points, of which 40 matched. The two that did not were the 2028 summer solstice and the 2029 autumn equinox. Adding two further mismatches found separately, Usu and Mangjong in 2026, the correction table currently holds four entries.
| Year | Term | Formula | Published | Correction |
|---|---|---|---|---|
| 2026 | Usu (雨水) | 19 Feb | 18 Feb | −1 day |
| 2026 | Mangjong (芒種) | 5 Jun | 6 Jun | +1 day |
| 2028 | Haji (夏至) | 21 Jun | 20 Jun | −1 day |
| 2029 | Chubun (秋分) | 23 Sep | 22 Sep | −1 day |
In all four cases the discrepancy was exactly one day. That is the error bound of this method - plus or minus a single day - and the comparison is what catches it. Put the other way round, years we have not yet compared may still hold mismatches we have not found. The correction table is an open list, not a finished one, and we add to it as new cases surface. If you spot a date that disagrees with the official record, please tell us.
Lunar Conversion - The 1900-2050 Reference Table
The lunar calendar follows the moon's synodic cycle, so no single tidy formula covers it. A month may run 29 or 30 days, and twelve of them fall short of a solar year, which forces an intercalary month every few years. Rather than approximate, we use a reference table covering the 151 years from 1900 to 2050.
The table compresses each year into a single 17-bit integer. The low four bits hold the number of the leap month, with 0 meaning there is none. The twelve bits above them mark whether each month from the first to the twelfth is a long month of 30 days or a short one of 29. The final bit says whether the leap month itself runs 30 days. The epoch is 31 January 1900 in the solar calendar, which is the first day of the first lunar month of 1900. Given a solar date, we count the days elapsed since the epoch and walk down the table to recover the lunar year, month, day and leap-month status.
The hazard of a table is that one wrong value pushes everything after it out of alignment. So the regression suite re-checks thirteen anchors on every run: six Lunar New Year dates (the first day of the first lunar month) and seven Chuseok dates (the fifteenth day of the eighth). It also verifies that advancing one solar day always advances the lunar date by exactly one, that leap months sit where the table says they do, and that dates outside the covered range return an empty value rather than a fabricated one.
That check has actually caught an error. The long/short month bits for 1978 and 1996 were wrong, and the symptom was that Chuseok in both years came out on the sixteenth day of the eighth lunar month instead of the fifteenth. To confirm the cause we computed the new-moon instants independently using Meeus's astronomical algorithms and compared. The September 1996 new moon fell more than eight hours away from midnight Korean time, so this was not a borderline rounding call - the table values themselves were wrong. In both years the annual day count was unchanged, so the boundaries with adjacent years did not move. The real lesson was that our anchors were clustered in recent years and had been blind to a decades-old error, so we extended them back to 1978.
Son-eomneun-nal ("days without the spirit") are then determined from that lunar date. A day qualifies when the lunar day number ends in 9 or 0 - that is, the 9th, 10th, 19th, 20th, 29th and 30th. Tradition holds that the son, a directional spirit, spends a ten-day cycle moving two days each through east, south, west and north, then ascends to the heavens for the remaining two days and stops meddling in human affairs. The test itself is a single modulo operation, but it is only as right as the lunar conversion feeding it. In practice, the reliability of our no-spirit-day calendar is the reliability of the lunar table.
Samjae - Determining It from the Zodiac Trines
Samjae is a folk belief that every twelve years, each zodiac sign passes through three consecutive years calling for caution. The rule itself is unambiguous. The twelve signs are grouped into trines by stepping four places at a time, giving four groups of three, and each group has a fixed set of three years in which samjae falls.
Those three years are named in order: deul-samjae for the year it enters, nul-samjae for the year it lingers, and nal-samjae for the year it leaves. Our code stores the four group mappings as a table and determines the phase from the position of the queried year's branch within that list.
| Trine group | Signs | Samjae years |
|---|---|---|
| Sin-Ja-Jin (申子辰) | Monkey · Rat · Dragon | Tiger, Rabbit, Dragon years (In-Myo-Jin) |
| Sa-Yu-Chuk (巳酉丑) | Snake · Rooster · Ox | Pig, Rat, Ox years (Hae-Ja-Chuk) |
| In-O-Sul (寅午戌) | Tiger · Horse · Dog | Monkey, Rooster, Dog years (Sin-Yu-Sul) |
| Hae-Myo-Mi (亥卯未) | Pig · Rabbit · Sheep | Snake, Horse, Sheep years (Sa-O-Mi) |
Someone born in 1995, for instance, is a Pig and therefore belongs to the Hae-Myo-Mi group, so their samjae window is the Snake, Horse and Sheep years - 2025, 2026 and 2027. Since 2026 is the second of the three, it is nul-samjae. The regression suite includes this case and checks that for any birth year the window always comes out as three consecutive years, recurring every twelve.
Samjae is different in kind from ganji, solar terms and lunar dates, though. Those are calendrical rules with a right answer. There is no confirmed evidence that samjae actually brings misfortune. What we can vouch for is that the traditional rule has been applied correctly - not that the rule predicts anything. If a result tells you that you are in samjae, we would rather you treat it as a nudge to start the year a little more carefully than as something to fear.
Choosing Fortune Text - Deterministic Hash Seeding
From here on we leave the calendar behind and enter the content layer. The sentences shown by the daily fortune or the zodiac readings are drawn from pools we wrote in advance. How they are drawn matters as much as what is in them.
The obvious approach is to call a random number function. But then the same person gets a different fortune on every refresh, and a reading that changes between breakfast and lunch is not a fortune, it is a raffle. It also quietly invites people to reload until they like what they see. So we do not use randomness in the result at all - we fix the seed instead.
It happens in two steps. First we join the inputs (birth date, name, zodiac sign and so on) with today's date string and run them through a 32-bit FNV-1a hash to get a single integer. That integer seeds the mulberry32 pseudo-random generator, which always emits the same sequence for the same seed. Sentence selection, star ratings, lucky numbers and lucky colors are all drawn from that one sequence in order.
The deterministic selection procedure
seed = fnv1a(inputs + "|" + "YYYY-MM-DD") rng = mulberry32(seed) sentence = pool[floor(rng() × pool.length)] rating = derived from the sentence's own tone value
The result is that identical input yields an identical reading for the whole day, and only recalculates once the date string changes at midnight. Refreshing changes nothing. Randomness is reserved for presentation that leaves no trace on screen, such as the shuffle animation in the tarot deck. Even the star rating is not rolled separately - it is derived from the tone already attached to the chosen sentence, so you never get an encouraging paragraph paired with a one-star score.
There is a useful side effect. Because a result needs only the input and date, the fortune calculation does not need to identify a visitor or remember an earlier visit. Raw names, full birth dates, and birth years are calculated in the browser and excluded from servers, share URLs, Google Analytics, and advertising requests.
The pools themselves are sized as follows. Every sentence exists in both Korean and English, and each expansion batch was written separately so that it would not repeat the subject matter or sentence shapes of the original set.
| Pool | Entries | Composition |
|---|---|---|
| Daily fortune - overall | 200 | 50 base + 150 expansion, across four tones: great, good, soso, caution |
| Money · Love · Health · Work | 100 each | 30 base + 70 expansion per category, 400 in total |
| Chinese zodiac readings | 720 | 12 signs × (today · week · month) × 20 |
| Western horoscope readings | 720 | 12 signs × (today · week · month) × 20 |
| Tarot cards | 78 | 22 major + 56 minor, with separate upright and reversed readings |
Setting the 78 tarot cards aside, the fortune sentences alone come to 2,040 entries (200 + 400 + 720 + 720) - 4,080 if you count Korean and English separately. The artwork for all 78 tarot cards is produced in SVG and CSS rather than loaded from an image host, so no external image CDN is needed for the deck. Google requests for analytics and advertising are separate from that calculation and artwork path and are described in the Privacy Policy.
Limits and Caveats
If we are going to talk about accuracy, the honest place to start is with what we cannot do. These are the limits we currently know about.
We do not compute the moment a term begins
Solar terms are given as dates only; we do not derive the hour and minute of entry. If you need the hour pillar, or need to settle which side of a term boundary a specific time falls on, the values here are not sufficient on their own.
The official calendar is KASI's
Our figures are for reference. For anything that has to be officially correct - public holidays, exact solar term times, substitute holidays - please follow the almanac published by the Korea Astronomy and Space Science Institute.
Lunar lookups run from 1900 to 2050
Dates outside the table's range return an empty value rather than an estimate, so the lunar field simply appears blank. We judged that leaving a gap visible is more honest than filling it with something plausible.
The time zone is fixed to Korean Standard Time (UTC+9)
Visiting from abroad still gives you dates computed in Korean time, which may differ from your local date by a day. We aligned it this way because the Korean almanac and saju tradition are anchored to Korean time.
The readings are for entertainment
Calculating accurately and interpreting correctly are entirely different claims. Ganji, solar terms and lunar dates are rule-bound calendrical facts with right answers; reading personality or the future out of those values has no scientific basis. For decisions that matter - health, money, legal matters - please consult a qualified professional.
Frequently Asked Questions
Sometimes your result differs by a day from another almanac site. Why?
The most common cause is the moment of entry. We compute solar terms by date only, without the hour and minute, so in years where entry falls near midnight we can differ by a day from sites that resolve the time. The second cause is the year boundary: following the saju convention, we turn the year at Ipchun rather than on 1 January. The third is the time zone - we always use Korean Standard Time regardless of where you are. If you find a date that disagrees, tell us and we will compare it against the KASI publication; if the error is ours, it goes into the correction table.
Doesn't skipping external APIs make the values less accurate?
Accuracy is decided by what you compared against, not by whether an API was involved. Ganji is pure modular arithmetic over Julian Day Numbers, a fixed integer system, so a single correct anchor keeps it from drifting. Solar terms come from an approximation that can err, which is exactly why we compare against KASI's published dates and correct the years that disagree. Lunar dates use a widely adopted reference table, held in place by regression tests against thirteen Lunar New Year and Chuseok anchors - tests that did in fact catch table errors in 1978 and 1996. What we do not claim is that ranges we have not compared are flawless.
If two people enter the same birth date, do they get the same fortune?
Yes. The same input in the same tool produces the same result on a given day because the seed is derived from the input and date. That is a deliberate design choice. It needs no account or server-side memory, and raw names, full birth dates, and birth years are calculated on-device and excluded from servers, URLs, and Google requests.
Does refreshing the page change my fortune?
It does not. The result is fixed by a hash seed built from your input joined with the date string, so it holds for the whole day and recalculates once the date string changes at midnight. Randomness is used only for presentation that leaves no trace in the result, such as the animation that shuffles the tarot deck before a card is drawn.
How did you find the four entries in the solar term correction table?
By comparing each date produced by the Shouxing formula against the dates published by the Korea Astronomy and Space Science Institute. For 2025 we checked all 24 terms and all 24 matched. For 2024 through 2030 we checked the six reference terms across seven years, 42 data points, of which 40 matched. The 2028 summer solstice and the 2029 autumn equinox were the mismatches; adding Usu and Mangjong in 2026, found in a separate check, gives the four entries now in the table. Every discrepancy was exactly one day.
Where is the birth date or name I entered stored?
Raw names, full birth dates, and birth years are not stored. Fortune and almanac calculation modules run in your browser without calling an external API, and raw inputs are excluded from servers, address bars, share links, and Google requests. The separate visit, device, advertising, and cookie data that Google Analytics or AdSense may process is described in the Privacy Policy.
This content is for entertainment purposes only. For important decisions, consult a professional.