<?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: Tirta</title>
    <description>The latest articles on DEV Community by Tirta (@dkfadhila).</description>
    <link>https://dev.to/dkfadhila</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%2F4177074%2F4d5ce5d9-6589-46fe-b055-4bc4ffa46aed.png</url>
      <title>DEV Community: Tirta</title>
      <link>https://dev.to/dkfadhila</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dkfadhila"/>
    <language>en</language>
    <item>
      <title>The Client Said “A Simple Website.” What Did They Actually Mean?</title>
      <dc:creator>Tirta</dc:creator>
      <pubDate>Sat, 17 Oct 2026 10:24:53 +0000</pubDate>
      <link>https://dev.to/dkfadhila/the-client-said-a-simple-website-what-did-they-actually-mean-1je2</link>
      <guid>https://dev.to/dkfadhila/the-client-said-a-simple-website-what-did-they-actually-mean-1je2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;“A simple website. Four pages. Maybe bookings too.”&lt;/p&gt;

&lt;p&gt;Those last three words can change a quote completely.&lt;/p&gt;

&lt;p&gt;A link to an existing booking service is one task. A reservation system with payments, cancellation rules, and availability is another project. If the proposal treats them as the same thing, the freelancer inherits the ambiguity.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;ScopeNote&lt;/strong&gt; to help turn that conversation into something both sides can review: deliverables, estimated hours, unanswered questions, and work that is explicitly outside the scope.&lt;/p&gt;

&lt;p&gt;It is for independent designers, developers, and small studios preparing client proposals. You can start with a written brief or upload a recording of a client briefing, with their permission.&lt;/p&gt;

&lt;p&gt;Here is the document 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%2F2kk8bpp194f5gk9y3dad.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%2F2kk8bpp194f5gk9y3dad.png" alt="ScopeNote's actual scope editor showing editable deliverables and an estimate for a fictional studio website" width="800" height="1053"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The hours, descriptions, rate, and contingency are editable. The output is a &lt;strong&gt;working draft&lt;/strong&gt;, not a client agreement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who would pay for it?
&lt;/h3&gt;

&lt;p&gt;A freelancer handling confidential client work has a reason to pay for private saved projects. ScopeNote Premium is &lt;strong&gt;US$1 once for 30 days&lt;/strong&gt;, with no subscription or automatic renewal. It includes private drafts by default, optional public sharing, and &lt;strong&gt;10 voice imports per access period, up to 12 MB each&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Free includes one voice import per month, but &lt;strong&gt;newly saved Free client names, briefs, scopes, and estimates are public&lt;/strong&gt;. Both plans include PDF and Markdown export, five saved projects, and three AI scopes per quota period. Free quotas use a calendar month; Premium quotas follow the 30-day access period.&lt;/p&gt;

&lt;p&gt;That is the business hypothesis, not proof of demand. I have exercised the paid flow using my own account; I am not counting that as an independent paying customer.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://scopenote.dktirta.tech/" rel="noopener noreferrer"&gt;Open ScopeNote&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://scopenote.dktirta.tech/#gallery" rel="noopener noreferrer"&gt;Browse public drafts without signing in&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Watch the narrated walkthrough:&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;The screenshots and walkthrough use the real frontend with a fictional Tanah Studio brief and a hand-authored example scope. This is an interface walkthrough, not a timed Gemma run, customer session, or claim about model accuracy. The PDF shown was exported through the app.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Start with what the client actually said
&lt;/h3&gt;

&lt;p&gt;Paste the message, meeting notes, or transcript into the brief editor. The example asks for four pages, mobile support, and an uncertain booking feature.&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%2Fta9vqvycqe2qepvyi8ge.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%2Fta9vqvycqe2qepvyi8ge.png" alt="The client brief editor with a fictional ceramics studio message and an existing audio recording upload control" width="800" height="851"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the conversation is in a recording, upload it through the voice import control. &lt;strong&gt;ElevenLabs Scribe&lt;/strong&gt; transcribes it into text. You can review that text before creating a scope.&lt;/p&gt;

&lt;p&gt;The app imports recordings; it does not record meetings directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Review the proposed work
&lt;/h3&gt;

&lt;p&gt;The working scope keeps the overview and deliverables beside the estimate. Change a title, rewrite a detail, or adjust the hours. You decide the hourly rate and contingency.&lt;/p&gt;

&lt;p&gt;In this illustrative document, 42 hours at US$65/hour plus 15% contingency is &lt;strong&gt;US$3,139.50&lt;/strong&gt;, displayed as &lt;strong&gt;US$3,140&lt;/strong&gt;. That number comes from arithmetic, not a model's guess at the final price. The hours are still estimates.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Resolve what is missing
&lt;/h3&gt;

&lt;p&gt;The most useful part of a scope can be a question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which booking service will the studio use, and is an external link enough for launch?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question belongs beside an exclusion such as “Custom booking or payment system.” Together, they make the unfinished decision visible.&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%2Fe11gmsc7l7kb88c6ro3b.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%2Fe11gmsc7l7kb88c6ro3b.png" alt="Questions about booking, content and approval, alongside exclusions for a custom booking system and other unquoted work" width="800" height="1031"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The screenshot is an editorial example. In the AI path, the prompt asks Gemma to put missing requirements into questions rather than inventing commitments. Whether it asks the right questions still needs human review.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Export the document you reviewed
&lt;/h3&gt;

&lt;p&gt;The proposal page combines the scope, estimate, open questions, and exclusions. Both plans can download PDF or Markdown.&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%2F24tn626t0wn0031smv6p.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%2F24tn626t0wn0031smv6p.png" alt="Proposal preview with PDF and Markdown export controls" width="800" height="1229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The A4 PDF includes the project, client, scope, estimate, and “Made with ScopeNote” credit:&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%2F9cp8xqct3fl1m52xeeaq.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%2F9cp8xqct3fl1m52xeeaq.png" alt="First page of the actual A4 PDF exported from the fictional studio example" width="800" height="1131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To test it yourself, create an account and verify your email. Registration automatically sends the verification email; the in-app verification action can request another. Use fictional or non-confidential material on Free because saving publishes it.&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/dkfadhila" rel="noopener noreferrer"&gt;
        dkfadhila
      &lt;/a&gt; / &lt;a href="https://github.com/dkfadhila/scopenote" rel="noopener noreferrer"&gt;
        scopenote
      &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 class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ScopeNote&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A scope-of-work app for independent designers and developers. Bring a client brief or voice note, generate a draft with Gemma through Mastra, edit the document and hours, save the project, and export a PDF or Markdown proposal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; account migration: email/password accounts, public Free drafts/scopes, server-side usage limits, password reset and email verification. There is no demo or simulated entry point. Premium is prepaid: US$1 once for 30 days through AllScale, with no subscription or automatic renewal. Checkout requires server configuration. Resend sender domain is verified; verification and reset email delivery plus old-session revocation passed against the production API. See CONFIGURATION.md.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run locally&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Node.js 22.13+ is required. From this directory:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install
npm run dev&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;This starts Vite on &lt;a href="http://127.0.0.1:5178" rel="nofollow noopener noreferrer"&gt;http://127.0.0.1:5178&lt;/a&gt; and the Express backend on port 3001. Vite forwards &lt;code&gt;/api&lt;/code&gt; to the backend. Copy &lt;code&gt;.env.example&lt;/code&gt; to &lt;code&gt;.env&lt;/code&gt; when ready to configure credentials. Real accounts require MongoDB. Public drafts and…&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/dkfadhila/scopenote" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://github.com/dkfadhila/scopenote" rel="noopener noreferrer"&gt;Repository and setup&lt;/a&gt; · &lt;a href="https://github.com/dkfadhila/scopenote/blob/main/LICENSE" rel="noopener noreferrer"&gt;MIT license&lt;/a&gt; · &lt;a href="https://github.com/dkfadhila/scopenote/blob/main/docs/ARTICLE-MEDIA.md" rel="noopener noreferrer"&gt;Media provenance&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository contains the frontend, Express API, AI workflow, account and billing logic, tests, and Render configuration. Credentials are supplied on the server.&lt;/p&gt;

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

&lt;p&gt;The frontend is &lt;strong&gt;React + Vite&lt;/strong&gt;. &lt;strong&gt;Express on Node.js&lt;/strong&gt; serves the built application and its API. The AI portion is a &lt;strong&gt;Gemma agent inside a two-step Mastra workflow&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsgk6zyon41m0m8q96pto.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%2Fsgk6zyon41m0m8q96pto.png" alt="ScopeNote architecture: text or ElevenLabs transcription enters Express, Mastra invokes Gemma, Zod validates, and the human reviews before saving or exporting" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The two workflow steps are small enough to explain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;extract-scope&lt;/code&gt;&lt;/strong&gt; sends the brief to Gemma and requests a JSON document.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;validate-scope&lt;/code&gt;&lt;/strong&gt; parses the result and validates its structure with Zod.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The configured model is &lt;strong&gt;&lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt;&lt;/strong&gt;, accessed through the Google Generative AI adapter. Inference runs at the model provider; the Render instance does not load Gemma's weights.&lt;/p&gt;

&lt;p&gt;The contract requires an overview, deliverables with bounded estimated hours, clarification questions, and exclusions. The brief is treated as untrusted data. The prompt asks for missing information to become a question and avoids promising delivery dates or client approval.&lt;/p&gt;

&lt;p&gt;A response that fails parsing or validation produces an error. There is no fallback that quietly substitutes an example scope.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the model does not calculate
&lt;/h3&gt;

&lt;p&gt;The model proposes hours. Application code calculates the estimate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;estimate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;buffer&lt;/span&gt;&lt;span class="p"&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;hours&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hours&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;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;total&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&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="nx"&gt;hours&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;rate&lt;/span&gt; &lt;span class="o"&gt;*&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="nx"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&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;The scope schema can reject a negative number or a malformed deliverable. It cannot establish whether 18 hours is realistic for a particular freelancer. That distinction is why the editor is central to the product.&lt;/p&gt;

&lt;p&gt;Michael Maurice's &lt;a href="https://dev.to/michael_maurice/schema-valid-correct-4-checks-before-you-trust-llm-extraction-4n6f"&gt;“Schema-Valid Isn't Correct: 4 Checks Before You Trust LLM Extraction”&lt;/a&gt; discusses the same gap between structured output and trustworthy data. ScopeNote's answer is validation plus an explicit human review step, not a claim that JSON makes an estimate correct.&lt;/p&gt;

&lt;h3&gt;
  
  
  Account boundaries are part of the product
&lt;/h3&gt;

&lt;p&gt;Atlas stores account-owned projects, sessions, usage counters, and up to ten previous revision snapshots. The backend derives ownership and plan access from the session. It does not trust a plan or owner sent by the browser.&lt;/p&gt;

&lt;p&gt;A saved revision number prevents two tabs from silently overwriting each other's changes.&lt;/p&gt;

&lt;p&gt;Public and private access are separate backend paths:&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%2Faoyev9h6t7al5i38r5l2.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%2Faoyev9h6t7al5i38r5l2.png" alt="Free newly saved drafts are public; Premium defaults private with optional public sharing; email, owner identifiers and revision history are omitted from public responses" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Premium visibility changes take effect on save. Existing private projects remain private after Premium expires. Public pages show a masked author label, such as &lt;code&gt;A***r&lt;/code&gt;, rather than the account email.&lt;/p&gt;

&lt;h3&gt;
  
  
  Payment is verified before access changes
&lt;/h3&gt;

&lt;p&gt;AllScale handles the one-time Premium checkout using supported &lt;strong&gt;USDT/USDC crypto networks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The backend checks the provider's authoritative payment status and matches the amount, order, and user before updating Premium access. Returning from checkout alone does not unlock anything.&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%2Ftv7zr10i2l45nvcfvg4d.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%2Ftv7zr10i2l45nvcfvg4d.png" alt="AllScale payment is verified server-side before granting access; a MongoDB receipt outbox delivers a receipt through Resend" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Granting access and recording that the order has already been applied happen in one atomic user update. If a later ledger write fails, a retry can repair the ledger without adding another 30 days.&lt;/p&gt;

&lt;p&gt;Resend sends the payment receipt. A MongoDB outbox preserves the message and its order-specific idempotency key so retries do not casually create duplicate emails. Ambiguous retries stop before the provider's idempotency window expires and need review.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I checked
&lt;/h3&gt;

&lt;p&gt;The latest application test run passed &lt;strong&gt;62 tests&lt;/strong&gt;. They cover account isolation, reset-token expiry and session revocation, quotas, payment reconciliation, receipt retries, public/private access, masked authors, scope validation, estimate arithmetic, and PDF pagination.&lt;/p&gt;

&lt;p&gt;The PDF is generated in the browser with pdf-lib, fontkit, and embedded Lato fonts. Exported content is not sent to a separate PDF service.&lt;/p&gt;

&lt;p&gt;These checks test application behavior. They do not measure scope quality, time saved by freelancers, or production uptime.&lt;/p&gt;

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

&lt;p&gt;ScopeNote's core transformation uses &lt;strong&gt;Gemma, an open-weight model&lt;/strong&gt;, and &lt;strong&gt;Mastra, an open-source agent framework&lt;/strong&gt;. The application is MIT licensed.&lt;/p&gt;

&lt;p&gt;For this project, openness gives me three practical things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I can inspect the planning workflow.&lt;/strong&gt; The prompt, output contract, validation, and pricing arithmetic are visible in the repository. Someone can see where the model's suggestion ends and ordinary application logic begins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I can adapt the planner to a niche.&lt;/strong&gt; A freelancer building booking sites may need different questions from someone preparing an illustration commission. The workflow and schema can change with that domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model's weights provide a future serving option.&lt;/strong&gt; I can investigate self-hosted Gemma under its license rather than depending permanently on one hosted endpoint. That option would not exist for a model available only through a closed API.&lt;/p&gt;

&lt;p&gt;I have not fine-tuned Gemma or built local inference into ScopeNote. I also have not demonstrated that this arrangement is cheaper than a closed-model alternative.&lt;/p&gt;

&lt;p&gt;The hosted app sends text to Google, audio to ElevenLabs, and saved projects to Atlas. Open source makes the implementation inspectable; it does not make those requests local. The distinction matters when the documents contain client information.&lt;/p&gt;

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

&lt;p&gt;I am entering six categories. Here is the job each integration performs, the implementation that supports it, and what I can claim from it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Render
&lt;/h3&gt;

&lt;p&gt;Render runs the &lt;strong&gt;frontend and Express API in one web service&lt;/strong&gt;. Its Blueprint builds the Vite app, starts Node, and uses &lt;code&gt;/api/health&lt;/code&gt; as the health check.&lt;/p&gt;

&lt;p&gt;This deployment exposed a practical problem: on Free compute, the first visitor after an idle period could see Render's waking-up page. A scheduled GitHub health ping was too irregular to make that reliable. I moved the service to &lt;strong&gt;one paid Starter compute instance (0.5 CPU, 512 MB RAM)&lt;/strong&gt; while keeping the workspace on Hobby, then removed the keep-alive schedule.&lt;/p&gt;

&lt;p&gt;This fixes idle spindown, not every possible outage. Gemma inference still happens at the provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inspect:&lt;/strong&gt; &lt;a href="https://github.com/dkfadhila/scopenote/blob/main/render.yaml" rel="noopener noreferrer"&gt;Render Blueprint&lt;/a&gt; · &lt;a href="https://scopenote.dktirta.tech/" rel="noopener noreferrer"&gt;Live application&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;Gemma performs the task the app is built around: translating an unstructured brief into a structured scope.&lt;/p&gt;

&lt;p&gt;The prompt and schema ask for deliverables, estimated hours, questions, and exclusions. The goal is to expose uncertainty early. An incomplete booking requirement should lead to a clarification question rather than a confident promise to build a payment system.&lt;/p&gt;

&lt;p&gt;I use hosted Gemma inference with the model ID set explicitly. There is no silent substitution of Gemini or another model family.&lt;/p&gt;

&lt;p&gt;The screenshots above illustrate how the editor handles a scope; they are not evaluation results. I have not established an accuracy rate or a baseline comparison.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inspect:&lt;/strong&gt; &lt;a href="https://github.com/dkfadhila/scopenote/blob/main/server/agent.js" rel="noopener noreferrer"&gt;Agent prompt and model invocation&lt;/a&gt; · &lt;a href="https://github.com/dkfadhila/scopenote/blob/main/src/domain.js" rel="noopener noreferrer"&gt;Scope contract and estimate code&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Mastra
&lt;/h3&gt;

&lt;p&gt;Mastra owns the &lt;strong&gt;brief-to-scope workflow&lt;/strong&gt;, rather than being an unused dependency.&lt;/p&gt;

&lt;p&gt;The extraction step invokes the agent. The validation step checks its result. A failed run becomes an explicit API error, and the application returns the run ID, model, and measured duration on success.&lt;/p&gt;

&lt;p&gt;This is a bounded workflow with one model request. It does not need an autonomous research loop to turn a client's paragraph into a draft document.&lt;/p&gt;

&lt;p&gt;The automated workflow test uses a stubbed model response to check the wiring and validation path. That is a workflow test, not proof that a remote model understood a real brief.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inspect:&lt;/strong&gt; &lt;a href="https://github.com/dkfadhila/scopenote/blob/main/server/agent.js" rel="noopener noreferrer"&gt;Two-step workflow&lt;/a&gt; · &lt;a href="https://github.com/dkfadhila/scopenote/blob/main/server/backend.test.js" rel="noopener noreferrer"&gt;Backend tests&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of MongoDB Atlas
&lt;/h3&gt;

&lt;p&gt;Atlas is the application's persistent data layer for &lt;strong&gt;accounts, project documents, revision snapshots, quotas, and billing state&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The important behavior is account isolation. Listing, saving, deleting, and reading history use the authenticated account's identity. Public endpoints return a deliberate subset of fields, and a private project cannot be read through its former public link after the visibility change is saved.&lt;/p&gt;

&lt;p&gt;Atlas also supports the payment grant's atomic update and the receipt outbox. That makes it part of both the document workflow and the paid product.&lt;/p&gt;

&lt;p&gt;This is ordinary document storage and access control; I am not claiming Vector Search or RAG.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inspect:&lt;/strong&gt; &lt;a href="https://github.com/dkfadhila/scopenote/blob/main/server/storage.js" rel="noopener noreferrer"&gt;Project storage and visibility rules&lt;/a&gt; · &lt;a href="https://github.com/dkfadhila/scopenote/blob/main/server/accounts.test.js" rel="noopener noreferrer"&gt;Account isolation tests&lt;/a&gt; · &lt;a href="https://github.com/dkfadhila/scopenote/blob/main/server/billing.js" rel="noopener noreferrer"&gt;Billing reconciliation&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Sentry Agent Tracing
&lt;/h3&gt;

&lt;p&gt;A failed scope request can fail during orchestration, the model request, or output validation. Sentry spans separate those operations.&lt;/p&gt;

&lt;p&gt;The implementation traces:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;What it follows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gen_ai.invoke_agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The complete brief-to-scope run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gen_ai.chat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The Gemma request, with model identity and token counts when returned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;workflow.step&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Parsing and validating the generated scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gen_ai.execute_tool&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ElevenLabs transcription&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The agent span wraps the Mastra run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;traced&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gen_ai.invoke_agent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ScopeNote / brief-to-scope&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&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;span&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="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gen_ai.operation.name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;invoke_agent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gen_ai.agent.name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;scope-planner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gen_ai.request.model&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// The Mastra workflow is started within this span.&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Excerpt from the instrumentation; the linked source contains the complete run.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Telemetry deliberately omits raw prompts and responses, disables default PII collection, and sanitizes error events. The code does not invent an inference cost when the provider supplies only token usage.&lt;/p&gt;

&lt;p&gt;I am showing the instrumentation, not a fabricated Sentry dashboard. I have not published a trace-based performance comparison or a measured cost improvement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inspect:&lt;/strong&gt; &lt;a href="https://github.com/dkfadhila/scopenote/blob/main/server/telemetry.js" rel="noopener noreferrer"&gt;Telemetry configuration&lt;/a&gt; · &lt;a href="https://github.com/dkfadhila/scopenote/blob/main/server/agent.js" rel="noopener noreferrer"&gt;Agent spans&lt;/a&gt; · &lt;a href="https://github.com/dkfadhila/scopenote/blob/main/server/app.js" rel="noopener noreferrer"&gt;Transcription span&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of ElevenLabs
&lt;/h3&gt;

&lt;p&gt;ElevenLabs is used &lt;strong&gt;inside the product&lt;/strong&gt;, not only to narrate its promotional video.&lt;/p&gt;

&lt;p&gt;Scribe turns an uploaded client recording into editable brief text. The user reviews the transcript, then sends that text through the same Gemma/Mastra path as a written brief.&lt;/p&gt;

&lt;p&gt;The backend checks file format, enforces the 12 MB upload limit, and rejects an empty transcript or a transcript exceeding the brief limit. Audio stays in request memory and is not stored by ScopeNote. Provider policies still apply.&lt;/p&gt;

&lt;p&gt;Free includes one voice import per month; Premium includes ten per 30-day access period. A failed provider call produces an error instead of sample transcription text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inspect:&lt;/strong&gt; &lt;a href="https://github.com/dkfadhila/scopenote/blob/main/server/app.js" rel="noopener noreferrer"&gt;Transcription endpoint and validation&lt;/a&gt; · &lt;a href="https://github.com/dkfadhila/scopenote/blob/main/server/accounts.js" rel="noopener noreferrer"&gt;Per-account usage enforcement&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Built and written with AI assistance under my direction. The point of ScopeNote is to make the unresolved parts of a brief easier to discuss before they become commitments.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>mlhacks</category>
    </item>
    <item>
      <title>Keluar Sebentar: open-source AI that gives you a reason to close the tab</title>
      <dc:creator>Tirta</dc:creator>
      <pubDate>Mon, 12 Oct 2026 03:40:13 +0000</pubDate>
      <link>https://dev.to/dkfadhila/keluar-sebentar-open-source-ai-that-gives-you-a-reason-to-close-the-tab-3dl3</link>
      <guid>https://dev.to/dkfadhila/keluar-sebentar-open-source-ai-that-gives-you-a-reason-to-close-the-tab-3dl3</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;“Keluar sebentar” means “step out for a moment” in Indonesian. That is the entire ambition of this project.&lt;/p&gt;

&lt;p&gt;An outdoor app can accidentally become another reason to keep looking at a screen: routes to optimize, species to identify, miles to log. I wanted a smaller interaction. Tell it what would feel good, give it five or ten minutes, get one mission, and leave.&lt;/p&gt;

&lt;p&gt;Keluar Sebentar uses an open multilingual embedding model running in your browser to match your words to twelve outdoor activities. You can ask for a quiet moment, a short walk, birds, plants, or a little creativity. Your time, energy, seated preference, and need for a covered spot filter the catalog before the model's similarity scores choose a match.&lt;/p&gt;

&lt;p&gt;You might get “Meet one ordinary leaf”: find a plant near home, notice its edge and veins, and return with one detail in mind. No photo, identification, or account needed. A balcony, porch, or familiar neighborhood can be enough.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://dkfadhila.github.io/keluar-sebentar/" rel="noopener noreferrer"&gt;Try Keluar Sebentar in your browser&lt;/a&gt;. No login or API key is required. Enable the local AI and wait for the first model download before matching a mission.&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%2F8warxzgx0pwu1daczvrv.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%2F8warxzgx0pwu1daczvrv.png" alt="Real browser AI matching an Indonesian query to an outdoor mission" width="800" height="1201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try this exact query: &lt;strong&gt;“Saya ingin lihat tanaman dan daun dekat rumah.”&lt;/strong&gt; In the browser test, the real model selected &lt;strong&gt;“Meet one ordinary leaf.”&lt;/strong&gt; This result was not a canned response: the worker embedded the Indonesian query, compared it with the filtered mission embeddings, and returned the top matches.&lt;/p&gt;

&lt;p&gt;The screen labels the result &lt;strong&gt;MATCHED BY LOCAL AI&lt;/strong&gt;. Before model loading, you can browse a &lt;strong&gt;CURATED PREVIEW&lt;/strong&gt; instead; that mode is deliberately labeled differently.&lt;/p&gt;

&lt;p&gt;After choosing a mission, download a small text pocket card or press &lt;strong&gt;Take this outside&lt;/strong&gt;. There is no countdown or performance target. On return, you may keep one observation locally, or skip recording altogether.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/dkfadhila/keluar-sebentar" rel="noopener noreferrer"&gt;Source code, setup instructions, and tests on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The application is a static HTML/CSS/JavaScript project with no build step. Run it with Python's HTTP server, or host the &lt;code&gt;dist&lt;/code&gt; directory. The code, mission library, and test suite are included under the MIT license. The doorstep hero and transparent door logo were generated with GPT Image; their original files and exact prompts are included in the repository. The doorstep is illustrative artwork, not a photo from a field trial.&lt;/p&gt;

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

&lt;p&gt;The core is &lt;a href="https://huggingface.co/Xenova/paraphrase-multilingual-MiniLM-L12-v2" rel="noopener noreferrer"&gt;multilingual MiniLM&lt;/a&gt;, using ONNX weights with &lt;a href="https://github.com/huggingface/transformers.js" rel="noopener noreferrer"&gt;Transformers.js&lt;/a&gt;. The runtime is pinned to version 3.8.1 and runs quantized q8 inference on the CPU through WebAssembly, inside a web worker.&lt;/p&gt;

&lt;p&gt;At model initialization, it embeds the mission descriptions with mean pooling and normalization. For each request, it embeds the user's words in the same vector space. It first excludes activities that exceed the selected time or energy, or fail an access preference. A normalized dot product then ranks the remaining missions.&lt;/p&gt;

&lt;p&gt;That separation matters. A model may consider a walking activity semantically relevant, but it cannot override a request for a seated break. The recommendation is an inspected activity from a fixed catalog, rather than a generated route or an invented nearby park.&lt;/p&gt;

&lt;p&gt;I kept the interface intentionally finite: one recommended card, two alternatives, and a button to leave. The local reflection journal has no streaks or leaderboard. Error states never silently substitute a curated preview for an AI result.&lt;/p&gt;

&lt;p&gt;AI coding assistance helped create the implementation, mission copy, and this draft. The catalog and ranking code are openly inspectable. Automated tests cover all 48 combinations of the hard filters, ranking behavior, malformed vectors, and catalog integrity. Real browser inference verified the Indonesian leaf example. I have not yet completed an outdoor field trial, so I am not claiming a wellbeing improvement or an offline reliability result from one.&lt;/p&gt;

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

&lt;p&gt;Here, openness changes where the personal part of the interaction happens. A sentence about being tired, lonely, or overwhelmed does not need to go to an inference server. The weights arrive in the browser; the words stay there.&lt;/p&gt;

&lt;p&gt;There is no per-request inference bill or secret API key. The open model can be replaced, the mission catalog can be translated or adapted, and the hard constraints can be inspected independently of the model. Someone building for a different neighborhood or access need can change the actual behavior, not only rewrite a prompt to a remote service.&lt;/p&gt;

&lt;p&gt;There are tradeoffs. The first model download is substantial, around 120 MB of weights plus supporting resources. Browser caches can disappear. Semantic similarity is imperfect, and a tiny catalog will not fit every intention. The current app does not know the weather or whether a path is accessible. It asks you to choose a safe, familiar place.&lt;/p&gt;

&lt;p&gt;For this small purpose, those boundaries are useful: the AI helps choose what to notice, then lets the world do the rest.&lt;/p&gt;

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