<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shiyang Ren</title>
    <description>The latest articles on DEV Community by Shiyang Ren (@renyang5201).</description>
    <link>https://dev.to/renyang5201</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4174731%2F3e07467a-decb-470e-9978-233ff77251f1.jpg</url>
      <title>DEV Community: Shiyang Ren</title>
      <link>https://dev.to/renyang5201</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/renyang5201"/>
    <language>en</language>
    <item>
      <title>Building an Open-Source Tarot Birth Card Calculator with Next.js 15 &amp; Crowley Numerology</title>
      <dc:creator>Shiyang Ren</dc:creator>
      <pubDate>Sat, 31 Oct 2026 10:57:08 +0000</pubDate>
      <link>https://dev.to/renyang5201/building-an-open-source-tarot-birth-card-calculator-with-nextjs-15-crowley-numerology-42hl</link>
      <guid>https://dev.to/renyang5201/building-an-open-source-tarot-birth-card-calculator-with-nextjs-15-crowley-numerology-42hl</guid>
      <description>&lt;h2&gt;
  
  
  The Intersection of Archetypal Psychology and Modern Web Development
&lt;/h2&gt;

&lt;p&gt;For decades, archetypal psychologyâ€”pioneered by Carl Jungâ€”and esoteric numerology have fascinated seekers, psychologists, and philosophers alike. One of the most mathematically elegant frameworks in this realm is the &lt;strong&gt;Tarot Birth Card&lt;/strong&gt; system. By applying sacred Pythagorean digit reduction to a person's birth date, you can determine their lifelong archetypal signature from the 22 Major Arcana (such as &lt;em&gt;The Magician&lt;/em&gt;, &lt;em&gt;The High Priestess&lt;/em&gt;, or &lt;em&gt;The Hermit&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;However, if you search the web for tarot calculators, the current experience is notoriously frustrating:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clunky WordPress sites overwhelmed with auto-playing video ads and invasive trackers.&lt;/li&gt;
&lt;li&gt;Paywalled reports hiding your full archetypal analysis behind an email gate or $19.99 fee.&lt;/li&gt;
&lt;li&gt;Outdated interfaces built in the Flash/PHP era with broken mobile viewports.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To solve this, I designed and deployed &lt;strong&gt;&lt;a href="https://www.thetarotbirthcard.com" rel="noopener noreferrer"&gt;Tarot Birth Card Calculator&lt;/a&gt;&lt;/strong&gt;: a clean, 100% free, lightning-fast web application built with &lt;strong&gt;Next.js 15 (App Router)&lt;/strong&gt;, &lt;strong&gt;TypeScript&lt;/strong&gt;, and &lt;strong&gt;Tailwind CSS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this guide, I'll walk through the mathematical logic, the TypeScript reduction algorithm, edge-case combinations, and the frontend architecture powering the tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  ðŸ“ The Mathematics: Pythagorean Reduction &amp;amp; Crowley Arcana
&lt;/h2&gt;

&lt;p&gt;The core challenge of calculating Tarot Birth Cards lies in correctly handling the &lt;strong&gt;22 Major Arcana&lt;/strong&gt; reduction rules derived from the Hermetic Order of the Golden Dawn and Aleister Crowley's numerological correspondence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reduction Rules
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Summing the Birth Date&lt;/strong&gt;: Sum the full integer year, month, and day:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   Sum = Year + Month + Day (e.g. 1990 + 05 + 15 = 2010)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;First Reduction (Personality Card)&lt;/strong&gt;: Sum the individual digits of the total sum. If the result is between &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;21&lt;/code&gt;, that corresponds to the &lt;strong&gt;Primary Personality Card&lt;/strong&gt;. If it exceeds 22, reduce it once more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secondary Reduction (Soul Card)&lt;/strong&gt;: If the first card is a two-digit number (e.g., &lt;code&gt;14&lt;/code&gt; Temperance), reduce its digits again (&lt;code&gt;1 + 4 = 5&lt;/code&gt;, The Hierophant) to reveal the &lt;strong&gt;Soul Card&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Special 3-Card Rule (The 19-10-1 Triad)&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;If the sum reduces to &lt;strong&gt;19 (The Sun)&lt;/strong&gt;, summing &lt;code&gt;1 + 9 = 10 (Wheel of Fortune)&lt;/code&gt;, and &lt;code&gt;1 + 0 = 1 (The Magician)&lt;/code&gt;. This represents a rare triple-archetype combination!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Fool (0 / 22)&lt;/strong&gt;: The 22nd card is conceptually mapped to The Fool (&lt;code&gt;0&lt;/code&gt;), representing infinite potential, pure trust, and the start of the hero's journey.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ðŸ’» The TypeScript Algorithmic Implementation
&lt;/h2&gt;

&lt;p&gt;Here is the clean, functional TypeScript implementation powering the calculator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;TarotCard&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;archetype&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;keywords&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="nl"&gt;lightGifts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="nl"&gt;shadowDynamics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;BirthCardResult&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;birthDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;cards&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TarotCard&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="nl"&gt;patternType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Single&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Pair&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Triple&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;lifeTheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Reduces a positive integer by summing its individual digits.
 */&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sumDigits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;digit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;digit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Calculates Tarot Birth Cards according to Pythagorean Reduction.
 */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateTarotBirthCards&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;month&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;day&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Method: Sum of 3 date components (Year + Month + Day)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;initialSum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;year&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;month&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;day&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;firstReduction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sumDigits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initialSum&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// If initial reduction exceeds 22, reduce once more&lt;/span&gt;
  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstReduction&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;firstReduction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sumDigits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstReduction&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Handle the special 19 -&amp;gt; 10 -&amp;gt; 1 triple constellation&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstReduction&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Handle 22 (The Fool / The Master Builder)&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstReduction&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// The Fool &amp;amp; The Emperor&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Single-digit cards (1 to 9) have a single dominant archetype&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstReduction&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;firstReduction&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Two-digit cards reduce to their secondary soul archetype&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;secondaryReduction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sumDigits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstReduction&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;firstReduction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secondaryReduction&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ðŸŽ¨ Next.js 15 UI/UX &amp;amp; Card Reveal Experience
&lt;/h2&gt;

&lt;p&gt;A modern spiritual tool must feel serene, tactile, and intuitive. We focused heavily on micro-interactions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Date Selection &amp;amp; Instant Validation&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Zero-latency client-side calculations triggered immediately upon selecting month, day, and year.&lt;/li&gt;
&lt;li&gt;Accessible keyboard navigation and mobile-first touch optimization.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3D Card Flip Animation with Tailwind CSS&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Cards render face-down initially with a mystical gold-foil geometric back.&lt;/li&gt;
&lt;li&gt;Dynamic 3D perspective rotation (&lt;code&gt;transform: rotateY(180deg)&lt;/code&gt;) triggers smoothly upon calculation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Archetypal Deep-Dive&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Beyond just card names, the application breaks down:

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Core Psychological Strengths &amp;amp; Creative Talents&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shadow Aspects &amp;amp; Blindspots&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Karmic &amp;amp; Soul Lessons for Life Growth&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  âš¡ Performance, Privacy &amp;amp; Zero-Tracking Philosophy
&lt;/h2&gt;

&lt;p&gt;Most web-based divination tools monetise via predatory data-harvesting or tracking user dates of birth for third-party advertising brokers.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;&lt;a href="https://www.thetarotbirthcard.com" rel="noopener noreferrer"&gt;Tarot Birth Card Calculator&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero Registration Required&lt;/strong&gt;: No login, no email capture modal, no paywall, 100% free forever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client-Side Privacy&lt;/strong&gt;: Date of birth computations happen in the user's browser runtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perfect Lighthouse Scores&lt;/strong&gt;: 100 on Performance, 100 on Accessibility, and 100 on SEO.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic OpenGraph Cards&lt;/strong&gt;: High-res SVG card previews automatically generated for social sharing.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ðŸ”® Try the Live Calculator &amp;amp; Contribute
&lt;/h2&gt;

&lt;p&gt;Whether you are a developer interested in esoteric algorithms or simply curious to discover your own Tarot Archetype (are you a &lt;em&gt;High Priestess / Justice&lt;/em&gt; or a &lt;em&gt;Hierophant / Temperance&lt;/em&gt;?):&lt;/p&gt;

&lt;p&gt;ðŸ‘‰ &lt;strong&gt;Experience the live web app&lt;/strong&gt;: &lt;strong&gt;&lt;a href="https://www.thetarotbirthcard.com" rel="noopener noreferrer"&gt;https://www.thetarotbirthcard.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear your thoughts, feedback, and feature requests. What spiritual or psychological tools would you love to see open-sourced next? Drop your comments below!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>nextjs</category>
      <category>ai</category>
    </item>
    <item>
      <title>How I Built an AI Video-to-Quiz Generator in 3 Days (Next.js 15, DeepSeek &amp; Active Recall)</title>
      <dc:creator>Shiyang Ren</dc:creator>
      <pubDate>Sun, 18 Oct 2026 13:06:27 +0000</pubDate>
      <link>https://dev.to/renyang5201/how-i-built-an-ai-video-to-quiz-generator-in-3-days-nextjs-15-deepseek-active-recall-43m5</link>
      <guid>https://dev.to/renyang5201/how-i-built-an-ai-video-to-quiz-generator-in-3-days-nextjs-15-deepseek-active-recall-43m5</guid>
      <description>&lt;h2&gt;
  
  
  The Problem: Passive Video Watching &amp;amp; The Illusion of Competence
&lt;/h2&gt;

&lt;p&gt;Have you ever spent 2 hours watching an in-depth computer science lecture or machine learning tutorial on YouTube, feeling like you completely understood the material, only to realize the next morning that you can't recall the fundamental concepts?&lt;/p&gt;

&lt;p&gt;Cognitive scientists call this the &lt;strong&gt;"Illusion of Explanatory Depth"&lt;/strong&gt;. Passive video watching produces steep memory decay according to the Hermann Ebbinghaus forgetting curve. Without deliberate, active retrieval within 48 hours, over 70% of the lecture content is lost.&lt;/p&gt;

&lt;p&gt;To solve this for myself and fellow self-taught developers, I built &lt;strong&gt;&lt;a href="https://www.videotoquiz.com" rel="noopener noreferrer"&gt;YouTube to Quiz AI&lt;/a&gt;&lt;/strong&gt;—a fast web application that turns any YouTube educational lecture into an interactive 5-question test with timestamped explanations, scoring, and Anki-compatible flashcard export in under 10 seconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ The Tech Stack
&lt;/h2&gt;

&lt;p&gt;I prioritized lightweight edge performance, lightning-fast TTFB (Time to First Byte), and deep SSR SEO:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend &amp;amp; SSR&lt;/strong&gt;: Next.js 15 (App Router, Server Components for rich SSR educational knowledge base)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling&lt;/strong&gt;: Tailwind CSS with dark-mode first design&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Reasoning Engine&lt;/strong&gt;: DeepSeek-V3 671B MoE for Bloom's Taxonomy question generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transcript Parsing&lt;/strong&gt;: Residential proxy worker pipeline via Supadata AI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database &amp;amp; Auth&lt;/strong&gt;: Cloudflare D1 Serverless SQLite + Google Cloud OAuth 2.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global Monetization&lt;/strong&gt;: Waffo Pancake global payments&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 How it Works Under the Hood
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Robust Subtitle Extraction with Fallback
&lt;/h3&gt;

&lt;p&gt;Most developers rely on standard scrapers that quickly get IP-banned by YouTube. We route transcript requests through distributed residential proxy workers. If a video has subtitles disabled or regional restrictions, we built a zero-friction fallback allowing users to paste any lecture notes or transcript text directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Context-Grounded Prompt Engineering
&lt;/h3&gt;

&lt;p&gt;To prevent hallucinated questions, the prompt strictly conditions DeepSeek-V3 to cite exact video timestamps for every correct answer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
Analyze the following YouTube transcript. Extract 5 core conceptual questions.
For each question:
1. Provide 4 plausible options (1 correct, 3 distinct distractors).
2. Attach an educational explanation.
3. Reference the exact timestamp offset where this topic is taught in the video.
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Live Demo &amp;amp; Feedback
&lt;/h2&gt;

&lt;p&gt;The project is deployed on production with 20 free starting credits for every learner:&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://www.videotoquiz.com" rel="noopener noreferrer"&gt;Try YouTube to Quiz AI for Free&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear your feedback on the active recall flow and what features you'd like to see next!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>nextjs</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building an Interactive Tarot Birth Card Calculator: Archetypal Numerology with Next.js &amp; Tailwind</title>
      <dc:creator>Shiyang Ren</dc:creator>
      <pubDate>Sat, 10 Oct 2026 06:32:59 +0000</pubDate>
      <link>https://dev.to/renyang5201/building-an-interactive-tarot-birth-card-calculator-archetypal-numerology-with-nextjs-tailwind-f58</link>
      <guid>https://dev.to/renyang5201/building-an-interactive-tarot-birth-card-calculator-archetypal-numerology-with-nextjs-tailwind-f58</guid>
      <description>&lt;h2&gt;
  
  
  Why We Built the Tarot Birth Card Calculator
&lt;/h2&gt;

&lt;p&gt;Have you ever wondered how traditional archetypal symbolism intersects with modern interactive web development? &lt;/p&gt;

&lt;p&gt;Numerology and Tarot have fascinated thinkers and psychologists—most notably Carl Jung with his exploration of archetypes and synchronicity—for decades. In classical Hermetic Tarot, your &lt;strong&gt;Birth Card&lt;/strong&gt; (or Soul Card) is calculated using your exact date of birth, distilling your personal life path into the 22 Major Arcana archetypes (such as The Magician, The High Priestess, The Emperor, or The Star).&lt;/p&gt;

&lt;p&gt;To make this discovery process intuitive, beautifully visual, and completely friction-free, we built the &lt;strong&gt;&lt;a href="https://www.thetarotbirthcard.com" rel="noopener noreferrer"&gt;Tarot Birth Card Calculator&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ The Tech Stack
&lt;/h2&gt;

&lt;p&gt;When designing this application, our primary goals were zero layout shift, sub-second TTFB, and an immersive user interface:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework&lt;/strong&gt;: &lt;a href="https://nextjs.org/" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt; (App Router, React Server Components)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling&lt;/strong&gt;: Tailwind CSS with custom royal gold and midnight-indigo palettes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typography &amp;amp; Assets&lt;/strong&gt;: Tailored serif typography and high-definition card artwork&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment &amp;amp; Edge&lt;/strong&gt;: Hosted on Vercel with Cloudflare global edge caching&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧮 Core Algorithm: Pythagorean Date-to-Arcana Reduction
&lt;/h2&gt;

&lt;p&gt;The calculation algorithm relies on the ancient Pythagorean cross-sum reduction. Here is a simplified version of the logic implemented in TypeScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateTarotBirthCard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;birthDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;shadow&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;year&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;birthDate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getFullYear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;month&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;birthDate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMonth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;birthDate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Sum all individual digits or 2-digit groups&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;year&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;month&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;day&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Reduce to 22 (Major Arcana span 1-21, with The Fool as 22/0)&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;reduceNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;digit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;digit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;primary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;reduceNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shadow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;primary&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nf"&gt;reduceNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;shadow&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌟 Key Features &amp;amp; UX Decisions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instant Calculation without Sign-up&lt;/strong&gt;:&lt;br&gt;
Visitors shouldn't have to fill out bloated forms or sign up for a newsletter just to see their card. Instant gratification creates the best user experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dual-Card Dynamics&lt;/strong&gt;:&lt;br&gt;
Unlike simple horoscopes, many birth dates reveal a &lt;strong&gt;Primary Soul Card&lt;/strong&gt; and a &lt;strong&gt;Shadow / Teacher Card&lt;/strong&gt;, providing a more nuanced psychological perspective.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Responsive Visual Showcase&lt;/strong&gt;:&lt;br&gt;
Every card spread is rendered with dedicated symbolic illustrations, keywords, and personality strengths.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🚀 Check It Out!
&lt;/h2&gt;

&lt;p&gt;The tool is 100% free and open for everyone to explore:&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://www.thetarotbirthcard.com" rel="noopener noreferrer"&gt;Try the Tarot Birth Card Calculator&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We would love to hear feedback from fellow indie makers and developers! What's your birth card archetype? Let us know in the comments below!&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>javascript</category>
      <category>nextjs</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
