<?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: Zihan Zhao</title>
    <description>The latest articles on DEV Community by Zihan Zhao (@zihan64).</description>
    <link>https://dev.to/zihan64</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%2F4209841%2F2e490794-6fa6-45c7-aa8e-f318046928d7.png</url>
      <title>DEV Community: Zihan Zhao</title>
      <link>https://dev.to/zihan64</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zihan64"/>
    <language>en</language>
    <item>
      <title>HikingPSU: Clear Trail Ratings and an AI Guide for Happy Valley</title>
      <dc:creator>Zihan Zhao</dc:creator>
      <pubDate>Tue, 27 Oct 2026 03:40:35 +0000</pubDate>
      <link>https://dev.to/zihan64/hikingpsu-clear-trail-ratings-and-an-ai-guide-for-happy-valley-27h8</link>
      <guid>https://dev.to/zihan64/hikingpsu-clear-trail-ratings-and-an-ai-guide-for-happy-valley-27h8</guid>
      <description>&lt;h2&gt;
  
  
  What we built
&lt;/h2&gt;

&lt;p&gt;State College has a strong hiking tradition, and great trails start just outside town. But information about them is scattered across club pages, forums, PDFs and word of mouth. On popular apps, a trail is labeled only Easy, Moderate or Hard, with no reason given. Details that matter here are often missing, too, like whether you can get there without a car or whether it's hunting season.&lt;/p&gt;

&lt;p&gt;At HackPSU, our team of four built &lt;strong&gt;&lt;a href="https://hikingpsu.com" rel="noopener noreferrer"&gt;HikingPSU&lt;/a&gt;&lt;/strong&gt;: one place where Penn State hikers can find trails around Happy Valley, see clear ratings, and build a hiking community together.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/6LZJRBs1ZFU" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A map of 52 trails.&lt;/strong&gt; We imported 40 from OpenStreetMap and entered 12 by hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A five-level difficulty scale that explains itself.&lt;/strong&gt; Effort = miles + feet of climb ÷ 500. Rough terrain bumps a trail up a level. Every rating shows its reasons, so "Level 3" means something.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An AI trail planner.&lt;/strong&gt; Users ask hiking questions, and our AI agent, powered by the Gemini API, answers using our trail data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check-ins and badges.&lt;/strong&gt; When you finish a hike near a trailhead, you can check in with GPS and earn badges.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What we used
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React, Vite, Leaflet and Tailwind, hosted on AWS Amplify&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; FastAPI on Render&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data:&lt;/strong&gt; MongoDB and OpenStreetMap&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Login:&lt;/strong&gt; Auth0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI:&lt;/strong&gt; Gemini API&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What broke at 3am
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The guest limit didn't work.&lt;/strong&gt; Guests get 5 AI questions a day, but in testing they could keep going. We keyed the limit by IP address and read the IP from the last entry in &lt;code&gt;X-Forwarded-For&lt;/code&gt;. Behind our host's proxy, that entry was the proxy's own address, and it changed between requests, so every request looked like a new visitor. We switched to Cloudflare's &lt;code&gt;CF-Connecting-IP&lt;/code&gt; header, which holds the real visitor's IP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trails looked too easy.&lt;/strong&gt; Many trails we imported from OpenStreetMap are out-and-back, but we rated them on the one-way distance. Once we rated them on the full round trip, the number of Level 1 trails dropped from 28 to 16.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merge conflicts hit main.&lt;/strong&gt; Four people pushing to one branch at 2am led to conflict markers in committed code. We fixed it and added branch protection with pull-request reviews.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The chatbot printed raw asterisks.&lt;/strong&gt; The AI replied in Markdown, but the chat window showed &lt;code&gt;**&lt;/code&gt; and &lt;code&gt;-&lt;/code&gt; as plain text. We added light Markdown rendering.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;We want to grow HikingPSU from Happy Valley to the rest of Pennsylvania. The same OpenStreetMap import works for any region, and every check-in helps verify the trail data. If you're in State College, try it at &lt;a href="https://hikingpsu.com" rel="noopener noreferrer"&gt;hikingpsu.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>mlhacks</category>
      <category>devchallenge</category>
      <category>hackathon</category>
    </item>
  </channel>
</rss>
