<?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: Ryan B</title>
    <description>The latest articles on DEV Community by Ryan B (@ryanbudwal14).</description>
    <link>https://dev.to/ryanbudwal14</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F99mvlsfu5tfj9m7ku25d.png</url>
      <title>DEV Community: Ryan B</title>
      <link>https://dev.to/ryanbudwal14</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ryanbudwal14"/>
    <language>en</language>
    <item>
      <title>TrailScout AI: describe the feeling, then go outside</title>
      <dc:creator>Ryan B</dc:creator>
      <pubDate>Sat, 10 Oct 2026 21:59:41 +0000</pubDate>
      <link>https://dev.to/ryanbudwal14/trailscout-ai-describe-the-feeling-then-go-outside-ik</link>
      <guid>https://dev.to/ryanbudwal14/trailscout-ai-describe-the-feeling-then-go-outside-ik</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;The hardest part of going outside could just be deciding where to go.&lt;/p&gt;

&lt;p&gt;TrailScout AI turns a request like “I need somewhere peaceful to clear my head” or “find me an easy 45-minute walk under tall trees” into a short list of suitable Toronto area outdoor places. It is designed to make the screen the shortest part of the experience: describe the feeling, choose a place, and go outside.&lt;/p&gt;

&lt;p&gt;The first edition includes 24 authored outdoor suggestions, from ravine walks and shaded parks to wetlands and waterfront pauses. A user can add exact limits for time, difficulty and distance, inspect why a result might fit, see its approximate location, open it in OpenStreetMap, save it, and record a completed outing in a private field journal.&lt;/p&gt;

&lt;p&gt;TrailScout is deliberately a place finder, not a navigation or safety system. It does not invent routes, trail entrances, closures, weather or accessibility claims. Durations and distances are labeled estimates, and its explanations come from stored catalogue facts.&lt;/p&gt;

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

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

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ryanbudwal" rel="noopener noreferrer"&gt;
        ryanbudwal
      &lt;/a&gt; / &lt;a href="https://github.com/ryanbudwal/trailscout" rel="noopener noreferrer"&gt;
        trailscout
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;TrailScout AI&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Describe the feeling. Find your outside.&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;TrailScout turns a natural-language request into a short list of Toronto-area outdoor places using an open-weight embedding model and real vector retrieval in PostgreSQL.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Less screen time. More time outdoors.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://youtu.be/hJdTeWRmuCA" rel="nofollow noopener noreferrer"&gt;Watch the product demo&lt;/a&gt; · &lt;a href="https://dev.to/ryanbudwal14/trailscout-ai-describe-the-feeling-then-go-outside-ik" rel="nofollow"&gt;Read the DEV submission&lt;/a&gt; · &lt;a href="https://github.com/ryanbudwal/trailscout/docs/architecture.md" rel="noopener noreferrer"&gt;Explore the architecture&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/cfc0a20245459fc419c6b5ff232a7b4edaafcb285bd5d8900444fe2adc211945/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573745f323032362d546f7563685f47726173732d4432464634463f7374796c653d666c61742d737175617265266c6162656c436f6c6f723d313032353143" alt="Hacktoberfest 2026 Touch Grass"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/278fa339ace9ba27f2b7c969009db36b640b4710b72f81332685f009c9d74d3e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d31392d3631444146423f7374796c653d666c61742d737175617265266c6f676f3d7265616374266c6f676f436f6c6f723d313032353143"&gt;&lt;img src="https://camo.githubusercontent.com/278fa339ace9ba27f2b7c969009db36b640b4710b72f81332685f009c9d74d3e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d31392d3631444146423f7374796c653d666c61742d737175617265266c6f676f3d7265616374266c6f676f436f6c6f723d313032353143" alt="React 19"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0b9f3e3c2259b9ba9dd8b7cf8d57dd0496417a2e1ac340d967327716f1b61654/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d74797065642d3331373843363f7374796c653d666c61742d737175617265266c6f676f3d74797065736372697074266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/0b9f3e3c2259b9ba9dd8b7cf8d57dd0496417a2e1ac340d967327716f1b61654/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d74797065642d3331373843363f7374796c653d666c61742d737175617265266c6f676f3d74797065736372697074266c6f676f436f6c6f723d7768697465" alt="TypeScript"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d0fa09b5c49e85aa444b75490bfd615fdf307c14455338a28062d645983eed54/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466173744150492d507974686f6e5f332e31332d3030393638383f7374796c653d666c61742d737175617265266c6f676f3d66617374617069266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/d0fa09b5c49e85aa444b75490bfd615fdf307c14455338a28062d645983eed54/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466173744150492d507974686f6e5f332e31332d3030393638383f7374796c653d666c61742d737175617265266c6f676f3d66617374617069266c6f676f436f6c6f723d7768697465" alt="FastAPI with Python 3.13"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/744d755ace766a1e057a93b67619f3f2a077f772f919e4c8e5641367383bdd82/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d696e694c4d2d333834645f656d62656464696e67732d4646394434353f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/744d755ace766a1e057a93b67619f3f2a077f772f919e4c8e5641367383bdd82/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d696e694c4d2d333834645f656d62656464696e67732d4646394434353f7374796c653d666c61742d737175617265" alt="MiniLM 384-dimensional embeddings"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8de5671527f6bc9e7487bc3d8fc0abefee77e35b66d0c371b280c58341249bcb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f54696765725f436c6f75642d506f737467726553514c2d4646364636313f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/8de5671527f6bc9e7487bc3d8fc0abefee77e35b66d0c371b280c58341249bcb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f54696765725f436c6f75642d506f737467726553514c2d4646364636313f7374796c653d666c61742d737175617265" alt="Tiger Cloud PostgreSQL"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/7e36e3cd037646270022150500dca553015ce7f147dab9137fbcfea02071dd37/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7067766563746f722d302e382e372d3333363739313f7374796c653d666c61742d737175617265266c6f676f3d706f737467726573716c266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/7e36e3cd037646270022150500dca553015ce7f147dab9137fbcfea02071dd37/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7067766563746f722d302e382e372d3333363739313f7374796c653d666c61742d737175617265266c6f676f3d706f737467726573716c266c6f676f436f6c6f723d7768697465" alt="pgvector 0.8.7"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ryanbudwal/trailscout#product-overview" rel="noopener noreferrer"&gt;Overview&lt;/a&gt; · &lt;a href="https://github.com/ryanbudwal/trailscout#video-demonstration" rel="noopener noreferrer"&gt;Demo&lt;/a&gt; · &lt;a href="https://github.com/ryanbudwal/trailscout#features" rel="noopener noreferrer"&gt;Features&lt;/a&gt; · &lt;a href="https://github.com/ryanbudwal/trailscout#how-the-ai-works" rel="noopener noreferrer"&gt;AI retrieval&lt;/a&gt; · &lt;a href="https://github.com/ryanbudwal/trailscout#verified-tiger-cloud-integration" rel="noopener noreferrer"&gt;Tiger Cloud&lt;/a&gt; · &lt;a href="https://github.com/ryanbudwal/trailscout#technical-architecture" rel="noopener noreferrer"&gt;Architecture&lt;/a&gt; · &lt;a href="https://github.com/ryanbudwal/trailscout#quick-start" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt; · &lt;a href="https://github.com/ryanbudwal/trailscout#testing-and-reliability" rel="noopener noreferrer"&gt;Testing&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ryanbudwal/trailscout/docs/desktop.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fryanbudwal%2Ftrailscout%2FHEAD%2Fdocs%2Fdesktop.png" alt="TrailScout desktop interface showing natural-language outdoor discovery, recommendations, and an interactive map"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Product overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Sometimes the hardest part of going outside is deciding where to go.&lt;/p&gt;
&lt;p&gt;TrailScout lets someone describe the experience they want—&lt;strong&gt;“Somewhere by the water to watch the sunset”&lt;/strong&gt;—then retrieves authored Toronto-area suggestions that are close in meaning. Exact controls for duration, difficulty, and distance keep practical constraints separate from the semantic ranking.&lt;/p&gt;
&lt;p&gt;The result is a focused place finder: discover an outing, understand why it fits, open its approximate location, and leave the screen behind. TrailScout does not…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ryanbudwal/trailscout" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Open-weight AI that solves one focused problem
&lt;/h3&gt;

&lt;p&gt;TrailScout uses sentence-transformers/all-MiniLM-L6-v2, an Apache-2.0 open-weight sentence embedding model. At seed time, it converts each place's name, description and tags into a normalized 384-dimensional vector. At search time, it converts the user's request with the same pinned model revision.&lt;/p&gt;

&lt;p&gt;I chose semantic retrieval instead of a generative chatbot because the product needs to find authored records, not improvise outdoor advice. There is no paid inference API and no hidden fallback response. If the model or database is unavailable, the interface reports the failure instead of displaying fake recommendations.&lt;/p&gt;

&lt;h3&gt;
  
  
  PostgreSQL is the retrieval engine
&lt;/h3&gt;

&lt;p&gt;Each vector lives beside the place's duration, difficulty, coordinates, tags and ingestion timestamp in PostgreSQL. pgvector computes exact cosine distance inside the database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query_vector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;outdoor_places&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;difficulty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;difficulty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;duration_minutes&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_minutes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query_vector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The production query is parameterized and also supports radius and timestamp constraints. This division matters: the model handles meaning; SQL enforces promises such as “easy” and “no longer than 45 minutes.”&lt;/p&gt;

&lt;p&gt;Exact search is intentional. 24 vectors do not need an approximate index, and an exact scan preserves recall after filtering. HNSW or Tiger Data's advanced vector indexing would become relevant only after a larger catalogue and a measured recall/latency evaluation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Meaningful Tiger Data use
&lt;/h3&gt;

&lt;p&gt;TrailScout stores its MiniLM embeddings and structured place metadata in a dedicated Tiger Cloud PostgreSQL service. The same database query combines cosine ranking with duration, difficulty, geographic radius and ingestion-time filters. I verified the service over TLS, confirmed the vector extension, stored 24 vectors with exactly 384 dimensions, and captured the filtered ranking in the Tiger Cloud SQL editor.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fobiqbedotgrrrrvedt98.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fobiqbedotgrrrrvedt98.png" alt="Tiger Cloud SQL verification showing pgvector 0.8.7, 24 outdoor destinations, and 384-dimensional embeddings" width="800" height="891"&gt;&lt;/a&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd974udmxcrqov7luvnxb.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd974udmxcrqov7luvnxb.png" alt="Tiger Cloud SQL editor showing pgvector cosine similarity ranking and duration and difficulty filters" width="800" height="843"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keeping vectors and metadata together gives TrailScout one transactional source of truth. I can filter before ranking, inspect the SQL, join retrieval results to journal data, and change the model without replacing the storage architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  I tested the semantic-search claim
&lt;/h3&gt;

&lt;p&gt;I compared MiniLM + pgvector with a simple keyword-overlap baseline on four natural requests and transparent, tag-based relevance rules.&lt;/p&gt;

&lt;p&gt;The full method and rankings are available in the &lt;a href="https://github.com/ryanbudwal/trailscout/blob/main/docs/retrieval-evaluation.md" rel="noopener noreferrer"&gt;retrieval evaluation documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Across the four queries, both approaches averaged 2.25 relevant results in the top three. Semantic retrieval found more relevant choices by rank five—4.25 versus 3.50—but keyword search produced the first relevant result sooner under this small evaluation.&lt;/p&gt;

&lt;p&gt;That is a more useful result than claiming embeddings always win. Semantic search broadens discovery when people describe an experience, while explicit filters and careful catalogue writing remain essential.&lt;/p&gt;

&lt;h3&gt;
  
  
  Product and reliability work
&lt;/h3&gt;

&lt;p&gt;The frontend is React 19, TypeScript and Vite, with Leaflet/OpenStreetMap for approximate park locations. FastAPI serves the production build and API from one origin, so database credentials never enter the browser. The field journal uses an anonymous HttpOnly session cookie; only its SHA-256 hash is stored as the ownership key.&lt;/p&gt;

&lt;p&gt;The current verification suite runs against the real model and PostgreSQL/pgvector:&lt;/p&gt;

&lt;p&gt;23 backend integration tests covering vectors, cosine math, filters, validation, persistence, isolation and failure handling.&lt;br&gt;
6 Playwright flows across desktop and mobile covering search, map access, saved places, journal persistence, empty results and service recovery.&lt;br&gt;
TypeScript, Vite production build and formatting checks.&lt;br&gt;
GitHub Actions on the public repository.&lt;br&gt;
OpenAI Codex assisted with architecture, implementation, testing, documentation and the original SVG landscape artwork. I reviewed the implementation and kept that assistance out of the runtime: TrailScout's search uses MiniLM and PostgreSQL, not an OpenAI API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Open innovation made TrailScout inspectable from sentence to result.&lt;/p&gt;

&lt;p&gt;The model revision is pinned. I can reproduce its 384-dimensional output, run it on CPU infrastructure I control, compare its database score with direct cosine math, and replace it later without rewriting the product around a proprietary response format. There is no per-search AI bill and no API key required for inference.&lt;/p&gt;

&lt;p&gt;That control also makes the product more honest. I know which text was embedded, which filters ran, which distance operator PostgreSQL used, and which catalogue facts produced an explanation. A closed text-generation API would add operational cost and make it easier to present fluent but unsupported trail claims. For this task, open embeddings plus retrieval are the smaller and safer tool.&lt;/p&gt;

&lt;p&gt;TrailScout is not an offline mobile app—the server still performs inference, and map tiles require a network connection. “Open” here means the model weights, retrieval code and evaluation are available to inspect and run on infrastructure under the builder's control.&lt;/p&gt;

&lt;p&gt;Most of all, the open pieces support the theme. The AI is meant to end the interaction quickly. Its success is not another conversation on a screen; it is a person finding a realistic nearby option and putting the phone away.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Best Use of Tiger Data
&lt;/h3&gt;

&lt;p&gt;TrailScout AI uses Tiger Cloud PostgreSQL with pgvector to store 384-dimensional embeddings for 24 Toronto-area outdoor destinations. Its recommendation engine combines vector similarity ranking with structured filters, helping people discover outdoor experiences that match their interests, available time, and preferred difficulty.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
