<?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: Antonio</title>
    <description>The latest articles on DEV Community by Antonio (@viajapptravel).</description>
    <link>https://dev.to/viajapptravel</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4035075%2F894e4727-42b9-481b-93c9-24ba801c2774.png</url>
      <title>DEV Community: Antonio</title>
      <link>https://dev.to/viajapptravel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/viajapptravel"/>
    <language>en</language>
    <item>
      <title>How to Automate Blog Posts with GitHub Actions and AI</title>
      <dc:creator>Antonio</dc:creator>
      <pubDate>Mon, 17 Aug 2026 10:37:06 +0000</pubDate>
      <link>https://dev.to/viajapptravel/how-to-automate-blog-posts-with-github-actions-and-ai-53of</link>
      <guid>https://dev.to/viajapptravel/how-to-automate-blog-posts-with-github-actions-and-ai-53of</guid>
      <description>&lt;h1&gt;
  
  
  How to Automate Blog Posts with GitHub Actions
&lt;/h1&gt;

&lt;p&gt;I auto-generate one blog post per week about Japan travel. Here's the exact setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  The System
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub Actions → API → Generate Article → Post to Dev.to
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1: Article Pool
&lt;/h2&gt;

&lt;p&gt;I have 19 pre-written articles about Japan in a JSON pool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"slug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"curiosidades-japon"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"15 Curiosidades de Japón"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Curiosidades"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: GitHub Action
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Auto Blog Post&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1'&lt;/span&gt;  &lt;span class="c1"&gt;# Every Monday at 10am UTC&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Generate and Post&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;# Get next article from pool&lt;/span&gt;
          &lt;span class="s"&gt;ARTICLE=$(curl -s -X POST $API_URL/v1/blog/generate)&lt;/span&gt;

          &lt;span class="s"&gt;# Extract content&lt;/span&gt;
          &lt;span class="s"&gt;TITLE=$(echo $ARTICLE | jq -r '.post.title')&lt;/span&gt;
          &lt;span class="s"&gt;CONTENT=$(echo $ARTICLE | jq -r '.post.content')&lt;/span&gt;
          &lt;span class="s"&gt;TAGS=$(echo $ARTICLE | jq -r '.post.tags | join(",")')&lt;/span&gt;

          &lt;span class="s"&gt;# Post to Dev.to&lt;/span&gt;
          &lt;span class="s"&gt;curl -X POST https://dev.to/api/articles \&lt;/span&gt;
            &lt;span class="s"&gt;-H "api-key: ${{ secrets.DEVTO_API_KEY }}" \&lt;/span&gt;
            &lt;span class="s"&gt;-H "Content-Type: application/json" \&lt;/span&gt;
            &lt;span class="s"&gt;-d "{&lt;/span&gt;
              &lt;span class="s"&gt;"article": {&lt;/span&gt;
                &lt;span class="s"&gt;"title": "$TITLE",&lt;/span&gt;
                &lt;span class="s"&gt;"body_markdown": "$CONTENT",&lt;/span&gt;
                &lt;span class="s"&gt;"tags": ["webdev", "javascript"],&lt;/span&gt;
                &lt;span class="s"&gt;"published": true&lt;/span&gt;
              &lt;span class="s"&gt;}&lt;/span&gt;
            &lt;span class="s"&gt;}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Secrets
&lt;/h2&gt;

&lt;p&gt;Add your Dev.to API key as a GitHub secret:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to repo Settings → Secrets → Actions&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;DEVTO_API_KEY&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1 article/week&lt;/strong&gt; automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0 manual work&lt;/strong&gt; after setup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-posted&lt;/strong&gt; to website + Dev.to&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO optimized&lt;/strong&gt; with metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cost
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Actions: &lt;strong&gt;Free&lt;/strong&gt; (2000 minutes/month)&lt;/li&gt;
&lt;li&gt;Dev.to API: &lt;strong&gt;Free&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Total: &lt;strong&gt;$0/month&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Source code&lt;/strong&gt;: &lt;a href="https://github.com/storbaz/japan-travel-api" rel="noopener noreferrer"&gt;github.com/storbaz/japan-travel-api&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>productivity</category>
      <category>javascript</category>
    </item>
    <item>
      <title>ViajApp: How I Built Interactive Maps and Shared Expenses for a Travel App</title>
      <dc:creator>Antonio</dc:creator>
      <pubDate>Mon, 10 Aug 2026 11:12:50 +0000</pubDate>
      <link>https://dev.to/viajapptravel/viajapp-how-i-built-interactive-maps-and-shared-expenses-for-a-travel-app-2gc1</link>
      <guid>https://dev.to/viajapptravel/viajapp-how-i-built-interactive-maps-and-shared-expenses-for-a-travel-app-2gc1</guid>
      <description>&lt;h1&gt;
  
  
  ViajApp: Interactive Maps and Shared Expenses
&lt;/h1&gt;

&lt;p&gt;I just shipped three major features for ViajApp, my Japan travel platform. Here's what I built and the technical challenges.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Interactive Route Map
&lt;/h2&gt;

&lt;p&gt;The trip planner now includes a &lt;strong&gt;Leaflet/OpenStreetMap&lt;/strong&gt; component that visualizes your Japan route.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cities are stored with coordinates in a &lt;code&gt;cityCoords&lt;/code&gt; dictionary&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;FitBounds&lt;/code&gt; component auto-zooms to show all markers&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;L.divIcon&lt;/code&gt; creates custom numbered markers (red for stops, green for final)&lt;/li&gt;
&lt;li&gt;A dashed polyline connects all cities&lt;/li&gt;
&lt;li&gt;Mobile-optimized: &lt;code&gt;scrollWheelZoom={false}&lt;/code&gt; prevents accidental zoom&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The tricky part:
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;react-leaflet&lt;/code&gt; library requires client-side rendering only. I used Next.js &lt;code&gt;dynamic()&lt;/code&gt; with &lt;code&gt;{ ssr: false }&lt;/code&gt; to prevent SSR errors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;RouteMap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./RouteMap&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;ssr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Shared Expenses
&lt;/h2&gt;

&lt;p&gt;Built a complete expense splitting system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Groups&lt;/strong&gt;: Create a group, add members&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expenses&lt;/strong&gt;: Add expenses with amount, currency, description&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Balances&lt;/strong&gt;: Auto-calculate who owes whom&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supabase RLS&lt;/strong&gt;: Row-level security policies for data isolation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Backend (FastAPI):
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@router.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/groups&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CreateGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Depends&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_current_user&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;expense_groups&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;({...}).&lt;/span&gt;&lt;span class="nf"&gt;execute&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;group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Community Tips
&lt;/h2&gt;

&lt;p&gt;A Reddit-like system where travelers share tips:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Categories: budget, transport, food, safety, accommodation&lt;/li&gt;
&lt;li&gt;Like system for voting&lt;/li&gt;
&lt;li&gt;Filter by city or category&lt;/li&gt;
&lt;li&gt;Moderation via &lt;code&gt;approved&lt;/code&gt; flag&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;63 pages live&lt;/li&gt;
&lt;li&gt;35+ API endpoints&lt;/li&gt;
&lt;li&gt;All features working in production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Try it&lt;/strong&gt;: &lt;a href="https://www.viajapp.app" rel="noopener noreferrer"&gt;viajapp.app&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Building a Real-Time Currency Converter for Travel Apps</title>
      <dc:creator>Antonio</dc:creator>
      <pubDate>Mon, 03 Aug 2026 12:57:18 +0000</pubDate>
      <link>https://dev.to/viajapptravel/building-a-real-time-currency-converter-for-travel-apps-1k8g</link>
      <guid>https://dev.to/viajapptravel/building-a-real-time-currency-converter-for-travel-apps-1k8g</guid>
      <description>&lt;h1&gt;
  
  
  Building a Real-Time Currency Converter for Travel Apps
&lt;/h1&gt;

&lt;p&gt;Every traveler needs to convert currencies. Here's how I built a real-time converter for ViajApp.&lt;/p&gt;

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

&lt;p&gt;When you're in Japan, you need to quickly convert yen to your home currency. mental math is hard, and most apps require internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;A currency converter that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Updates rates daily&lt;/li&gt;
&lt;li&gt;Works offline&lt;/li&gt;
&lt;li&gt;Shows historical trends&lt;/li&gt;
&lt;li&gt;Has a clean UI&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Backend (FastAPI)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@router.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/convert&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;convert_currency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;from_currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;to_currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_exchange_rate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from_currency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_currency&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;converted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rate&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;from_currency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to_currency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;converted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;converted&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Frontend (Next.js)
&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="nx"&gt;convertCurrency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;`/api/v1/currency/convert?from=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;to=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;amount=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;setConverted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;converted&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;10 currencies&lt;/strong&gt;: JPY, EUR, USD, GBP, KRW, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daily updates&lt;/strong&gt;: Rates refresh every 24 hours&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline support&lt;/strong&gt;: Last known rates cached&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick presets&lt;/strong&gt;: "How much is 1000 yen?"&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cache everything&lt;/strong&gt;: API calls are slow, cache is fast&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Show the rate&lt;/strong&gt;: Users want to see the exchange rate, not just the result&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Round properly&lt;/strong&gt;: Money should always show 2 decimal places&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;Try it&lt;/strong&gt;: &lt;a href="https://www.viajapp.app/currency" rel="noopener noreferrer"&gt;viajapp.app/currency&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>10 Things I Learned Building a Travel App (That Nobody Tells You)</title>
      <dc:creator>Antonio</dc:creator>
      <pubDate>Sun, 02 Aug 2026 10:46:03 +0000</pubDate>
      <link>https://dev.to/viajapptravel/10-things-i-learned-building-a-travel-app-that-nobody-tells-you-h7m</link>
      <guid>https://dev.to/viajapptravel/10-things-i-learned-building-a-travel-app-that-nobody-tells-you-h7m</guid>
      <description>&lt;h1&gt;
  
  
  10 Things I Learned Building a Travel App
&lt;/h1&gt;

&lt;p&gt;I spent 6 months building ViajApp, a Japan travel platform. Here's what I wish I knew before starting.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Data is King, Not Code
&lt;/h2&gt;

&lt;p&gt;The hardest part wasn't coding - it was collecting accurate data about Japan travel. Prices change, restaurants close, trains get rerouted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: I built a data pipeline that updates automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Users Don't Care About Your Stack
&lt;/h2&gt;

&lt;p&gt;Nobody asks if you use React or Vue. They care if the app works and looks good.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. API Design is Everything
&lt;/h2&gt;

&lt;p&gt;A well-designed API saves you months of refactoring later.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /v1/food/restaurants?city=tokyo&amp;amp;cuisine=ramen
GET /v1/transport/route?from=tokyo&amp;amp;to=kyoto
GET /v1/currency/convert?from=JPY&amp;amp;to=EUR&amp;amp;amount=1000
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Automation Pays for Itself
&lt;/h2&gt;

&lt;p&gt;I automated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Blog post generation (1 article/week)&lt;/li&gt;
&lt;li&gt;Currency rate updates (daily)&lt;/li&gt;
&lt;li&gt;Weather data sync (hourly)&lt;/li&gt;
&lt;li&gt;Event calendar updates (weekly)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Time saved&lt;/strong&gt;: ~10 hours/week&lt;/p&gt;

&lt;h2&gt;
  
  
  5. SEO is Not Optional
&lt;/h2&gt;

&lt;p&gt;Each page has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Meta titles and descriptions&lt;/li&gt;
&lt;li&gt;Open Graph tags&lt;/li&gt;
&lt;li&gt;Structured data&lt;/li&gt;
&lt;li&gt;XML sitemap&lt;/li&gt;
&lt;li&gt;Robots.txt&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Mobile-First, Always
&lt;/h2&gt;

&lt;p&gt;60% of travel app users are on mobile. If your app doesn't work on phones, you've lost them.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Error Handling Saves Lives
&lt;/h2&gt;

&lt;p&gt;When someone is in Japan and your app crashes, they're lost. I added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Offline mode&lt;/li&gt;
&lt;li&gt;Fallback data&lt;/li&gt;
&lt;li&gt;Error boundaries&lt;/li&gt;
&lt;li&gt;Graceful degradation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8. Testing is Cheaper Than Bugs
&lt;/h2&gt;

&lt;p&gt;33 tests covering API endpoints, currency calculations, and data validation.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Documentation is a Feature
&lt;/h2&gt;

&lt;p&gt;The API has OpenAPI docs at &lt;code&gt;/docs&lt;/code&gt;. Users love it.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Ship Fast, Iterate Faster
&lt;/h2&gt;

&lt;p&gt;Version 1 was ugly but functional. Version 2 is beautiful. Users don't wait for perfect.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Built ViajApp&lt;/strong&gt;: &lt;a href="https://www.viajapp.app" rel="noopener noreferrer"&gt;viajapp.app&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>career</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>How I Built a Japan Travel App with Next.js and FastAPI</title>
      <dc:creator>Antonio</dc:creator>
      <pubDate>Sat, 18 Jul 2026 10:12:18 +0000</pubDate>
      <link>https://dev.to/viajapptravel/how-i-built-a-japan-travel-app-with-nextjs-and-fastapi-1m7h</link>
      <guid>https://dev.to/viajapptravel/how-i-built-a-japan-travel-app-with-nextjs-and-fastapi-1m7h</guid>
      <description>&lt;h1&gt;
  
  
  How I Built a Japan Travel App with Next.js and FastAPI
&lt;/h1&gt;

&lt;p&gt;Last year I decided to plan a trip to Japan. I quickly realized that information about Japan travel is scattered across dozens of websites, each with different formats and outdated prices.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;ViajApp&lt;/strong&gt; - a complete Japan travel platform with API, web app, and soon mobile.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Next.js 16 with TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: FastAPI (Python)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: Supabase (PostgreSQL)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting&lt;/strong&gt;: Vercel + Render&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  1. Restaurant Search with Serper API
&lt;/h3&gt;

&lt;p&gt;Real-time search for restaurants, temples, and attractions using Google Places data.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Currency Converter
&lt;/h3&gt;

&lt;p&gt;Live exchange rates updated daily. No more mental math at konbini.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Transport Calculator
&lt;/h3&gt;

&lt;p&gt;Calculate the best route between cities with JR Pass recommendations.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Blog Auto-Generation
&lt;/h3&gt;

&lt;p&gt;This article you're reading was automatically generated and posted via GitHub Actions. Every week, a new article about Japan travel is created and published to both the website and Dev.to.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Emergency Info
&lt;/h3&gt;

&lt;p&gt;Real-time weather, emergency numbers, and hospital finder for each region.&lt;/p&gt;

&lt;h2&gt;
  
  
  The API
&lt;/h2&gt;

&lt;p&gt;The backend has 40+ endpoints covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Culture guides&lt;/li&gt;
&lt;li&gt;Food recommendations
&lt;/li&gt;
&lt;li&gt;Budget calculator&lt;/li&gt;
&lt;li&gt;Event finder&lt;/li&gt;
&lt;li&gt;Transport info&lt;/li&gt;
&lt;li&gt;Emergency services&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start with the data&lt;/strong&gt;: Before writing code, I collected all the Japan travel information I could find&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API-first design&lt;/strong&gt;: Building the API first made the frontend much easier&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation is key&lt;/strong&gt;: The blog auto-generation saves hours every week&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO matters&lt;/strong&gt;: Each article has metadata, tags, and structured content&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;Mobile app (React Native)&lt;/li&gt;
&lt;li&gt;AI-powered itinerary generator&lt;/li&gt;
&lt;li&gt;More countries (Greece, Italy, Spain)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;🌐 &lt;strong&gt;Web&lt;/strong&gt;: &lt;a href="https://japan-travel-web-lime.vercel.app" rel="noopener noreferrer"&gt;japan-travel-web-lime.vercel.app&lt;/a&gt;&lt;br&gt;
📡 &lt;strong&gt;API&lt;/strong&gt;: &lt;a href="https://japan-travel-api.onrender.com" rel="noopener noreferrer"&gt;japan-travel-api.onrender.com&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with love for Japan 🇯🇵&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
