<?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 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>
