<?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: Radhika Godambe</title>
    <description>The latest articles on DEV Community by Radhika Godambe (@radhikaaa25).</description>
    <link>https://dev.to/radhikaaa25</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%2F2185750%2F303dd346-a17c-4480-8443-7947b40af2be.png</url>
      <title>DEV Community: Radhika Godambe</title>
      <link>https://dev.to/radhikaaa25</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/radhikaaa25"/>
    <language>en</language>
    <item>
      <title>Touch Grass: Natural Language Outdoor Discovery</title>
      <dc:creator>Radhika Godambe</dc:creator>
      <pubDate>Sun, 11 Oct 2026 19:57:21 +0000</pubDate>
      <link>https://dev.to/radhikaaa25/touch-grass-natural-language-outdoor-discovery-101h</link>
      <guid>https://dev.to/radhikaaa25/touch-grass-natural-language-outdoor-discovery-101h</guid>
      <description>&lt;p&gt;&lt;em&gt;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;Finding somewhere to go outdoors shouldn't require browsing through multiple websites, filtering endless map results, or scrolling through hiking forums.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Touch Grass&lt;/strong&gt; is an open-source, AI-powered outdoor discovery application that lets users search for trails, parks, and running clubs using natural language.&lt;/p&gt;

&lt;p&gt;Instead of navigating multiple filters, users can simply ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Show me easy shaded trails under 3 miles."&lt;/li&gt;
&lt;li&gt;"Which parks in Austin have restrooms and allow dogs?"&lt;/li&gt;
&lt;li&gt;"Find me a weekend run club that runs less than 5 miles."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The application uses an LLM-powered Text-to-SQL agent to translate these questions into SQLite queries, retrieve matching records, and display the results in a responsive dashboard.&lt;/p&gt;

&lt;p&gt;The idea is simple: spend less time searching for outdoor activities and more time actually doing them.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  Application Features
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Natural Language Search&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Users can enter questions directly into the search bar or choose from predefined example queries to get started.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. SQL Query Inspector&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The application displays the SQL generated by the model, allowing users to see how their natural language request was translated into a database query.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Dynamic Results Table&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Results are displayed in a responsive table with formatting based on the returned data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Color-coded difficulty badges (Easy, Moderate, Hard).&lt;/li&gt;
&lt;li&gt;Readable boolean indicators (✅ Yes / ❌ No).&lt;/li&gt;
&lt;li&gt;Trail distances in miles.&lt;/li&gt;
&lt;li&gt;Location and activity information.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Loading and Error States&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The interface handles loading, empty results, and invalid queries with appropriate feedback.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example Interaction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;User input:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"Show me easy trails under 3 miles with shade."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generated SQL:&lt;/strong&gt;&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="n"&gt;length_miles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;has_shade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;location&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;trails&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;LOWER&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="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'easy'&lt;/span&gt;
    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;length_miles&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;has_shade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;50&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;Example Results:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Trail&lt;/th&gt;
&lt;th&gt;Distance&lt;/th&gt;
&lt;th&gt;Shade&lt;/th&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sunset Ridge Loop&lt;/td&gt;
&lt;td&gt;1.8 mi&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Austin, TX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lady Bird Lake&lt;/td&gt;
&lt;td&gt;1.3 mi&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Austin, TX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Piedmont Park Loop&lt;/td&gt;
&lt;td&gt;2.4 mi&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Atlanta, GA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The generated SQL is also visible in the interface, making the application's behavior easier to understand and debug.&lt;/p&gt;




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

&lt;p&gt;The project is open-source and organized as a full-stack monorepo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; (&lt;a href="https://github.com/radhikaaa25/touch-grass" rel="noopener noreferrer"&gt;https://github.com/radhikaaa25/touch-grass&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technologies&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Python 3.11+, FastAPI, Uvicorn&lt;/td&gt;
&lt;td&gt;REST API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Agent&lt;/td&gt;
&lt;td&gt;LiteLLM, Gemini / Open-weight Llama&lt;/td&gt;
&lt;td&gt;Natural Language to SQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;SQLite3&lt;/td&gt;
&lt;td&gt;Outdoor activity storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;React 19, Vite, Tailwind CSS v4&lt;/td&gt;
&lt;td&gt;User interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tooling&lt;/td&gt;
&lt;td&gt;Pydantic v2, TypeScript&lt;/td&gt;
&lt;td&gt;Data validation and type safety&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;

&lt;p&gt;The application follows a straightforward request-response pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             User
               |
               v
      React Frontend
               |
               v
        FastAPI Backend
               |
               v
       Text-to-SQL Agent
               |
               v
      LiteLLM Model Router
               |
               v
       Generated SQL Query
               |
               v
        Query Validation
               |
               v
         SQLite Database
               |
               v
         JSON Response
               |
               v
       Dynamic Results UI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;h3&gt;
  
  
  1. Schema-Grounded Text-to-SQL
&lt;/h3&gt;

&lt;p&gt;One of the main challenges was making sure the language model generated queries using actual database tables and columns rather than inventing its own structure.&lt;/p&gt;

&lt;p&gt;To address this, the backend retrieves the SQLite schema and includes it in the agent's system prompt.&lt;/p&gt;

&lt;p&gt;The model receives both the database structure and a set of query-generation rules.&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;SYSTEM_PROMPT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
You are a SQL query generator for an outdoor activities SQLite database.

DATABASE SCHEMA:
&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;get_schema_string&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

RULES:
1. Output ONLY a single valid SQLite SELECT query.
2. Do not include markdown, code fences, or explanations.
3. Never generate INSERT, UPDATE, DELETE, DROP, ALTER, or CREATE statements.
4. Use only the tables and columns provided in the schema.
5. Boolean columns (has_shade, has_restrooms, allows_dogs)
   use 1 for true and 0 for false.
6. Use LOWER() for case-insensitive string comparisons.
7. Always include &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="s"&gt; and &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;location&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; in the results.
8. Limit results to a maximum of 50 rows.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps constrain the model's output and makes the generated queries more consistent with the available data.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Model-Agnostic Integration with LiteLLM
&lt;/h3&gt;

&lt;p&gt;I used &lt;code&gt;litellm&lt;/code&gt; to keep the application independent of a single LLM provider.&lt;/p&gt;

&lt;p&gt;The backend can be configured to use Google Gemini, local open-weight models through Ollama, or supported cloud-hosted models through providers such as Groq.&lt;/p&gt;

&lt;p&gt;The model can be changed through an environment variable without rewriting the agent logic.&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;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;litellm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&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;system&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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SYSTEM_PROMPT&lt;/span&gt;
        &lt;span class="p"&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;role&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;user&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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;question&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&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;This also makes it possible to experiment with different models and compare their Text-to-SQL performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. SQL Validation and Error Handling
&lt;/h3&gt;

&lt;p&gt;Since the SQL is generated by a language model, it needs to be checked before execution.&lt;/p&gt;

&lt;p&gt;The backend includes a validation layer that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Removes surrounding Markdown code fences when present.&lt;/li&gt;
&lt;li&gt;Checks that the generated query begins with &lt;code&gt;SELECT&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Rejects queries that do not satisfy the expected format.&lt;/li&gt;
&lt;li&gt;Handles SQLite execution errors using &lt;code&gt;try/except sqlite3.Error&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Returns readable error messages to the frontend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These checks provide an initial safeguard against unintended queries. For a production deployment, I would strengthen this further with SQLite read-only connections, single-statement enforcement, and stricter SQL validation rather than relying on prompt instructions or prefix checks alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Building the Frontend
&lt;/h3&gt;

&lt;p&gt;I wanted the interface to feel like an outdoor discovery tool rather than a conventional database search application.&lt;/p&gt;

&lt;p&gt;The frontend uses React, Vite, and Tailwind CSS with an earth-toned visual theme.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design choices:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Forest greens (&lt;code&gt;#1d3818&lt;/code&gt; to &lt;code&gt;#8dba7e&lt;/code&gt;), bark browns, and soft sky accents.&lt;/li&gt;
&lt;li&gt;A prominent natural-language search bar.&lt;/li&gt;
&lt;li&gt;Example query chips for first-time users.&lt;/li&gt;
&lt;li&gt;A terminal-inspired SQL inspector.&lt;/li&gt;
&lt;li&gt;Dynamically generated result columns based on the API response.&lt;/li&gt;
&lt;li&gt;Custom formatting for distances, difficulty levels, and boolean fields.&lt;/li&gt;
&lt;li&gt;Responsive layouts for different screen sizes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The frontend does not need to know which database table the user is querying beforehand. It builds the results table from the returned column names and values.&lt;/p&gt;

&lt;p&gt;This allows the same interface to display trails, parks, and running clubs without separate result components for every category.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Open Innovation Matters
&lt;/h2&gt;

&lt;p&gt;I wanted Touch Grass to be easy to run, modify, and extend without depending entirely on proprietary services.&lt;/p&gt;

&lt;p&gt;Three aspects of open innovation influenced the project.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Local Model Support and Privacy
&lt;/h3&gt;

&lt;p&gt;Outdoor discovery applications can involve location information and personal activity preferences.&lt;/p&gt;

&lt;p&gt;By supporting local models through Ollama, Touch Grass provides an option to process natural-language queries locally instead of sending them to a cloud-hosted LLM.&lt;/p&gt;

&lt;p&gt;This gives developers more control over where their data is processed.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Flexibility Across AI Providers
&lt;/h3&gt;

&lt;p&gt;Using LiteLLM allows developers to experiment with different supported models without changing the application's core architecture.&lt;/p&gt;

&lt;p&gt;Someone running the project locally can choose an open-weight model, while another developer can configure a hosted provider.&lt;/p&gt;

&lt;p&gt;The application is not tied to one model or vendor.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Community-Driven Outdoor Data
&lt;/h3&gt;

&lt;p&gt;SQLite provides a lightweight starting point for maintaining a curated collection of trails, parks, and running clubs.&lt;/p&gt;

&lt;p&gt;The project can be extended with additional locations, activity categories, and community-contributed datasets.&lt;/p&gt;

&lt;p&gt;The goal is to make outdoor discovery accessible and adaptable to different cities and communities.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I used &lt;strong&gt;Google DeepMind Antigravity&lt;/strong&gt; during development to assist with scaffolding, implementation, and debugging.&lt;/p&gt;

&lt;p&gt;The development process involved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting up the FastAPI and React monorepo.&lt;/li&gt;
&lt;li&gt;Implementing the Text-to-SQL agent and database integration.&lt;/li&gt;
&lt;li&gt;Building the search interface and dynamic results table.&lt;/li&gt;
&lt;li&gt;Resolving Python dependency and virtual environment configuration issues.&lt;/li&gt;
&lt;li&gt;Testing backend functionality and verifying the frontend build.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Antigravity was useful for iterating across the backend and frontend while keeping the application architecture consistent.&lt;/p&gt;




&lt;h2&gt;
  
  
  Challenges and Learnings
&lt;/h2&gt;

&lt;p&gt;The most interesting part of building Touch Grass was connecting natural-language input to structured database operations.&lt;/p&gt;

&lt;p&gt;A few key takeaways:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Schema context matters.&lt;/strong&gt; Providing the model with the actual database structure makes Text-to-SQL generation more reliable than relying on generic instructions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LLM output still needs validation.&lt;/strong&gt; Even with explicit prompting, generated SQL should be treated as untrusted input.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model flexibility is useful.&lt;/strong&gt; Separating the model provider from the application logic makes experimenting with local and hosted models significantly easier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A simple interface can hide a fairly interesting backend.&lt;/strong&gt; From the user's perspective, the entire workflow is just asking a question and viewing matching outdoor activities.&lt;/p&gt;




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

&lt;p&gt;Some improvements I'd like to explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integrating OpenStreetMap data for broader location coverage.&lt;/li&gt;
&lt;li&gt;Adding geolocation-based searches for nearby trails and parks.&lt;/li&gt;
&lt;li&gt;Supporting community submissions for new outdoor locations.&lt;/li&gt;
&lt;li&gt;Improving SQL validation and database access restrictions.&lt;/li&gt;
&lt;li&gt;Testing Text-to-SQL accuracy across different open-weight models.&lt;/li&gt;
&lt;li&gt;Adding map-based visualization alongside the existing results table.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;&lt;strong&gt;Primary Challenge:&lt;/strong&gt; Hacktoberfest Week 1 – Touch Grass&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Featured Categories:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best Use of Open-Source AI / Open Weights&lt;/li&gt;
&lt;li&gt;Full-Stack Developer Experience&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Built with Python, React, SQLite, and LiteLLM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Less scrolling. More strolling. 🌿&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Source code: &lt;a href="https://github.com/radhikaaa25/touch-grass" rel="noopener noreferrer"&gt;GitHub – Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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