<?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: leopaul29</title>
    <description>The latest articles on DEV Community by leopaul29 (@leopaul29).</description>
    <link>https://dev.to/leopaul29</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F503997%2F256764b7-15b7-49d6-90d9-076f0a26e9ca.png</url>
      <title>DEV Community: leopaul29</title>
      <link>https://dev.to/leopaul29</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/leopaul29"/>
    <language>en</language>
    <item>
      <title>I Built a Complete Japanese Study App in One Day — Without Writing a Single Line of Code</title>
      <dc:creator>leopaul29</dc:creator>
      <pubDate>Wed, 20 May 2026 09:30:16 +0000</pubDate>
      <link>https://dev.to/leopaul29/i-built-a-complete-japanese-study-app-in-one-day-without-writing-a-single-line-of-code-bib</link>
      <guid>https://dev.to/leopaul29/i-built-a-complete-japanese-study-app-in-one-day-without-writing-a-single-line-of-code-bib</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;One paste. Five study tools. Zero setup. Here's how I built NihongoSpark for the MeDo Hackathon.&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;p&gt;NihongoSpark is a web app that takes any Japanese text — or even just an English description of a topic — and instantly generates five interconnected study tools: flashcards, a quiz, a mind map, a kanji breakdown, and a JLPT grammar pattern spotter.&lt;/p&gt;

&lt;p&gt;The entire application was built using &lt;a href="https://medo.dev" rel="noopener noreferrer"&gt;MeDo&lt;/a&gt;, Baidu's no-code AI app builder, without writing a single line of code manually. From the first prompt to a deployed, publicly accessible URL took less than a day.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem It Solves
&lt;/h2&gt;

&lt;p&gt;Japanese learners constantly juggle multiple tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anki for flashcards&lt;/li&gt;
&lt;li&gt;Jisho for kanji lookups&lt;/li&gt;
&lt;li&gt;Separate grammar reference apps&lt;/li&gt;
&lt;li&gt;Quiz generators that don't accept custom input&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these tools talk to each other, and none let you feed in your own source text. Studying a news article or manga panel means manually creating materials from scratch — which nobody does.&lt;/p&gt;

&lt;p&gt;NihongoSpark collapses that entire workflow into a single input box.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ⛩️ Kanji Breakdown &lt;em&gt;(signature feature)&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;For every kanji found in the text:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Radical decomposition&lt;/strong&gt; with meanings — e.g. 語 = 言 (speech) + 吾 (I)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On'yomi and kun'yomi&lt;/strong&gt; readings with example words&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JLPT level badge&lt;/strong&gt; (N5 to N1)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-generated mnemonic&lt;/strong&gt; — a short story linking radicals to meaning, so you actually remember it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stroke count&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is what no generic flashcard app does. The mnemonic alone makes kanji memorable in a way rote repetition never does.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Mind Map
&lt;/h3&gt;

&lt;p&gt;Interactive SVG mind map of the key concepts in the text. Nodes are draggable and clickable for definitions. Includes a full-screen expand modal for dense texts and a JP/EN toggle that instantly switches all node labels between Japanese and English.&lt;/p&gt;

&lt;h3&gt;
  
  
  🃏 Flashcards
&lt;/h3&gt;

&lt;p&gt;Vocabulary cards with furigana and English meaning. 3D flip animation on click. Cards you mark "Review again" cycle back into the deck. Completion screen when all cards are mastered.&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Quiz
&lt;/h3&gt;

&lt;p&gt;5 multiple-choice questions mixing three types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Meaning&lt;/strong&gt; — "What does 食べる mean?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reading&lt;/strong&gt; — "How do you read 東京?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fill in the blank&lt;/strong&gt; — "私は___が好きです。"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Includes a visible timer bar, instant feedback with explanation, and a score summary. The quiz only starts when you click "Start Quiz" — no auto-start surprise.&lt;/p&gt;

&lt;h3&gt;
  
  
  📐 Grammar Pattern Spotter
&lt;/h3&gt;

&lt;p&gt;Scans the text for JLPT N5–N1 grammar patterns. Each pattern is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Highlighted in the original text with color coding by level (N5 green → N1 red)&lt;/li&gt;
&lt;li&gt;Listed below with its name, JLPT level, English explanation, and an example sentence&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Example Interaction
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;東京は日本の首都で、世界で最も人口が多い都市の一つです。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output across all five panels:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Panel&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kanji&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;東 = 木 (tree) + 日 (sun) → "The sun rising behind a tree — that's east." JLPT N4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flashcards&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;首都 → Capital city · 人口 → Population · 都市 → City&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Quiz&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Q: What does 首都 mean? A) Population B) &lt;strong&gt;Capital city ✓&lt;/strong&gt; C) Metropolis D) Country&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mind Map&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tokyo → [Capital] → [World's largest] · Tokyo → [Japan] → [Asia]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Grammar&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;〜の一つ (N4) "one of ~" · 〜で (N5) location particle&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Demo &amp;amp; Screenshots
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;(Screenshots to be added — see the live app link below)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthnp0lu5eyfpz22ue95n.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthnp0lu5eyfpz22ue95n.jpg" alt="main input" width="800" height="355"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd70z5lj146vx0vywo6qt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd70z5lj146vx0vywo6qt.jpg" alt="overall" width="800" height="704"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpirdhkywv6bqn8svp993.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpirdhkywv6bqn8svp993.jpg" alt="kanji breakdown" width="677" height="640"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqu970vf5zn1lfzm9wvr8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqu970vf5zn1lfzm9wvr8.jpg" alt="flashcard" width="672" height="636"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fioacrnpc1d6g8parruub.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fioacrnpc1d6g8parruub.jpg" alt="mindmap" width="682" height="642"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcfo793cc0d0u9blo7fo6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcfo793cc0d0u9blo7fo6.jpg" alt="quiz" width="672" height="636"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgpvx5futp6pysxhk9yqc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgpvx5futp6pysxhk9yqc.jpg" alt="grammar" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://medo.dev/projects/app-bpyile6imrr5/preview" rel="noopener noreferrer"&gt;NihongoSpark on MeDo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo video:&lt;/strong&gt; &lt;a href="https://youtu.be/80sQkuyMjhk" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How I Used MeDo — The Full Build Sequence
&lt;/h2&gt;

&lt;p&gt;The entire app was built through MeDo's chat interface in 8 prompts. No code editor, no terminal, no deployment config.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt 1 — Initial app generation&lt;/strong&gt;&lt;br&gt;
Described the full app in plain English. MeDo generated a &lt;code&gt;Requirement.md&lt;/code&gt; and offered a "Generate App" button. One click and the skeleton was live.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt 2 — Flashcards panel&lt;/strong&gt;&lt;br&gt;
Specified flip animation, deck cycling behavior, and progress indicator. Functional on first try.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt 3 — Quiz panel&lt;/strong&gt;&lt;br&gt;
Added three question types, a timer bar, and a score summary screen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt 4 — Mind Map panel&lt;/strong&gt;&lt;br&gt;
SVG-based interactive mind map with draggable nodes and click-to-define tooltips.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt 5 — Kanji Breakdown panel&lt;/strong&gt;&lt;br&gt;
The core feature: radical decomposition, dual readings, JLPT badge, AI mnemonic, stroke count per character.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt 6 — Grammar Pattern Spotter&lt;/strong&gt;&lt;br&gt;
Full-width fifth panel detecting N5–N1 patterns with color-coded highlights and per-pattern explanations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt 7 — Polish &amp;amp; UX fixes&lt;/strong&gt;&lt;br&gt;
Fixed textarea contrast (black on black bug), added "Start Quiz" button, built mind map expand modal with JP/EN toggle, reorganized panel layout to: Kanji + Mind Map / Flashcards + Quiz / Grammar full-width.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt 8 — Deploy&lt;/strong&gt;&lt;br&gt;
One click. MeDo deployed to Baidu Cloud with a live public URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Total credits used: ~400&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Prompt specificity is everything.&lt;/strong&gt;&lt;br&gt;
Vague prompts give vague results. The more you describe exact behavior, layout, and edge cases upfront, the fewer fix iterations you need — and each iteration costs credits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One feature per prompt.&lt;/strong&gt;&lt;br&gt;
Trying to build two panels in one prompt leads to one being half-baked. Focused prompts gave much cleaner results every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credit budget is real.&lt;/strong&gt;&lt;br&gt;
Each prompt costs ~15 credits. You get 300 free credits on signup + 100 per day. That's roughly 25–30 prompts total. Plan your build sequence before you start — don't discover the prompt order by trial and error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MeDo handles full-stack surprisingly well.&lt;/strong&gt;&lt;br&gt;
Frontend, backend logic, and AI API calls were all wired together without any manual configuration. For a no-code tool, that's genuinely impressive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bug fixes need precise symptom descriptions.&lt;/strong&gt;&lt;br&gt;
When the textarea had black text on black background, describing the exact visual symptom (not the suspected cause) gave a faster fix than speculating about CSS conflicts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Find your differentiator early.&lt;/strong&gt;&lt;br&gt;
Generic flashcard apps already exist. The Kanji Breakdown with AI mnemonics is what makes NihongoSpark worth building and worth submitting. Define your unique feature first, then build everything else around it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Features intentionally left out of scope for this release that would make strong v2 additions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spaced repetition algorithm (SM-2) for flashcard scheduling&lt;/li&gt;
&lt;li&gt;Audio pronunciation via text-to-speech&lt;/li&gt;
&lt;li&gt;Progress tracking and study history&lt;/li&gt;
&lt;li&gt;Export to Anki-compatible CSV&lt;/li&gt;
&lt;li&gt;JLPT mock exam mode using the grammar spotter data&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built with &lt;a href="https://medo.dev" rel="noopener noreferrer"&gt;MeDo&lt;/a&gt; for the Build with MeDo Hackathon 2026 · #BuiltWithMeDo&lt;/em&gt;&lt;/p&gt;

</description>
      <category>learning</category>
      <category>japanese</category>
      <category>hackathon</category>
      <category>builtwithmedo</category>
    </item>
    <item>
      <title>👘 I Built an AI That Suggests Japanese Outfits Based on Weather (Using Auth0 &amp; GPT-4)</title>
      <dc:creator>leopaul29</dc:creator>
      <pubDate>Sun, 19 Oct 2025 16:15:28 +0000</pubDate>
      <link>https://dev.to/leopaul29/i-built-an-ai-that-suggests-japanese-outfits-based-on-weather-using-auth0-gpt-4-cdj</link>
      <guid>https://dev.to/leopaul29/i-built-an-ai-that-suggests-japanese-outfits-based-on-weather-using-auth0-gpt-4-cdj</guid>
      <description>&lt;h1&gt;
  
  
  🎌 Building a Japanese Fashion AI Agent with Auth0, LangChain &amp;amp; Real-Time Weather Data
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/auth0-2025-10-08"&gt;Auth0 for AI Agents Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Japanese Fashion AI Agent&lt;/strong&gt; is an intelligent chatbot that combines cultural fashion expertise with real-time weather data to suggest personalized Japanese-inspired outfits for any city in the world.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem It Solves
&lt;/h3&gt;

&lt;p&gt;Ever wondered what to wear in Tokyo's humid summer or Kyoto's snowy winter? Or how to incorporate beautiful Japanese clothing elements like kimono, yukata, or modern streetwear into your wardrobe based on actual weather conditions? This AI agent solves that by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌍 &lt;strong&gt;Fetching real-time weather&lt;/strong&gt; for any global city using Open-Meteo API&lt;/li&gt;
&lt;li&gt;👘 &lt;strong&gt;Suggesting authentic Japanese fashion&lt;/strong&gt; - from traditional (kimono, yukata, hakama) to modern streetwear&lt;/li&gt;
&lt;li&gt;😂 &lt;strong&gt;Adding humor and cultural context&lt;/strong&gt; - making fashion advice entertaining and educational&lt;/li&gt;
&lt;li&gt;🔐 &lt;strong&gt;Securing user sessions&lt;/strong&gt; with Auth0 authentication&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;AI Agent with ReAct Pattern&lt;/strong&gt; - Uses LangChain to autonomously reason, call weather APIs, and generate recommendations&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Japanese Fashion Expertise&lt;/strong&gt; - Trained on traditional and contemporary Japanese clothing&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Global Weather Integration&lt;/strong&gt; - Real-time data for 100,000+ cities worldwide&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Auth0 Ready&lt;/strong&gt; - Built with authentication best practices for production scaling  &lt;/p&gt;


&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🚀 &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://japan-outfit-ai.streamlit.app/" rel="noopener noreferrer"&gt;https://japan-outfit-ai.streamlit.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; [&lt;a href="https://github.com/leopaul29/japanese-fashion-ai" rel="noopener noreferrer"&gt;https://github.com/leopaul29/japanese-fashion-ai&lt;/a&gt;]&lt;/p&gt;
&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Login Screen&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5sbxcypfmctdi9nzt469.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5sbxcypfmctdi9nzt469.png" alt="Login Screen" width="800" height="1018"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Simple authentication flow powered by Auth0&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI Agent in Action&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8p1xgmgt1496va14s29.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8p1xgmgt1496va14s29.png" alt="AI Response" width="800" height="1018"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;AI agent fetching Tokyo weather and suggesting a yukata outfit&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Example Interaction
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User: "What should I wear in Tokyo today?"

AI Agent: 
🌤️ Weather in Tokyo, Japan: 22°C, clear sky, 
precipitation: 0mm, wind: 8 km/h

Perfect spring weather for a light indigo yukata 
with a subtle floral pattern! Pair it with geta 
sandals for that authentic click-clack sound effect 
(+10 style points). Since there's a gentle breeze, 
throw on a casual haori jacket - think of it as 
the Japanese cardigan but way cooler. 

You'll look like you just stepped out of a Studio 
Ghibli film! 🎌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;User logs in&lt;/strong&gt; via Auth0 (fake log for instance)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enters any city&lt;/strong&gt; (e.g., Tokyo, Paris, Kyoto)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Agent reasons&lt;/strong&gt;: "I need weather data first"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calls &lt;code&gt;get_weather&lt;/code&gt; tool&lt;/strong&gt; → Fetches real-time data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyzes conditions&lt;/strong&gt; → Suggests Japanese clothing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Returns humorous, culturally-informed advice&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  How I Used Auth0 for AI Agents
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Authentication Architecture
&lt;/h3&gt;

&lt;p&gt;I built this project with &lt;strong&gt;Auth0 OAuth 2.0&lt;/strong&gt; best practices, using the PKCE (Proof Key for Code Exchange) flow for secure authentication:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Auth0 Configuration
&lt;/span&gt;&lt;span class="n"&gt;AUTH0_DOMAIN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AUTH0_DOMAIN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;AUTH0_CLIENT_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AUTH0_CLIENT_ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;AUTH0_CLIENT_SECRET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AUTH0_CLIENT_SECRET&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# PKCE Flow Implementation
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_code_verifier&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlsafe_b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;secrets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;token_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_code_challenge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;verifier&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;digest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;verifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlsafe_b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why Auth0 for AI Agents?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Secure User Identity Management&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI agents need to know WHO is making requests&lt;/li&gt;
&lt;li&gt;Auth0 provides verified user profiles (email, name)&lt;/li&gt;
&lt;li&gt;Enables personalized recommendations and usage tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Token Management for API Calls&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI agents often call multiple external APIs (weather, fashion databases, etc.)&lt;/li&gt;
&lt;li&gt;Auth0's token system could secure these calls in production&lt;/li&gt;
&lt;li&gt;Future enhancement: Use Auth0 tokens to authenticate agent API requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Session State &amp;amp; Security&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Session management after Auth0 login
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user_authenticated&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;authenticated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&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;&lt;strong&gt;4. Scalability for Production&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Current demo uses simplified login for hackathon speed&lt;/li&gt;
&lt;li&gt;Full OAuth 2.0 flow implemented and ready to activate&lt;/li&gt;
&lt;li&gt;When scaling, Auth0 handles millions of users effortlessly&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Lessons Learned and Takeaways
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🧠 Key Insights
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. AI Agents Need Structure&lt;/strong&gt;&lt;br&gt;
Initially, I let GPT generate responses freely, which led to hallucinated weather data! The solution was implementing the &lt;strong&gt;ReAct pattern&lt;/strong&gt; (Reasoning + Acting):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;Thought&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="n"&gt;weather&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
&lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tokyo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Observation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Tokyo&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="err"&gt;°&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clear&lt;/span&gt;
&lt;span class="n"&gt;Thought&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Now&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;suggest&lt;/span&gt; &lt;span class="n"&gt;outfit&lt;/span&gt;
&lt;span class="n"&gt;Final&lt;/span&gt; &lt;span class="n"&gt;Answer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Wear&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;light&lt;/span&gt; &lt;span class="n"&gt;yukata&lt;/span&gt;&lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This forced the agent to &lt;strong&gt;always use real tools&lt;/strong&gt; before answering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Streamlit + Auth0 Session Challenges&lt;/strong&gt;&lt;br&gt;
Streamlit's session state resets on redirects, which broke the OAuth state parameter validation. I learned to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store critical data server-side (or use fixed verifiers for demos)&lt;/li&gt;
&lt;li&gt;Implement graceful fallbacks for hackathon timelines&lt;/li&gt;
&lt;li&gt;Plan for proper session storage (Redis/database) in production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Prompt Engineering is Everything&lt;/strong&gt;&lt;br&gt;
My first prompt was generic: &lt;em&gt;"Suggest an outfit"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After iteration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;You are a hilarious JAPANESE fashion advisor...
MUST use get_weather tool FIRST...
Suggest items like: kimono, yukata, hakama, haori...
Add humor with cultural references...&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result: &lt;strong&gt;10x better responses&lt;/strong&gt; with authentic Japanese fashion terms!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. API Selection Matters&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Initially tried using Auth0 tokens for Open-Meteo (unnecessary!)&lt;/li&gt;
&lt;li&gt;Open-Meteo is free and open - no auth needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lesson&lt;/strong&gt;: Understand your APIs before adding complexity&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎓 What I Learned
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;About AI Agents:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agents need &lt;strong&gt;guardrails&lt;/strong&gt; (max iterations, required tool usage)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verbose mode&lt;/strong&gt; is essential for debugging agent reasoning&lt;/li&gt;
&lt;li&gt;Tools should return &lt;strong&gt;structured, validated data&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💡 Advice for Other Developers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Building AI Agents?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with a &lt;strong&gt;single tool&lt;/strong&gt; and make it bulletproof&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;ReAct pattern&lt;/strong&gt; to prevent hallucinations&lt;/li&gt;
&lt;li&gt;Test with edge cases ("test", "123", empty strings)&lt;/li&gt;
&lt;li&gt;Keep &lt;code&gt;max_iterations=5&lt;/code&gt; (prevents infinite loops)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Integrating Auth0?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read the &lt;a href="https://auth0.com/docs/quickstarts" rel="noopener noreferrer"&gt;Auth0 Quickstarts&lt;/a&gt; - they're excellent&lt;/li&gt;
&lt;li&gt;Test OAuth flows locally before deploying&lt;/li&gt;
&lt;li&gt;Use environment variables for ALL secrets&lt;/li&gt;
&lt;li&gt;Implement demo auth for hackathons, but architect for production&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Using Streamlit?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Session state is tricky with redirects - plan accordingly&lt;/li&gt;
&lt;li&gt;Deploy early and often to catch cloud-specific issues&lt;/li&gt;
&lt;li&gt;Keep it simple - Streamlit shines with straightforward UIs&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🚀 What's Next?
&lt;/h3&gt;

&lt;p&gt;If I continue this project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Activate full Auth0 OAuth 2.0 flow&lt;/li&gt;
&lt;li&gt;✅ Add image generation (DALL-E) for outfit visualization&lt;/li&gt;
&lt;li&gt;✅ Store user preferences (favorite cities, styles)&lt;/li&gt;
&lt;li&gt;✅ Expand to other cultures (Korean hanbok, Indian saree AI agents)&lt;/li&gt;
&lt;li&gt;✅ Weather forecasts (3-7 days) for trip planning&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Streamlit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Agent&lt;/strong&gt;: LangChain (ReAct pattern)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM&lt;/strong&gt;: OpenAI GPT-4o-mini&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt;: Auth0 (OAuth 2.0 PKCE)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weather API&lt;/strong&gt;: Open-Meteo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt;: Streamlit Cloud&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It Yourself!
&lt;/h2&gt;

&lt;p&gt;🌐 &lt;strong&gt;Live App&lt;/strong&gt;: &lt;a href="https://japan-outfit-ai.streamlit.app/" rel="noopener noreferrer"&gt;https://japan-outfit-ai.streamlit.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 &lt;strong&gt;Source Code&lt;/strong&gt;: [&lt;a href="https://github.com/leopaul29/japanese-fashion-ai" rel="noopener noreferrer"&gt;https://github.com/leopaul29/japanese-fashion-ai&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;📝 &lt;strong&gt;Login&lt;/strong&gt;: Use any email/password (demo mode)&lt;/p&gt;

&lt;p&gt;🎌 &lt;strong&gt;Try&lt;/strong&gt;: Tokyo, Kyoto, Paris, New York, or your city!&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This hackathon taught me that &lt;strong&gt;AI agents are only as good as their tools and constraints&lt;/strong&gt;. Authentication isn't just about security - it's about creating personalized, trustworthy experiences. Auth0 makes it possible to focus on the AI magic while knowing the authentication layer is production-ready.&lt;/p&gt;

&lt;p&gt;Special thanks to &lt;strong&gt;Auth0&lt;/strong&gt; for hosting this challenge and pushing developers to think about AI security from day one! 🙏&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built with ❤️ and a lot of yukata references&lt;/strong&gt; 🎌&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions about the implementation? Drop a comment below!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>auth0</category>
      <category>ai</category>
      <category>authentication</category>
    </item>
    <item>
      <title>Samurai Progress Dashboard: Gamifying Japanese Learning with KendoReact</title>
      <dc:creator>leopaul29</dc:creator>
      <pubDate>Mon, 29 Sep 2025 06:52:38 +0000</pubDate>
      <link>https://dev.to/leopaul29/samurai-progress-dashboard-gamifying-japanese-learning-with-kendoreact-56hf</link>
      <guid>https://dev.to/leopaul29/samurai-progress-dashboard-gamifying-japanese-learning-with-kendoreact-56hf</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/kendoreact-2025-09-10"&gt;KendoReact Free Components Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Samurai Progress Dashboard (サムライ進捗)&lt;/strong&gt; is a gamified progress tracker that combines Japanese language learning with travel goal tracking. Inspired by samurai culture, this app transforms your Anki study sessions and Japan trip planning into an engaging RPG-like experience.&lt;/p&gt;

&lt;p&gt;The problem it solves: Learning Japanese and planning Japan trips can feel overwhelming and monotonous. By adding gamification elements (XP, gold, missions, shop items, badges), users stay motivated and track their progress in a fun, visual way.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🎯 &lt;strong&gt;Mission System&lt;/strong&gt;: Track learning goals and travel objectives with deadlines and rewards&lt;/li&gt;
&lt;li&gt;🏪 &lt;strong&gt;Shop&lt;/strong&gt;: Purchase virtual items (Ramen Bowl 🍜, Matcha Tea 🍵, Kimono 👘, etc.) using earned gold&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Statistics Dashboard&lt;/strong&gt;: Visualize XP progression with charts and view player stats&lt;/li&gt;
&lt;li&gt;🏆 &lt;strong&gt;Badge System&lt;/strong&gt;: Earn achievements as you complete missions&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Bilingual Interface&lt;/strong&gt;: Full English/Japanese translation toggle (EN/日本語)&lt;/li&gt;
&lt;li&gt;🎨 &lt;strong&gt;Samurai Theme&lt;/strong&gt;: Dark red &amp;amp; black aesthetic inspired by Japanese warrior culture&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live Demo&lt;/strong&gt;: &lt;a href="https://samurai-progress-dashboard.vercel.app/" rel="noopener noreferrer"&gt;https://samurai-progress-dashboard.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/leopaul29/Samurai-Progress-Dashboard" rel="noopener noreferrer"&gt;https://github.com/leopaul29/Samurai-Progress-Dashboard&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshots:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Dashboard (ダッシュボード)&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsga1fh0ar8k9ca5f37vl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsga1fh0ar8k9ca5f37vl.jpg" alt="Dashboard showing player stats, XP progression chart, recent missions, and purchases" width="800" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Missions Page (任務)&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn91kwg0myz9db0x7wvcr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn91kwg0myz9db0x7wvcr.jpg" alt="Missions grid with editable tasks and completion tracking" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Profile Page&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1e5ij9h3q9k2llopnf2b.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1e5ij9h3q9k2llopnf2b.jpg" alt="Player profile with badges, statistics, and language toggle" width="800" height="681"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shop (商店)&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0r9iz6nn48oegq6yabu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0r9iz6nn48oegq6yabu.jpg" alt="Shop grid with items to purchase using gold" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  KendoReact Components Used
&lt;/h2&gt;

&lt;p&gt;I successfully integrated &lt;strong&gt;10+ KendoReact free components&lt;/strong&gt; into this project:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Grid&lt;/strong&gt; (&lt;code&gt;@progress/kendo-react-grid&lt;/code&gt;) - Mission list and shop items table with row selection and inline editing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TabStrip&lt;/strong&gt; (&lt;code&gt;@progress/kendo-react-layout&lt;/code&gt;) - Main navigation between Dashboard, Missions, Shop, Statistics, and Profile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Card/CardBody/CardHeader&lt;/strong&gt; (&lt;code&gt;@progress/kendo-react-layout&lt;/code&gt;) - Dashboard info cards and profile sections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Button&lt;/strong&gt; (&lt;code&gt;@progress/kendo-react-buttons&lt;/code&gt;) - Action buttons throughout the app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chip/ChipList&lt;/strong&gt; (&lt;code&gt;@progress/kendo-react-buttons&lt;/code&gt;) - Badge display system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch&lt;/strong&gt; (&lt;code&gt;@progress/kendo-react-inputs&lt;/code&gt;) - Language toggle (EN/JP)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ProgressBar&lt;/strong&gt; (&lt;code&gt;@progress/kendo-react-progressbars&lt;/code&gt;) - XP progression visualization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notification/NotificationGroup&lt;/strong&gt; (&lt;code&gt;@progress/kendo-react-notification&lt;/code&gt;) - Success messages for purchases and actions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DropDownList&lt;/strong&gt; (&lt;code&gt;@progress/kendo-react-dropdowns&lt;/code&gt;) - Language selector (alternate implementation)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Indicators&lt;/strong&gt; (&lt;code&gt;@progress/kendo-react-indicators&lt;/code&gt;) - Loading states and visual feedback&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Additional Libraries:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;react-i18next&lt;/code&gt; + &lt;code&gt;i18next-browser-languagedetector&lt;/code&gt; - Internationalization&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@progress/kendo-theme-fluent&lt;/code&gt; - Custom samurai-themed styling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;recharts&lt;/code&gt;&lt;/strong&gt; - Data visualization for the Statistics page&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Data Visualization with Recharts
&lt;/h3&gt;

&lt;p&gt;For the &lt;strong&gt;Statistics page&lt;/strong&gt;, I integrated Recharts to create interactive charts showing progress over time. Using mocked weekly XP data, I implemented:&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="c1"&gt;// Mocked data for XP progression chart&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;weeklyXpData&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="na"&gt;day&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;xp&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="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;day&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;xp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;day&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Wed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;xp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;day&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Thu&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;xp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;day&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Fri&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;xp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;day&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sat&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;xp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;day&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sun&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;xp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;160&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;LineChart&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;weeklyXpData&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Line&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;monotone&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;dataKey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;xp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;stroke&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#dc143c&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;XAxis&lt;/span&gt; &lt;span class="nx"&gt;dataKey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;day&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;YAxis&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Tooltip&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/LineChart&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Development Journey
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Key Learnings:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Creative Workarounds for Free Components&lt;/strong&gt;&lt;br&gt;
The biggest challenge was working within the constraints of free components. I couldn't use custom cell renderers (premium feature) in the Grid, so I got creative:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mission completion&lt;/strong&gt;: Used checkbox editor instead of dropdown (todo → ongoing → done)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shop purchases&lt;/strong&gt;: Implemented row selection + external buy button instead of inline action buttons&lt;/li&gt;
&lt;li&gt;This taught me to think about UX differently and find elegant solutions within limitations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. First-Time i18next Implementation&lt;/strong&gt;&lt;br&gt;
Implementing bilingual support was a major learning experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up language detection based on browser settings&lt;/li&gt;
&lt;li&gt;Created translation files for EN/JP&lt;/li&gt;
&lt;li&gt;Built a custom language switcher with KendoReact Switch&lt;/li&gt;
&lt;li&gt;Learned about translation key organization and fallback handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Custom Theming&lt;/strong&gt;&lt;br&gt;
Created a complete samurai-inspired dark theme:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Red (#dc143c) and black (#1a1a1a) color palette&lt;/li&gt;
&lt;li&gt;Custom CSS overrides for all KendoReact components&lt;/li&gt;
&lt;li&gt;Fixed contrast issues for accessibility&lt;/li&gt;
&lt;li&gt;Added Japanese aesthetic elements (sharp borders, red accents, gradients)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. AI-Assisted Rapid Development&lt;/strong&gt;&lt;br&gt;
Used AI (Claude) to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Brainstorm Japanese cultural elements and item names&lt;/li&gt;
&lt;li&gt;Generate initial page layouts&lt;/li&gt;
&lt;li&gt;Troubleshoot KendoReact component issues&lt;/li&gt;
&lt;li&gt;Iterate quickly on design concepts&lt;/li&gt;
&lt;li&gt;Built MVP in under 48 hours thanks to AI + KendoReact's components&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What I'm Most Proud Of:
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;bilingual translation system&lt;/strong&gt;. This was my first time implementing i18next, and it works flawlessly. The app seamlessly switches between English and Japanese, maintaining context and layout. This skill will be invaluable for future projects targeting Japanese users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fun Facts:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Historical Easter Egg&lt;/strong&gt;: The default player name is "織田信長 (Oda Nobunaga)" - one of the three great unifiers of Japan and a legendary daimyo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;48-Hour MVP&lt;/strong&gt;: From idea to working prototype in less than two days&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cultural Research&lt;/strong&gt;: Recently studied Japanese history, which inspired the samurai theme and mission names&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gamification Philosophy&lt;/strong&gt;: Combined Anki learning system with RPG mechanics to make language learning addictive&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Highlights
&lt;/h2&gt;

&lt;h3&gt;
  
  
  State Management
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// GameContext provides global state for XP, gold, badges, items&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;xp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;gold&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;badges&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;addXp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;addGold&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;addBadge&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useGame&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Grid Customization
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Missions grid with inline editing&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Grid&lt;/span&gt; 
  &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;missions&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;editable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;incell&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
  &lt;span class="nx"&gt;onItemChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleItemChange&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;GridColumn&lt;/span&gt; &lt;span class="nx"&gt;field&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Done&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;editor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;boolean&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Grid&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Bilingual Support
&lt;/h3&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i18n&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useTranslation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dashboardtitle&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;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="nx"&gt;i18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;changeLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Target Audience
&lt;/h2&gt;

&lt;p&gt;Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Japanese language learners using Anki or similar spaced repetition systems&lt;/li&gt;
&lt;li&gt;People planning trips to Japan who want to gamify their preparation&lt;/li&gt;
&lt;li&gt;Anyone who loves RPG mechanics and Japanese culture&lt;/li&gt;
&lt;li&gt;Students looking for motivation to maintain consistent study habits&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Future Enhancements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Data persistence with localStorage/backend&lt;/li&gt;
&lt;li&gt;More shop items and badge types&lt;/li&gt;
&lt;li&gt;Mission templates (JLPT prep, travel checklist)&lt;/li&gt;
&lt;li&gt;Social features (leaderboards, friend challenges)&lt;/li&gt;
&lt;li&gt;Mobile app version&lt;/li&gt;
&lt;li&gt;Integration with actual Anki stats&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This project showcases how KendoReact's free components can build a fully-featured, production-ready application with complex interactions, beautiful UI, and bilingual support. The constraints of free components pushed me to think creatively about UX patterns, resulting in a cleaner, more intuitive interface.&lt;/p&gt;

&lt;p&gt;Special thanks to the KendoReact team for providing such powerful free components and excellent documentation!&lt;/p&gt;




&lt;h2&gt;
  
  
  サムライ進捗ダッシュボード：KendoReactで日本語学習をゲーム化
&lt;/h2&gt;

&lt;h3&gt;
  
  
  作ったもの
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;サムライ進捗ダッシュボード&lt;/strong&gt;は、日本語学習と日本旅行の目標追跡を組み合わせた、ゲーム化された進捗管理アプリです。侍の文化にインスピレーションを受け、Ankiの勉強セッションと日本旅行の計画をRPGのような楽しい体験に変えます。&lt;/p&gt;

&lt;h3&gt;
  
  
  主な機能：
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🎯 &lt;strong&gt;ミッションシステム&lt;/strong&gt;：学習目標と旅行目標を期限と報酬付きで追跡&lt;/li&gt;
&lt;li&gt;🏪 &lt;strong&gt;ショップ&lt;/strong&gt;：獲得したゴールドで仮想アイテムを購入&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;統計ダッシュボード&lt;/strong&gt;：XPの進捗をチャートで視覚化&lt;/li&gt;
&lt;li&gt;🏆 &lt;strong&gt;バッジシステム&lt;/strong&gt;：ミッション完了で実績を獲得&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;バイリンガルインターフェース&lt;/strong&gt;：英語/日本語の完全対応&lt;/li&gt;
&lt;li&gt;🎨 &lt;strong&gt;サムライテーマ&lt;/strong&gt;：日本の武士文化に触発された赤と黒のダークテーマ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;KendoReactの無料コンポーネントだけで、完全に機能するゲーム化アプリを48時間以内に構築できることを証明しました！&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Made with ⚔️ by a Japanese culture enthusiast&lt;/em&gt;&lt;br&gt;
&lt;em&gt;KendoReact + React + TypeScript + Vite&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>kendoreactchallenge</category>
      <category>react</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
