<?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: Boyuedu</title>
    <description>The latest articles on DEV Community by Boyuedu (@boyuedu).</description>
    <link>https://dev.to/boyuedu</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%2F3996413%2Fd0d4fac9-495a-450e-993a-788ba7894a9e.png</url>
      <title>DEV Community: Boyuedu</title>
      <link>https://dev.to/boyuedu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/boyuedu"/>
    <language>en</language>
    <item>
      <title>Building Soccer DNA: A Soccer Personality Quiz with React and Next.js</title>
      <dc:creator>Boyuedu</dc:creator>
      <pubDate>Mon, 22 Jun 2026 07:50:36 +0000</pubDate>
      <link>https://dev.to/boyuedu/building-soccer-dna-a-soccer-personality-quiz-with-react-and-nextjs-224d</link>
      <guid>https://dev.to/boyuedu/building-soccer-dna-a-soccer-personality-quiz-with-react-and-nextjs-224d</guid>
      <description>&lt;p&gt;I recently built &lt;strong&gt;Soccer DNA&lt;/strong&gt;, a soccer personality quiz that turns match decisions into a personalized soccer profile.&lt;/p&gt;

&lt;p&gt;Instead of asking abstract personality questions, the app puts users into realistic match situations and asks what they would actually do on the pitch. After answering 30 scenarios, users get a custom result with a soccer archetype, scout report, core profile, World Cup-style storyline, best teammate match, and next upgrade advice.&lt;/p&gt;

&lt;p&gt;I built it as a side project to explore a simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can a personality quiz feel more like a game simulation and less like a generic form?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Soccer DNA does
&lt;/h2&gt;

&lt;p&gt;The user answers 30 soccer scenarios.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is the 117th minute of a World Cup final. The score is still 1–1.&lt;br&gt;
You receive the ball at the edge of the box with one defender in front of you and a teammate sprinting on the right.&lt;br&gt;
What do you do?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer options are not random personality labels. They are match decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;draw the defender and pass&lt;/li&gt;
&lt;li&gt;read the situation and pick the best option&lt;/li&gt;
&lt;li&gt;take the defender on and shoot&lt;/li&gt;
&lt;li&gt;fake the shot and make a surprise pass&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each answer affects several soccer-specific dimensions.&lt;/p&gt;

&lt;p&gt;At the end, the user receives a personalized profile, such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Dribbling Magician Hybrid&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The result includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Soccer archetype&lt;/li&gt;
&lt;li&gt;Scout report&lt;/li&gt;
&lt;li&gt;Core profile&lt;/li&gt;
&lt;li&gt;World Cup storyline&lt;/li&gt;
&lt;li&gt;Best teammate match&lt;/li&gt;
&lt;li&gt;Next upgrade advice&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I used match scenarios instead of normal quiz questions
&lt;/h2&gt;

&lt;p&gt;A lot of personality quizzes ask abstract questions like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do you prefer logic or emotion?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That works for general personality tests, but it does not feel very natural for soccer.&lt;/p&gt;

&lt;p&gt;For soccer fans and players, personality often shows up through decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do you play safe under pressure?&lt;/li&gt;
&lt;li&gt;Do you scan before receiving?&lt;/li&gt;
&lt;li&gt;Do you take on the defender?&lt;/li&gt;
&lt;li&gt;Do you slow the game down?&lt;/li&gt;
&lt;li&gt;Do you create chaos?&lt;/li&gt;
&lt;li&gt;Do you pass when a teammate is in a better position?&lt;/li&gt;
&lt;li&gt;Do you step up in big moments?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I designed the quiz around realistic match decisions.&lt;/p&gt;

&lt;p&gt;The goal was to make users think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This actually feels like a situation I would face in a game.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The 7 scoring dimensions
&lt;/h2&gt;

&lt;p&gt;I did not use traditional MBTI dimensions. Instead, I created 7 soccer-specific dimensions:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Soccer IQ
&lt;/h3&gt;

&lt;p&gt;How well the user reads the game, anticipates space, and makes intelligent decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Leadership
&lt;/h3&gt;

&lt;p&gt;How much the user tends to take responsibility, organize play, and influence the team.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Creativity
&lt;/h3&gt;

&lt;p&gt;How often the user looks for unexpected solutions instead of obvious ones.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Teamwork
&lt;/h3&gt;

&lt;p&gt;How naturally the user connects with teammates and supports collective play.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Flair
&lt;/h3&gt;

&lt;p&gt;How expressive, stylish, and technically adventurous the user is.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Emotional Control
&lt;/h3&gt;

&lt;p&gt;How calm the user stays under pressure.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Courage
&lt;/h3&gt;

&lt;p&gt;How willing the user is to take bold actions in big moments.&lt;/p&gt;

&lt;p&gt;These dimensions are not meant to decide whether a player is “good” or “bad”. They are meant to describe how someone tends to play.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rule-based scoring logic
&lt;/h2&gt;

&lt;p&gt;The current version uses a rule-based scoring system.&lt;/p&gt;

&lt;p&gt;Each answer updates multiple dimensions. For example, a bold dribbling decision might increase &lt;code&gt;flair&lt;/code&gt; and &lt;code&gt;courage&lt;/code&gt;, while a patient passing decision might increase &lt;code&gt;soccerIQ&lt;/code&gt; and &lt;code&gt;teamwork&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A simplified version looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;initialProfile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;soccerIQ&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="na"&gt;leadership&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="na"&gt;creativity&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="na"&gt;teamwork&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="na"&gt;flair&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="na"&gt;emotionalControl&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="na"&gt;courage&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;applyAnswerWeights&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;answerWeights&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;updatedProfile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;for &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;key&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;answerWeights&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;updatedProfile&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;answerWeights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&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;updatedProfile&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;p&gt;Each quiz option has its own weight object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;answerOption&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;turn-under-pressure&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Scan over your shoulder and turn forward.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;weights&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;soccerIQ&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;creativity&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="na"&gt;courage&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="na"&gt;flair&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="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the user completes all 30 questions, the final profile is normalized and mapped to an archetype.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getTopDimensions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;profile&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="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&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;b&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="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;a&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="nf"&gt;slice&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="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(([&lt;/span&gt;&lt;span class="nx"&gt;dimension&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;dimension&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;p&gt;The final archetype depends on the strongest dimensions and the balance between them.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;determineArchetype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;profile&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;topDimensions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getTopDimensions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;);&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;topDimensions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;flair&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class="nx"&gt;topDimensions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;creativity&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class="nx"&gt;topDimensions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;courage&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="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The Dribbling Magician Hybrid&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;topDimensions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;soccerIQ&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class="nx"&gt;topDimensions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;teamwork&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class="nx"&gt;topDimensions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;emotionalControl&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="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The Midfield Controller&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="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The Balanced Playmaker&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not machine learning yet. It is intentionally rule-based because I wanted the scoring to be easy to inspect, tune, and improve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Result generation
&lt;/h2&gt;

&lt;p&gt;The result page is the most important part of the product.&lt;/p&gt;

&lt;p&gt;A quiz becomes much more interesting when the final result feels specific and shareable.&lt;/p&gt;

&lt;p&gt;Instead of only showing a label, Soccer DNA generates several result modules.&lt;/p&gt;

&lt;h3&gt;
  
  
  Soccer archetype
&lt;/h3&gt;

&lt;p&gt;This is the main identity of the user.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Dribbling Magician Hybrid&lt;/strong&gt;&lt;br&gt;
You turn improvisation into your signature.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This gives the user a clear and memorable identity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scout report
&lt;/h3&gt;

&lt;p&gt;The scout report is a simplified coaching-style analysis.&lt;/p&gt;

&lt;p&gt;It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Core identity&lt;/li&gt;
&lt;li&gt;Strengths&lt;/li&gt;
&lt;li&gt;Risks&lt;/li&gt;
&lt;li&gt;Best role&lt;/li&gt;
&lt;li&gt;Tactical fit&lt;/li&gt;
&lt;li&gt;Growth advice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Core Identity:
Expressive, inventive, improvisational

Strengths:
- Elite dribbling flair
- Unpredictable creativity

Risks:
- Low tactical discipline

Best Role:
Dribbling winger / free creator

Tactical Fit:
Free attacking environments

Growth Advice:
Refine the final touch after beating the first defender
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is to make the result feel more like a personalized analysis than a generic quiz output.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core profile
&lt;/h3&gt;

&lt;p&gt;The core profile visualizes the 7 dimensions with stat bars and a radar chart.&lt;/p&gt;

&lt;p&gt;This was inspired by how soccer fans already think about players:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;attributes&lt;/li&gt;
&lt;li&gt;strengths&lt;/li&gt;
&lt;li&gt;weaknesses&lt;/li&gt;
&lt;li&gt;roles&lt;/li&gt;
&lt;li&gt;player profiles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The profile makes the result easier to understand and easier to compare with friends.&lt;/p&gt;

&lt;h3&gt;
  
  
  World Cup storyline
&lt;/h3&gt;

&lt;p&gt;This is the more emotional part of the result.&lt;/p&gt;

&lt;p&gt;Instead of only saying what kind of player the user is, the app gives them a fictional World Cup-style moment.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Facing the last defender, you skip the obvious option and create space with footwork that feels entirely yours — the kind of improvisation the crowd remembers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This makes the result feel more cinematic and shareable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best teammate match
&lt;/h3&gt;

&lt;p&gt;This module explains what type of teammate would complement the user’s style.&lt;/p&gt;

&lt;p&gt;For example, a creative dribbler might work best with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a linking core&lt;/li&gt;
&lt;li&gt;an offensive brain&lt;/li&gt;
&lt;li&gt;a teammate who reads movement early&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Next upgrade
&lt;/h3&gt;

&lt;p&gt;This gives the user one area to improve.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;After beating the first defender, choose the better next action. Your technique already draws attention — make every dribble lead closer to a goal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I wanted the result to feel fun, but also somewhat useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  UI design direction
&lt;/h2&gt;

&lt;p&gt;The visual design is inspired by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;soccer analytics dashboards&lt;/li&gt;
&lt;li&gt;player cards&lt;/li&gt;
&lt;li&gt;scouting reports&lt;/li&gt;
&lt;li&gt;World Cup storytelling&lt;/li&gt;
&lt;li&gt;dark sports-tech interfaces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main visual elements are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dark glass-style cards&lt;/li&gt;
&lt;li&gt;pitch backgrounds&lt;/li&gt;
&lt;li&gt;cyan and purple accents&lt;/li&gt;
&lt;li&gt;rounded UI panels&lt;/li&gt;
&lt;li&gt;stat bars and radar charts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The challenge was balancing two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make it feel fun and shareable.&lt;/li&gt;
&lt;li&gt;Make it still look like a real product.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result page was especially important because that is the part users are most likely to screenshot and share.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;p&gt;The current version is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;Rule-based scoring logic&lt;/li&gt;
&lt;li&gt;Responsive UI for desktop and mobile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is intentionally lightweight. I wanted the first version to focus on product experience, quiz structure, and result design before adding more complex backend features.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;Building Soccer DNA taught me that a quiz product is not only about questions.&lt;/p&gt;

&lt;p&gt;The full loop matters:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The user understands the idea quickly.&lt;/li&gt;
&lt;li&gt;The questions feel immersive enough to finish.&lt;/li&gt;
&lt;li&gt;The scoring logic feels believable.&lt;/li&gt;
&lt;li&gt;The result feels personalized.&lt;/li&gt;
&lt;li&gt;The result page feels worth sharing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The most important product question was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do I make someone feel like the result was created for them?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is why I focused on personalized archetypes, scout reports, World Cup storylines, teammate matches, and upgrade advice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would improve next
&lt;/h2&gt;

&lt;p&gt;There are several things I want to improve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add more archetypes&lt;/li&gt;
&lt;li&gt;Improve the scoring logic&lt;/li&gt;
&lt;li&gt;Add better share cards&lt;/li&gt;
&lt;li&gt;Make the result page easier to export as an image&lt;/li&gt;
&lt;li&gt;Improve mobile UX&lt;/li&gt;
&lt;li&gt;Add more World Cup-themed scenarios&lt;/li&gt;
&lt;li&gt;Tune the English terminology for global soccer fans&lt;/li&gt;
&lt;li&gt;Make the README more complete&lt;/li&gt;
&lt;li&gt;Collect user feedback and adjust the archetype mapping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the future, I might also explore a more data-driven or ML-assisted scoring system, but for now the rule-based approach is easier to understand and iterate on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Live demo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://soccer-mbti.kickquiz.workers.dev" rel="noopener noreferrer"&gt;Try Soccer DNA&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Boyuedu/football-mbti-quiz" rel="noopener noreferrer"&gt;View the source code on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I would love feedback on the scoring logic, result personalization, UI/UX, and whether the result page feels shareable enough.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
