<?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: Sasivarnan R</title>
    <description>The latest articles on DEV Community by Sasivarnan R (@sasivarnan).</description>
    <link>https://dev.to/sasivarnan</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%2F4086313%2F1a220344-9767-42b1-81dd-c8e3afba9428.jpg</url>
      <title>DEV Community: Sasivarnan R</title>
      <link>https://dev.to/sasivarnan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sasivarnan"/>
    <language>en</language>
    <item>
      <title>One changed link, a different answer: Workweave with FalkorDB</title>
      <dc:creator>Sasivarnan R</dc:creator>
      <pubDate>Sun, 18 Oct 2026 15:16:59 +0000</pubDate>
      <link>https://dev.to/sasivarnan/one-changed-link-a-different-answer-workweave-with-falkordb-33e5</link>
      <guid>https://dev.to/sasivarnan/one-changed-link-a-different-answer-workweave-with-falkordb-33e5</guid>
      <description>&lt;p&gt;A company approves a new decision. The document changes. An employee's saved plan does not.&lt;/p&gt;

&lt;p&gt;Which work now needs review? Which teams are affected? Who can help?&lt;/p&gt;

&lt;p&gt;Workweave is an employee workspace built for the Company Brain track of Graph Hacks. Its agent uses FalkorDB to answer these questions from relationships between work, decisions, sources and people.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/sasivarnan/workweave-falkordb" rel="noopener noreferrer"&gt;Source code&lt;/a&gt; · &lt;a href="https://workweave-falkordb.onrender.com/" rel="noopener noreferrer"&gt;Hosted workspace&lt;/a&gt; · &lt;a href="https://github.com/sasivarnan/workweave-falkordb#graph-data-model" rel="noopener noreferrer"&gt;Graph model and setup&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%2F6yywc1ygebpkz7z67dfp.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%2F6yywc1ygebpkz7z67dfp.png" alt="Workweave keeps the task visible beside its assistant" width="800" height="744"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A decision is more than a recent document
&lt;/h2&gt;

&lt;p&gt;The sample story follows three people. Maya is an engineer. Priya approves company decisions. Leo reviews Maya's work.&lt;/p&gt;

&lt;p&gt;Maya saved a checkout plan based on Adyen. Priya later approves Razorpay as its replacement. Workweave keeps Maya's original plan and marks it for review. It does not silently rewrite her notes.&lt;/p&gt;

&lt;p&gt;A later proposal is not automatically an approved decision. The graph checks approval, service scope, replacement links and source support. Missing or conflicting authority blocks affected actions.&lt;/p&gt;

&lt;p&gt;These are synthetic company records. The provider names do not represent real company decisions or live integrations.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the graph stores
&lt;/h2&gt;

&lt;p&gt;FalkorDB stores the operational context, including assignments, services, decisions, source documents, reviewers and saved plans.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Maya → ASSIGNED_TO → Assignment → TOUCHES → Service
Leo → REVIEWER_FOR → Service
Decision → APPLIES_TO → Service
Decision → SUPPORTED_BY → Document
New decision → SUPERSEDES → Earlier decision
Saved plan → SUPPORTED_BY → Decision
Work item → TOUCHES → Service → DEPENDS_ON → Service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The saved plan retains the decision it used. That identity lets the application detect a replacement without comparing document wording.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/sasivarnan/workweave-falkordb#graph-data-model" rel="noopener noreferrer"&gt;README graph diagrams&lt;/a&gt; show the model. The &lt;a href="https://github.com/sasivarnan/workweave-falkordb/blob/main/docs/CYPHER.md" rel="noopener noreferrer"&gt;Cypher catalogue&lt;/a&gt; contains the queries used by the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  An agent with checked output
&lt;/h2&gt;

&lt;p&gt;Maya asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What changed for my work, who else is affected, and whom should I ask?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The model chooses from four read-only tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;get_current_decision&lt;/code&gt;: check approved guidance and its source.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;inspect_saved_plan&lt;/code&gt;: compare the saved plan with current guidance.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;find_affected_work&lt;/code&gt;: follow service dependencies and find linked owners.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;find_reviewers&lt;/code&gt;: find the people recorded as reviewers for this work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model selects observed fact IDs and proposes next steps. The server builds factual text from the checked graph records. It rejects unknown fact IDs, missing authority checks and changed evidence.&lt;/p&gt;

&lt;p&gt;The agent cannot approve decisions, save a plan or send messages. Maya makes those changes through explicit actions. This is a constrained tool-planning agent, not unrestricted generated advice.&lt;/p&gt;

&lt;p&gt;The assistant opens beside the task. Maya can keep her work visible while she asks a question.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test: change a relationship, keep the text
&lt;/h2&gt;

&lt;p&gt;The strongest test changes one dependency instead of changing a document.&lt;/p&gt;

&lt;p&gt;Before the change, Support has two routes to Checkout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Support → Checkout
Support → Billing → Checkout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Billing also depends on Checkout. The application finds four affected work items.&lt;/p&gt;

&lt;p&gt;Next, the demo removes Billing → Checkout. Billing's task must leave the result. Support must remain, because its direct route still exists.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;th&gt;Before removal&lt;/th&gt;
&lt;th&gt;After removal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Affected work items&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Billing task BILL-204&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;td&gt;Excluded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Support task SUP-310&lt;/td&gt;
&lt;td&gt;Included, two routes&lt;/td&gt;
&lt;td&gt;Included, one route&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source content&lt;/td&gt;
&lt;td&gt;Same content hash&lt;/td&gt;
&lt;td&gt;Same content hash&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The same question was sent to the configured OpenAI agent before and after this change. Both live answers identified the stale plan and reviewers. The second answer removed Billing and retained Support with one route. Neither run changed Maya's saved plan.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/sasivarnan/workweave-falkordb/blob/main/reports/agent-live.json" rel="noopener noreferrer"&gt;recorded live result&lt;/a&gt; contains the facts, completed tool names and checks. This is two runs on one synthetic scenario, not a general accuracy benchmark.&lt;/p&gt;

&lt;h2&gt;
  
  
  How FalkorDB finds the paths
&lt;/h2&gt;

&lt;p&gt;Dependency retrieval uses a bounded, directed Cypher traversal. This fragment shows the core path query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cypher"&gt;&lt;code&gt;&lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;w:&lt;/span&gt;&lt;span class="n"&gt;WorkItem&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:TOUCHES&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;s:&lt;/span&gt;&lt;span class="n"&gt;Service&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;MATCH&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:DEPENDS_ON&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;root:&lt;/span&gt;&lt;span class="n"&gt;Service&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;id:&lt;/span&gt;&lt;span class="n"&gt;$root&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="ow"&gt;IN&lt;/span&gt; &lt;span class="nf"&gt;nodes&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;single&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;other&lt;/span&gt; &lt;span class="ow"&gt;IN&lt;/span&gt; &lt;span class="nf"&gt;nodes&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="ss"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="n"&gt;w.id&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w.title&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="ow"&gt;IN&lt;/span&gt; &lt;span class="nf"&gt;nodes&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;node.title&lt;/span&gt;&lt;span class="ss"&gt;]&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;w.id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full query also retrieves team and owner links. Results are grouped by source ID so alternate routes do not duplicate work items.&lt;/p&gt;

&lt;p&gt;For indirect dependencies, native &lt;code&gt;algo.SPpaths&lt;/code&gt; supplies a verified shortest explanation. The bounded traversal retains the alternate routes; a single shortest path alone would not establish that all routes disappeared.&lt;/p&gt;

&lt;p&gt;Another database could implement this logic. The point of the test is that FalkorDB relationships control this application's answer. The graph is not a picture added after retrieval.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design lessons
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Approval and freshness are different.&lt;/strong&gt; Newer text can be an unapproved proposal. Approval must be represented and checked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Acknowledgement and acceptance are different.&lt;/strong&gt; Reading a replacement does not mean that an old plan has been updated. Workweave records both actions separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One broken route does not remove all impact.&lt;/strong&gt; Alternate routes matter. The removal test checks retained work as well as removed work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;More context does not guarantee a correct model answer.&lt;/strong&gt; An earlier paired model diagnostic still produced abstention and citation failures with graph context. That result led to checked fact IDs and server-side action gates. The &lt;a href="https://github.com/sasivarnan/workweave-falkordb/blob/main/EVALUATION.md" rel="noopener noreferrer"&gt;validation report&lt;/a&gt; includes those failures and the method's limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  What remains
&lt;/h2&gt;

&lt;p&gt;The prototype uses normalized synthetic exports, not live Jira, Calendar or Zoom synchronization. Missing links can hide affected work. Traversals stop after five links. A visitor cookie isolates sample graphs; it is not production employee authentication.&lt;/p&gt;

&lt;p&gt;Production work would need identity, permission-aware retrieval, reliable connector updates and operational monitoring. Agent access also needs provider spending controls; an operation limit is not a dollar cap.&lt;/p&gt;

&lt;p&gt;Workweave's useful result is a checked connection between a changed decision and the work that depends on it. The employee can inspect the source and choose the next action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI disclosure:&lt;/strong&gt; Codex assisted with implementation, tests, documentation and this article draft. Automated checks are documented separately from participant review. No independent user test or production accuracy claim is made.&lt;/p&gt;

</description>
      <category>falkordb</category>
      <category>graphhacks</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>SoundSafari: ten seconds of recording, one minute of listening</title>
      <dc:creator>Sasivarnan R</dc:creator>
      <pubDate>Sat, 10 Oct 2026 02:29:13 +0000</pubDate>
      <link>https://dev.to/sasivarnan/soundsafari-ten-seconds-of-recording-one-minute-of-listening-4lhi</link>
      <guid>https://dev.to/sasivarnan/soundsafari-ten-seconds-of-recording-one-minute-of-listening-4lhi</guid>
      <description>&lt;p&gt;&lt;em&gt;Built for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;DEV Week 1 “Touch Grass” challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;SoundSafari is a small outdoor listening exercise. You record ten seconds of your surroundings, get a tentative sound category, and use it to choose a short listening mission. Then you put the phone down, listen, and optionally write what you noticed.&lt;/p&gt;

&lt;p&gt;The goal is simple: make a familiar place worth paying attention to again.&lt;/p&gt;

&lt;p&gt;The first version spent too much space explaining itself. During development, I found myself asking what I was actually supposed to do in the app. That question became the design constraint. The current mobile-first experience has three steps: &lt;strong&gt;Capture → Listen → Note&lt;/strong&gt;. No account, leaderboard, or feed.&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%2F6lxoww250y1b5r8ivyfs.jpg" 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%2F6lxoww250y1b5r8ivyfs.jpg" alt="SoundSafari’s mobile capture screen" width="390" height="844"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://sound-safari.sasivarnan.chatgpt.site" rel="noopener noreferrer"&gt;Try SoundSafari — live on OpenAI Sites&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo is public. Open it directly in your browser for microphone access; no app account is needed.&lt;/p&gt;

&lt;p&gt;You can also run the app locally using the repository’s setup instructions. Allow the initial model download to finish, then record while stationary somewhere safe. If microphone access is unavailable, choose a sound you can actually hear and continue manually.&lt;/p&gt;

&lt;p&gt;The exercise is intentionally small:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Consent to a ten-second microphone recording, or take the manual route.&lt;/li&gt;
&lt;li&gt;Review the model’s suggestions and choose a listening mission.&lt;/li&gt;
&lt;li&gt;Spend a minute listening. The optional timer keeps time; the screen doesn’t need your attention.&lt;/li&gt;
&lt;li&gt;Write a short reflection, with an explicit choice to save it on this device.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;&lt;a href="https://github.com/sasivarnan/sound-safari" rel="noopener noreferrer"&gt;GitHub repository — sasivarnan/sound-safari&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The application is MIT licensed. The README documents setup, model provenance, privacy behavior, deployment, and limitations.&lt;/p&gt;

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

&lt;p&gt;SoundSafari uses React, TypeScript, and Vite, with a restrained shadcn interface. Application state lives in &lt;code&gt;@xstate/store&lt;/code&gt;: recording, analysis, mission selection, timer, reflection, and persistence all respond to explicit events. Small screen transitions and recording feedback respect reduced-motion preferences.&lt;/p&gt;

&lt;p&gt;For the core AI feature, I used &lt;a href="https://huggingface.co/Xenova/ast-finetuned-audioset-10-10-0.4593" rel="noopener noreferrer"&gt;Xenova’s Audio Spectrogram Transformer checkpoint&lt;/a&gt;, an AudioSet sound classifier, through &lt;a href="https://huggingface.co/docs/transformers.js" rel="noopener noreferrer"&gt;Transformers.js&lt;/a&gt;. A worker runs quantized inference locally in the browser using WASM.&lt;/p&gt;

&lt;p&gt;That choice has a real cost: the first visit needs roughly 90 MB of model weights, plus runtime assets. It also means captured audio does not need to be sent to a server for classification. The model download requires a network connection, and browser caching does not make this a guaranteed offline app.&lt;/p&gt;

&lt;p&gt;The output is a suggestion, not a verified description of a place. Wind, overlapping sounds, and unfamiliar recordings can confuse the classifier. SoundSafari handles silence, low confidence, failed model loads, and denied microphone access without inventing a result. The manual route remains available.&lt;/p&gt;

&lt;p&gt;Missions are curated prompts selected from the chosen sound category. They are &lt;strong&gt;not generated by a language model&lt;/strong&gt;. That keeps them short and predictable. They ask you to notice what you can hear from a safe position; they do not give walking directions or ask you to approach a sound source.&lt;/p&gt;

&lt;p&gt;Privacy also affects the lifecycle: the app stops an active recording when the page is hidden, ignores stale asynchronous results after cancellation, and releases microphone tracks. Reflections stay in the current session unless the user opts into local persistence. Saved entries can be cleared; recordings are not saved with them.&lt;/p&gt;

&lt;p&gt;Two community discussions informed the reliability work: &lt;a href="https://dev.to/orca_forge/browser-voice-interaction-ai-pitfall-guide-2026-16-common-traps-with-aec-getusermedia-and-40hd"&gt;orca_forge’s browser audio pitfalls guide&lt;/a&gt; prompted attention to microphone lifecycle, and &lt;a href="https://dev.to/ryanlee91/react-email-checks-need-abortable-state-36f2"&gt;ryanlee91’s abortable state article&lt;/a&gt; reinforced the need to reject late responses. I applied those principles to recording and model runs rather than copying their implementations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validation so far:&lt;/strong&gt; 18 automated tests pass, the production build passes, and synthetic model smoke checks ran in Node and a browser worker. These checks establish that the pipeline runs; they do not establish outdoor classification accuracy. Real outdoor sessions and broader mobile-device testing are still needed. This is an MVP, not a species identifier, navigation aid, or safety monitor.&lt;/p&gt;

&lt;p&gt;AI assistance was used for implementation, debugging, and drafting this post. The product direction and revisions came from the development conversation; this post makes no claim of field observations that did not happen.&lt;/p&gt;

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

&lt;p&gt;Open weights made it practical to build a useful sound-analysis feature without collecting people’s recordings. They also make the model choice inspectable: another developer can find the checkpoint, understand its training context and license, and replace it if it performs poorly for their environment.&lt;/p&gt;

&lt;p&gt;That openness does not remove limitations. Model size, device performance, and uncertain predictions still shape the experience. In SoundSafari, those constraints led to an honest fallback and a smaller interaction: use the model to start paying attention, then let the person do the listening.&lt;/p&gt;

&lt;p&gt;The next useful step is to try that interaction outdoors with a few people and see whether it helps them notice something they would otherwise have missed.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Practice the Awkward Bit: rehearse conversations with local Gemma</title>
      <dc:creator>Sasivarnan R</dc:creator>
      <pubDate>Sat, 03 Oct 2026 19:27:05 +0000</pubDate>
      <link>https://dev.to/sasivarnan/practice-the-awkward-bit-rehearse-conversations-with-local-gemma-1kl0</link>
      <guid>https://dev.to/sasivarnan/practice-the-awkward-bit-rehearse-conversations-with-local-gemma-1kl0</guid>
      <description>&lt;p&gt;&lt;em&gt;A submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I’m an introvert, and sometimes the hardest part of a conversation is getting the first sentence out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practice the Awkward Bit&lt;/strong&gt; gives you a quiet place to rehearse: decline an invitation, ask for something back, or join a conversation. Set the scene, choose how cooperative the other person is, and try a few replies.&lt;/p&gt;

&lt;p&gt;Gemma plays the other person. When you finish, it offers one thing you expressed clearly, one suggestion, and another way to say it. &lt;strong&gt;“Try this reply again”&lt;/strong&gt; takes you back to an earlier message so you can experiment.&lt;/p&gt;

&lt;p&gt;I built it with fellow introvert people in mind.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://practice-the-awkward-bit.sasivarnan.chatgpt.site" rel="noopener noreferrer"&gt;Try the app&lt;/a&gt; — currently private, pending access for judges.&lt;/p&gt;

&lt;p&gt;Use a desktop browser with WebGPU. Load the model, choose &lt;strong&gt;Decline an invitation&lt;/strong&gt;, and try:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Thanks for inviting me! I’m going to stay in tonight, but I’d like to join you another time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then ask for a reflection or retry your reply. The first model download is large and needs internet.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/sasivarnan/practice-the-awkward-bit" rel="noopener noreferrer"&gt;Source on GitHub&lt;/a&gt; · MIT license for the app.&lt;/p&gt;

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

&lt;p&gt;React, TypeScript, and Tailwind CSS 4 handle the interface. &lt;strong&gt;Gemma 2 2B&lt;/strong&gt; runs locally through &lt;a href="https://github.com/mlc-ai/web-llm" rel="noopener noreferrer"&gt;WebLLM&lt;/a&gt;, in a dedicated worker.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                  YOUR BROWSER
┌─────────────────────────────────────────────┐
│ React UI · Tailwind CSS 4                    │
│   Scene → conversation → reflection → retry │
│                 ⇅ messages                  │
│ Web Worker                                  │
│   WebLLM → Gemma 2 2B → WebGPU               │
│                 ↑                           │
│ IndexedDB: cached model assets              │
│                                             │
│ Conversation: memory by default             │
│   └─ optional localStorage save / text export│
└─────────────────────────────────────────────┘
          ↑ site and model downloads
     Hosting / model asset servers
     (no conversation inference requests)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Role-play and reflection use separate prompts. Reflection returns structured JSON, and the app checks that its quoted reply actually came from the user.&lt;/p&gt;

&lt;p&gt;Model loading, real replies, reflection, rewind, and save/restore worked in the desktop browser test. Tests, type checks, and the build passed. Feedback still sometimes invents details, so it needs judgment rather than blind acceptance.&lt;/p&gt;

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

&lt;p&gt;These conversations can be personal. Running an open-weight model locally keeps the transcript out of an inference API and avoids a per-conversation API bill.&lt;/p&gt;

&lt;p&gt;I can also inspect the prompts and swap supported models. The tradeoff is a large download and dependence on the user’s hardware. This isn’t a fully offline install, and &lt;a href="https://ai.google.dev/gemma/terms" rel="noopener noreferrer"&gt;Gemma’s terms&lt;/a&gt; still apply.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/rahul_80cfa43302b/a-simple-react-hook-for-running-local-llms-via-webgpu-5234"&gt;Rahul’s post on browser-local LLMs&lt;/a&gt; helped frame the worker and loading experience.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma generates both the conversation partner and the reflection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Credits
&lt;/h2&gt;

&lt;p&gt;Google Gemma, MLC AI/WebLLM, React, Tailwind CSS, lucide-react, and the Sites/Vinext starter.&lt;/p&gt;

&lt;p&gt;Codex helped build, debug, test, and draft this post.&lt;/p&gt;

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