<?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: Familia Sync</title>
    <description>The latest articles on DEV Community by Familia Sync (@familia_sync).</description>
    <link>https://dev.to/familia_sync</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%2F4134628%2F7a514e31-dfed-4bba-8202-7331a4880add.png</url>
      <title>DEV Community: Familia Sync</title>
      <link>https://dev.to/familia_sync</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/familia_sync"/>
    <language>en</language>
    <item>
      <title>Teaching our on-device assistant to say "I don't know"</title>
      <dc:creator>Familia Sync</dc:creator>
      <pubDate>Sun, 20 Sep 2026 21:55:11 +0000</pubDate>
      <link>https://dev.to/familia_sync/teaching-our-on-device-assistant-to-say-i-dont-know-66m</link>
      <guid>https://dev.to/familia_sync/teaching-our-on-device-assistant-to-say-i-dont-know-66m</guid>
      <description>&lt;p&gt;&lt;em&gt;We're building &lt;a href="https://www.familiasync.com/" rel="noopener noreferrer"&gt;FamiliaSync&lt;/a&gt;, an offline-first family organizer where all data stays encrypted on your own devices. That constraint extends to the assistant: every query has to run on the phone, no cloud calls allowed. Here's what happened when we replaced our hand-written intent router with a small on-device classifier.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A smarter first step
&lt;/h2&gt;

&lt;p&gt;Every request to the FamiliaSync assistant now starts with a small intent classifier trained on-device. It replaces the hand-written pattern rules that used to decide what you meant. The pipeline behind it is unchanged in spirit: your text is routed to the right tool, or handed to Needle 2 — the on-device model bundled with the app — when a request needs open-ended reasoning.&lt;/p&gt;

&lt;p&gt;The training corpus was researched, not generated in bulk: 105 intents backed by roughly 2,400 example utterances carrying the slots real commands need — dates, times, assignees, quantities, amounts, categories, and recurrence. Thirty-five of those intents map to real tools in the app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Training the 'no' cases
&lt;/h2&gt;

&lt;p&gt;Here's the part we didn't expect to matter most: &lt;strong&gt;70 of the 105 intents are documented-only.&lt;/strong&gt; They cover things the assistant can't do yet — notes, stores, loans, meter readings — and they exist so that an unsupported request falls through to the model for a plain-language answer instead of being forced into an unrelated tool. Training the 'no' cases turned out to be as important as training the 'yes' cases.&lt;/p&gt;

&lt;p&gt;A confidence gate sits on top: if the classifier isn't sure, it doesn't route at all — the model handles the request instead. And everything happens on-device. Training is lazy and local, inference is local, and no query ever leaves the phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real phrasing broke it within hours
&lt;/h2&gt;

&lt;p&gt;Shipping the router was the easy part. Real queries surfaced three misroutes the same day, and each one taught us something:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;"what are todays plan"&lt;/code&gt; fell below the confidence threshold — and a stray keyword let the model invent a meal called "Sri, Ram" from family names in the prompt. Loose keywords were stripped, and 'today's plan' phrasings now map to listing events.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"what is my meal plan for today"&lt;/code&gt; confidently matched the wrong tool — a read question nearly overwrote the shopping list, stopped only by the confirmation gate. That tool now requires an explicit generate signal, and the corpus grew question-form examples.&lt;/li&gt;
&lt;li&gt;The meal-plan answer that did work dumped raw record IDs and the entire week. It now renders meal names and accepts filters like 'today' or 'lunch'.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  From commands to conversation
&lt;/h2&gt;

&lt;p&gt;The bigger shift: the assistant can now ask back. Tell it 'create a reminder' and instead of guessing, it asks what to remind you about — then completes the action from your reply. Tools can request a missing argument mid-flow, and partially collected details carry over between turns.&lt;/p&gt;

&lt;p&gt;Follow-ups exposed gaps we didn't know existed. When people answer in their own words, dates arrive as 'friday 6pm', 'tonight', or '19th spetember 2026' — so the date parser now handles casual formats, including typo-tolerant month names. And when someone answers 'anyone' or 'doesn't matter' to a member prompt, the event is created unassigned rather than silently picking the first family member.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An assistant that knows when it doesn't know is more trustworthy than one that always guesses.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Nine commits in one day: a trained intent router, honest misroutes fixed in the open, and an assistant that asks follow-up questions — all running entirely on-device, with settings copy updated in four languages. Every query stays on your phone. That's the point.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;FamiliaSync is in pre-launch — if on-device AI and privacy-first architecture interest you, the &lt;a href="https://www.familiasync.com/" rel="noopener noreferrer"&gt;waitlist is open&lt;/a&gt; and the &lt;a href="https://www.familiasync.com/blog" rel="noopener noreferrer"&gt;technical write-ups live on our blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>privacy</category>
      <category>reactnative</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
