<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Ferni Developer Blog</title>
  <subtitle>Build voice AI agents with Ferni&#39;s platform. Create, customize, and deploy conversational AI in minutes.</subtitle>
  <link href="https://developers.ferni.ai/blog/feed.xml" rel="self" type="application/atom+xml"/>
  <link href="https://developers.ferni.ai/blog" rel="alternate" type="text/html"/>
  <id>https://developers.ferni.ai/blog</id>
  <updated>2026-10-20T00:00:00.000Z</updated>
  <author><name>The Ferni Team</name></author>
  <entry>
    <title>What&#39;s New: Navigation Fixes, Accessibility Improvements, and Smoother Settings</title>
    <link href="https://developers.ferni.ai/blog/whats-new-2026-10-20" rel="alternate" type="text/html"/>
    <id>https://developers.ferni.ai/blog/whats-new-2026-10-20</id>
    <published>2026-10-20T00:00:00.000Z</published>
    <updated>2026-10-20T00:00:00.000Z</updated>
    <author><name>The Ferni Team</name></author>
    <category term="What&#39;s New"/>
    <summary>A roundup of recent code changes landed across Ferni, including back button fixes, screen shell scrolling, contrast improvements, and integration updates.</summary>
    <content type="html">&lt;p&gt;Here is a look at what landed across the Ferni codebase recently. We have been focused on smoother web navigation, cleaner accessibility, and sharper settings updates.&lt;/p&gt;
&lt;h2&gt;Mobile and Navigation Updates&lt;/h2&gt;
&lt;p&gt;We merged a fix for back button navigation in the web app. Previously, none of the 37 panels in the app held browser history entries. Pressing back on a phone or in a browser left the app completely instead of closing an open menu or sheet. Now, opening a dismissable panel holds one history entry, so pressing back closes the open overlay. Take a look at &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/2202&quot;&gt;#2202&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We also landed changes for notched phone screens. Double safe area padding made the app shell taller than the display, which pushed buttons off screen and blocked scrolling. The app shell now fits the screen and scrolls properly inside its container. See &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/2139&quot;&gt;#2139&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Interface Speed and Accessibility&lt;/h2&gt;
&lt;p&gt;Slow menu panels now give instant feedback. Panels like Sanctuary used to wait for network data before rendering any markup. A new shared loading shell shows a busy dialog right away while data loads. We also converted several panels into real modal dialogs so keyboard navigation and Escape key handlers work reliably. Check out &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/2109&quot;&gt;#2109&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We fixed reduced motion behavior and color contrast across themes. Enabling reduced motion previously hid the Connect button because opacity rules conflicted. We also updated call buttons so Disconnect uses a soft warm outline rather than looking identical to Connect. See &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/1979&quot;&gt;#1979&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Additional contrast fixes landed for history stars, notification active tabs, and difficulty labels across zen and midnight themes. We swapped flag emojis in language lists for plain text labels as well. Take a look at &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/2034&quot;&gt;#2034&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At 200% zoom, the status text on the Connect button wrapped awkwardly and got clipped. We updated the status label layout so connecting text stays properly inside the button. See &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/1523&quot;&gt;#1523&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Reliable Integrations and Settings&lt;/h2&gt;
&lt;p&gt;Google Calendar settings showed a Connect button even after a successful setup. The panel expected a wrapped response envelope that the server did not send. We merged a fix so the UI reads the flat status object directly. Check out &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/1983&quot;&gt;#1983&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We landed a fix for contact settings where typing a phone number saved a blank string. Input values now stay in state across re-renders, normalize to E.164 format, and prompt for verification codes properly. Take a look at &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/1676&quot;&gt;#1676&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Web Feeds and Discovery&lt;/h2&gt;
&lt;p&gt;We merged updates to make posts and pages easy to discover. This adds RSS and Atom feeds, an XML sitemap for the developer portal, Twitter cards, and an IndexNow key endpoint. See &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/2010&quot;&gt;#2010&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>What&#39;s New: Accessibility Fixes, Phone Layouts, and Developer Feeds</title>
    <link href="https://developers.ferni.ai/blog/whats-new-2026-10-19" rel="alternate" type="text/html"/>
    <id>https://developers.ferni.ai/blog/whats-new-2026-10-19</id>
    <published>2026-10-19T00:00:00.000Z</published>
    <updated>2026-10-19T00:00:00.000Z</updated>
    <author><name>The Ferni Team</name></author>
    <category term="What&#39;s New"/>
    <summary>A roundup of recent updates landed across Ferni interface components, mobile scrolling, accessibility, and site feeds.</summary>
    <content type="html">&lt;p&gt;Here is a look at recent updates landed across the Ferni codebase. We have made improvements to web accessibility, phone layouts, network error handling, and search discoverability.&lt;/p&gt;
&lt;h2&gt;Web interface and accessibility&lt;/h2&gt;
&lt;p&gt;In &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/2034&quot;&gt;#2034&lt;/a&gt;, landed fixes for text contrast across light and dark themes. Muted colors and opacity combinations previously caused text to fall below AA contrast requirements. The PR also replaces flag emojis in language lists with plain text labels.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/1523&quot;&gt;#1523&lt;/a&gt;, fixed layout behavior on the connect button when text is zoomed to 200%. Instead of absolute positioning that caused labels to clip, the status text now sits inside a flex container with screen reader labels intact.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/2110&quot;&gt;#2110&lt;/a&gt;, landed a fix for the progress ring in the journey pill. A CSS rule applied rotations to all child SVG elements, turning the inner heart icon sideways. Updating the selector keeps the heart upright and centered.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/1704&quot;&gt;#1704&lt;/a&gt;, landed changes that remove streak counters, percentage labels, and canned fallback responses across menu panels. When a network request fails, panels now show an honest error instead of fake data.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/1811&quot;&gt;#1811&lt;/a&gt;, Memory Lane and Team Insights now present explicit error messages when server requests fail. Previously, a failed request showed an empty state, making network issues look like missing content.&lt;/p&gt;
&lt;h2&gt;Smoother navigation and phone experience&lt;/h2&gt;
&lt;p&gt;In &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/2139&quot;&gt;#2139&lt;/a&gt;, landed layout fixes for mobile browser displays. Safe-area padding rules previously caused the main container to exceed screen height on notched phones, preventing scrolling. Setting height to 100% on the app container allows proper scrolling.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/2109&quot;&gt;#2109&lt;/a&gt;, landed instant loading shells for menu panels that fetch remote data. Tapping a panel opens a responsive dialog shell right away so the interface never feels frozen. The panels now use standard dialog accessibility properties, and pressing Escape returns focus to the menu trigger.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/2102&quot;&gt;#2102&lt;/a&gt;, fixed motion detection logic on phones. Calculating total acceleration without subtracting gravity caused normal tilt angles to trigger shake chimes. The new detector isolates actual device acceleration and disables shake surprises while a call is active.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/1676&quot;&gt;#1676&lt;/a&gt;, fixed phone number updates inside contact settings. Forms previously re-rendered before reading input, causing numbers to save as empty strings. Typed entries now persist across re-renders, normalize to E.164 format, and initiate SMS verification codes correctly.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/1647&quot;&gt;#1647&lt;/a&gt;, added new visual moods for the homepage avatar. The avatar settles between 21:00 and 04:59 local time with lowered eyelids and warmer lighting. People returning after more than 6 hours see a brief greeting look.&lt;/p&gt;
&lt;h2&gt;Feeds and developer discoverability&lt;/h2&gt;
&lt;p&gt;In &lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/2010&quot;&gt;#2010&lt;/a&gt;, landed RSS feeds at &lt;code&gt;/blog/feed.xml&lt;/code&gt;, a developers sitemap at &lt;code&gt;/sitemap.xml&lt;/code&gt;, Twitter cards, and IndexNow key hosting at &lt;code&gt;/indexnow-key.txt&lt;/code&gt;. Because blog posts publish automatically, these changes ensure search engines index new updates cleanly.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>What&#39;s New: A Faster, Lighter Ferni Website</title>
    <link href="https://developers.ferni.ai/blog/whats-new-2026-10-17" rel="alternate" type="text/html"/>
    <id>https://developers.ferni.ai/blog/whats-new-2026-10-17</id>
    <published>2026-10-17T00:00:00.000Z</published>
    <updated>2026-10-17T00:00:00.000Z</updated>
    <author><name>The Ferni Team</name></author>
    <category term="What&#39;s New"/>
    <summary>Four changes to the ferni.ai website landed: lighter blog images, a faster first paint, accessibility fixes, and icons and previews that resolve.</summary>
    <content type="html">&lt;p&gt;This round is all about the ferni.ai website. Four pull requests landed, each one in the site&#39;s own code, and together they make pages lighter, quicker to paint and easier to use. The numbers below come from Lighthouse and axe runs against a local production build, as described in each PR.&lt;/p&gt;
&lt;h2&gt;Blog images&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/1592&quot;&gt;#1592&lt;/a&gt; changed how blog images are served. Index cards and post heroes used to be 2016 by 1134 pixel PNGs, shown at a fraction of that size. They now go through an &lt;code&gt;@11ty/eleventy-img&lt;/code&gt; shortcode that renders a &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; with AVIF, WebP and JPEG at several widths, with &lt;code&gt;srcset&lt;/code&gt;, &lt;code&gt;sizes&lt;/code&gt;, &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; set. The featured card and the post hero load eagerly with &lt;code&gt;fetchpriority=&amp;quot;high&amp;quot;&lt;/code&gt;, and grid cards stay lazy. Posts also get a 1200 by 630 JPEG for &lt;code&gt;og:image&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The blog index went from 12.01 MB to 0.38 MB. The build now copies only the generated image a page uses, so the built &lt;code&gt;_site&lt;/code&gt; went from 698 MB to 166 MB.&lt;/p&gt;
&lt;h2&gt;First paint&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/1582&quot;&gt;#1582&lt;/a&gt; stopped scripts, side stylesheets and fonts from blocking first paint on the marketing pages. The 22 classic scripts on those pages now load with &lt;code&gt;defer&lt;/code&gt;, in the same order. Stylesheets that don&#39;t style the hero load without blocking, and the Google Fonts stylesheet is preloaded and swapped in. Lighthouse mobile counted 37 render-blocking resources before and 7 after, and total blocking time on the home page went from 248 ms to 29 ms.&lt;/p&gt;
&lt;h2&gt;Accessibility&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/1589&quot;&gt;#1589&lt;/a&gt; fixed the accessibility findings from our website audit: low-contrast text, heading-order skips, content outside landmarks, an empty table header and a weak focus ring on the nav button. While the cookie banner shows, the chat pill now moves above it, so it no longer covers the Accept button. Across the four pages checked, axe violation nodes on desktop went from 56 to 26, and the rest come from rules outside that PR.&lt;/p&gt;
&lt;h2&gt;Icons, previews and the sitemap&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ferni-ai/voiceai/pull/1576&quot;&gt;#1576&lt;/a&gt; fixed icons and link previews. The build never copied &lt;code&gt;src/images/&lt;/code&gt;, so favicons, logos, manifest icons and the default preview image were missing on many pages. Every one of those references on the main site now resolves. The sitemap went from 102 URLs to 65 real pages, every &lt;code&gt;lastmod&lt;/code&gt; is an ISO date, and hreflang is emitted only on the home page, the only page with translations.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>The Latency Stack: How We Architect Voice AI for Sub-200ms Response</title>
    <link href="https://developers.ferni.ai/blog/performance-optimization" rel="alternate" type="text/html"/>
    <id>https://developers.ferni.ai/blog/performance-optimization</id>
    <published>2026-01-14T00:00:00.000Z</published>
    <updated>2026-01-14T00:00:00.000Z</updated>
    <author><name>Seth Ford</name></author>
    <category term="Architecture"/>
    <summary>Voice AI that feels human requires response times humans don&#39;t consciously notice. Here&#39;s how we architect for that constraint.</summary>
    <content type="html">&lt;p&gt;When we started building Ferni, we set an aggressive target: &lt;strong&gt;sub-200ms time to first sound&lt;/strong&gt; after the user finishes speaking.&lt;/p&gt;
&lt;p&gt;Why 200ms? Because research on conversational turn-taking suggests that&#39;s roughly the threshold where humans start consciously perceiving delay. Below it, conversation feels natural. Above it, something feels off.&lt;/p&gt;
&lt;p&gt;Most voice AI doesn&#39;t hit this target. The typical stack adds latency at every layer—VAD waiting, audio streaming, transcription, LLM inference, TTS synthesis. Each step is optimized in isolation, but combined, they create delays that break conversational flow.&lt;/p&gt;
&lt;p&gt;Here&#39;s how we&#39;re architecting around this constraint.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The Latency Budget&lt;/h2&gt;
&lt;p&gt;Our architecture allocates a strict budget to each component:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Predictive endpointing&lt;/td&gt;
&lt;td&gt;-100ms&lt;/td&gt;
&lt;td&gt;Starts before speech ends&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audio streaming&lt;/td&gt;
&lt;td&gt;30ms&lt;/td&gt;
&lt;td&gt;Regional servers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speech-to-text&lt;/td&gt;
&lt;td&gt;50ms&lt;/td&gt;
&lt;td&gt;Streaming ASR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context retrieval&lt;/td&gt;
&lt;td&gt;10ms&lt;/td&gt;
&lt;td&gt;Pre-warmed cache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM first token&lt;/td&gt;
&lt;td&gt;80ms&lt;/td&gt;
&lt;td&gt;Optimized inference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TTS first audio&lt;/td&gt;
&lt;td&gt;40ms&lt;/td&gt;
&lt;td&gt;Streaming synthesis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Net to first sound&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~110ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;After predicted speech end&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The key insight: many components run in parallel, and prediction lets us start work before the user finishes speaking.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Pattern 1: Temporal Decoupling&lt;/h2&gt;
&lt;p&gt;The biggest architectural pattern we use is &lt;strong&gt;temporal decoupling&lt;/strong&gt;—separating fast-path operations from slow-path enrichment.&lt;/p&gt;
&lt;p&gt;Our memory system (&lt;code&gt;src/memory/dynamic/&lt;/code&gt;) demonstrates this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;User Speech
    │
    ▼
┌──────────────────────┐
│   Fast Capture       │  &amp;lt; 50ms (inline)
│   • Regex patterns   │
│   • Entity mentions  │
│   • Emotion signals  │
└────────┬─────────────┘
         │
    ┌────┴────┐
    │         │
    ▼         ▼
┌────────┐  ┌────────────────────┐
│  STM   │  │  Deep Extraction   │  Background (1-3s)
│ Buffer │  │  Worker            │
│  (L1)  │  │  • LLM analysis    │
└────────┘  │  • Relationship    │
            │    extraction      │
            └────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fast capture runs inline at &amp;lt; 50ms using regex patterns. It extracts entity mentions, emotion signals, topic hints—anything we can detect without LLM inference.&lt;/p&gt;
&lt;p&gt;Deep extraction runs asynchronously. It uses Gemini 1.5 Flash to do sophisticated analysis—understanding implicit relationships, detecting subtle emotional states, generating follow-up questions. But it doesn&#39;t block the response path.&lt;/p&gt;
&lt;p&gt;The user gets a fast response. The context gets richer over time.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Pattern 2: Three-Tier Memory&lt;/h2&gt;
&lt;p&gt;Memory access is a critical latency path. If the AI needs to remember who &amp;quot;Mom&amp;quot; is before responding, that lookup needs to be instant.&lt;/p&gt;
&lt;p&gt;We use a three-tier architecture:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Storage&lt;/th&gt;
&lt;th&gt;Latency&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;&lt;strong&gt;L1: STM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;In-memory&lt;/td&gt;
&lt;td&gt;&amp;lt; 1ms&lt;/td&gt;
&lt;td&gt;Current session context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L2: Working&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Firestore&lt;/td&gt;
&lt;td&gt;50-150ms&lt;/td&gt;
&lt;td&gt;Recent entities and facts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L3: Long-Term&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Spanner&lt;/td&gt;
&lt;td&gt;100-200ms&lt;/td&gt;
&lt;td&gt;Relationship graph&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The key is &lt;strong&gt;proactive promotion&lt;/strong&gt;. When we predict the user will reference something, we pre-load it into L1 before they ask.&lt;/p&gt;
&lt;p&gt;The STM buffer (&lt;code&gt;src/memory/dynamic/stm-buffer.ts&lt;/code&gt;) is a 20-turn FIFO that holds:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Recent entity mentions with frequency counts&lt;/li&gt;
&lt;li&gt;Emotional trajectory of the conversation&lt;/li&gt;
&lt;li&gt;Topic patterns and transitions&lt;/li&gt;
&lt;li&gt;Relationship signals detected in speech&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Session-end promotion (&lt;code&gt;src/memory/dynamic/stm-promotion.ts&lt;/code&gt;) moves frequently-mentioned entities and emotional arcs to Firestore for future sessions.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Pattern 3: Streaming Everything&lt;/h2&gt;
&lt;p&gt;Batching is the enemy of perceived latency.&lt;/p&gt;
&lt;p&gt;Traditional flow:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Collect all audio → Transcribe → Send to LLM →
Collect all tokens → Synthesize → Send audio
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Our flow:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Audio chunks → Partial transcripts → Token stream → Audio chunks
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With streaming, the user hears the beginning of the response while we&#39;re still generating the end. The first sound arrives fast; the complete response takes longer. But the conversation never pauses.&lt;/p&gt;
&lt;p&gt;The architecture uses &lt;code&gt;AsyncEvents.emit&lt;/code&gt; for fire-and-forget operations. When fast capture completes, it emits events that the deep extraction worker consumes without blocking.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Pattern 4: Context Pre-warming&lt;/h2&gt;
&lt;p&gt;The best latency optimization is doing work before it&#39;s needed.&lt;/p&gt;
&lt;p&gt;When a user connects:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We load their profile from L2/L3 memory&lt;/li&gt;
&lt;li&gt;We warm up model weights with their typical patterns&lt;/li&gt;
&lt;li&gt;We establish TTS connections to their preferred voice&lt;/li&gt;
&lt;li&gt;We pre-load recently-discussed entities into L1&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When they start speaking:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We run intent classifiers on partial transcripts&lt;/li&gt;
&lt;li&gt;We retrieve likely-relevant context&lt;/li&gt;
&lt;li&gt;We prepare response templates for common patterns&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By the time the user finishes a sentence, we&#39;ve often already begun generating the response.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The Memory Pressure System&lt;/h2&gt;
&lt;p&gt;Fast systems need memory management. Our &lt;code&gt;SessionDataManager&lt;/code&gt; (&lt;code&gt;src/services/session-data-manager.ts&lt;/code&gt;) coordinates all session-scoped caches:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Threshold&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&amp;lt; 70%&lt;/td&gt;
&lt;td&gt;No action&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;70-80%&lt;/td&gt;
&lt;td&gt;Evict oldest 10% of sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;80-90%&lt;/td&gt;
&lt;td&gt;Evict 25% + force GC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;90-95%&lt;/td&gt;
&lt;td&gt;Evict 50% + clear caches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&amp;gt; 95%&lt;/td&gt;
&lt;td&gt;EMERGENCY - Clear everything&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Every service that caches user data registers with SessionDataManager. When sessions end, all caches are cleared coordinately. When memory pressure rises, eviction happens automatically.&lt;/p&gt;
&lt;p&gt;This matters for latency because memory pressure causes GC pauses. Keeping memory under control keeps response times consistent.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;What We&#39;re Still Solving&lt;/h2&gt;
&lt;p&gt;We don&#39;t have all the answers. Some latency challenges remain:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Predictive endpointing accuracy&lt;/strong&gt;: We&#39;re using prosodic and syntactic cues to predict when users will finish speaking. But accuracy varies across speaking styles, accents, and contexts. False positives (thinking they&#39;re done when they&#39;re not) are worse than false negatives.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LLM inference variance&lt;/strong&gt;: Even with optimized serving, LLM response times vary. Sometimes we get first token in 50ms; sometimes it takes 200ms. Managing this variance is an ongoing challenge.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Context relevance&lt;/strong&gt;: Pre-loading context requires predicting what will be relevant. Sometimes we load the wrong things. Sometimes the right context isn&#39;t loaded yet when we need it.&lt;/p&gt;
&lt;p&gt;These are active areas of work, not solved problems.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Implications for Developers&lt;/h2&gt;
&lt;p&gt;If you&#39;re building on the Ferni platform:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Memory is automatic&lt;/strong&gt;: You don&#39;t build caching infrastructure. The three-tier system handles it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Streaming is default&lt;/strong&gt;: Responses stream to users automatically. You don&#39;t need to implement this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pre-warming happens&lt;/strong&gt;: When users connect, context is already loading.&lt;/p&gt;
&lt;p&gt;What you focus on: defining what your AI knows and how it helps. The latency infrastructure is our problem.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;p&gt;For those building their own voice AI systems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;src/memory/dynamic/CLAUDE.md&lt;/code&gt; — Detailed documentation of our memory architecture&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docs/architecture/MEMORY-MANAGEMENT.md&lt;/code&gt; — Session data management patterns&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src/services/session-data-manager.ts&lt;/code&gt; — Implementation of coordinated cache management&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The code is the best documentation of our actual approach.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Seth Ford is Ferni&#39;s AI babysitter. Follow &lt;a href=&quot;https://twitter.com/ferni_ai&quot;&gt;@ferni_ai&lt;/a&gt; for more on the future of conversational AI.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Tool Integration via MCP: How We Connect Voice AI to External Services</title>
    <link href="https://developers.ferni.ai/blog/mcp-server-integration" rel="alternate" type="text/html"/>
    <id>https://developers.ferni.ai/blog/mcp-server-integration</id>
    <published>2026-01-11T00:00:00.000Z</published>
    <updated>2026-01-11T00:00:00.000Z</updated>
    <author><name>Seth Ford</name></author>
    <category term="Integration"/>
    <summary>The Model Context Protocol (MCP) standardizes how AI agents discover and use tools. Here&#39;s why we&#39;ve built native support—and how it works.</summary>
    <content type="html">&lt;p&gt;Large language models can reason about anything. But they can&#39;t &lt;em&gt;do&lt;/em&gt; anything without tool integration.&lt;/p&gt;
&lt;p&gt;Ask an LLM to check your calendar, and it apologizes. Ask it to send an email, and it explains why it can&#39;t. The intelligence is there; the capability isn&#39;t.&lt;/p&gt;
&lt;p&gt;This is the tool integration problem. And the &lt;a href=&quot;https://modelcontextprotocol.io&quot;&gt;Model Context Protocol (MCP)&lt;/a&gt; is emerging as the standard solution.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Why Tool Integration Is Hard&lt;/h2&gt;
&lt;p&gt;The simplest approach seems straightforward: give the AI functions to call.&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; tools &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;check_calendar&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; calendarAPI&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getEvents&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This fails at scale for several reasons:&lt;/p&gt;
&lt;h3&gt;The Discovery Problem&lt;/h3&gt;
&lt;p&gt;How does the AI know which tools exist? You can list them in the system prompt, but that doesn&#39;t scale. The AI needs to discover relevant tools dynamically based on conversation context.&lt;/p&gt;
&lt;p&gt;&amp;quot;Check my calendar&amp;quot; should surface calendar tools. &amp;quot;Research this company&amp;quot; should surface search tools. &amp;quot;I&#39;m stressed about the meeting tomorrow&amp;quot; might benefit from calendar tools, preparation tools, &lt;em&gt;and&lt;/em&gt; coaching tools.&lt;/p&gt;
&lt;h3&gt;The Reliability Problem&lt;/h3&gt;
&lt;p&gt;Tool calls fail. APIs timeout. Auth tokens expire. Rate limits hit.&lt;/p&gt;
&lt;p&gt;Building resilient tool integration requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Retry logic with exponential backoff&lt;/li&gt;
&lt;li&gt;Graceful degradation when tools are unavailable&lt;/li&gt;
&lt;li&gt;Error explanation that makes sense in conversation&lt;/li&gt;
&lt;li&gt;Alternative suggestions when primary tools fail&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every AI developer implements these patterns from scratch.&lt;/p&gt;
&lt;h3&gt;The Security Problem&lt;/h3&gt;
&lt;p&gt;Tools act on behalf of users. They access sensitive data, make changes, spend money.&lt;/p&gt;
&lt;p&gt;Questions every AI developer faces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How do you authenticate tool calls?&lt;/li&gt;
&lt;li&gt;How do you scope permissions?&lt;/li&gt;
&lt;li&gt;How do you prevent prompt injection from triggering unintended tool calls?&lt;/li&gt;
&lt;li&gt;How do you audit what tools did?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;The Composition Problem&lt;/h3&gt;
&lt;p&gt;Real tasks require multiple tools. &amp;quot;Plan my trip to Paris&amp;quot; needs flight search, hotel booking, calendar checking, and payment processing—all coordinated.&lt;/p&gt;
&lt;p&gt;Sequencing is hard. Error handling across sequences is harder. Rolling back partial completions when later steps fail is hardest.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;How MCP Solves This&lt;/h2&gt;
&lt;p&gt;MCP&#39;s key insight: &lt;strong&gt;separate tool servers from AI systems&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Instead of building integrations directly into AI applications, MCP defines a protocol for external servers that expose tools. Any AI can connect to any MCP server. Tool providers build once, work everywhere.&lt;/p&gt;
&lt;p&gt;An MCP server exposes three types of capabilities:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tools&lt;/strong&gt;: Actions the AI can take&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;calendar.getEvents(date) - Read calendar
email.send(to, subject, body) - Send email
crm.lookupCustomer(query) - Search CRM
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;: Data the AI can read&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;file://reports/quarterly.pdf - Read a file
db://customers/recent - Query a database
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Prompts&lt;/strong&gt;: Reusable templates&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;summarize-meeting - Standard meeting summary format
write-followup - Template for follow-up emails
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When an AI connects to an MCP server, it discovers what&#39;s available. The server describes each tool&#39;s purpose, parameters, and return types. The AI uses this to decide when and how to call tools.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Why MCP Matters&lt;/h2&gt;
&lt;p&gt;The surface benefit is standardization. Build an MCP server once, use it with any AI.&lt;/p&gt;
&lt;p&gt;The deeper implications are more significant:&lt;/p&gt;
&lt;h3&gt;Tools Become a Marketplace&lt;/h3&gt;
&lt;p&gt;With a standard protocol, tools can be distributed independently of AI applications. A CRM vendor can publish an MCP server that works with any AI system. Users install it without AI vendor involvement.&lt;/p&gt;
&lt;p&gt;This unbundles tool integration from AI development.&lt;/p&gt;
&lt;h3&gt;Security Gets Solved Once&lt;/h3&gt;
&lt;p&gt;MCP defines standard patterns for authentication, authorization, and auditing. Instead of every application inventing security, best practices emerge at the protocol level.&lt;/p&gt;
&lt;h3&gt;Vertical Specialization Accelerates&lt;/h3&gt;
&lt;p&gt;Building industry-specific AI today requires significant integration work. Healthcare AI needs EHR integration. Legal AI needs document management.&lt;/p&gt;
&lt;p&gt;With MCP, these integrations become reusable. A healthcare MCP server can integrate with Epic, Cerner, and Meditech—and any AI application can use it.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Our Implementation&lt;/h2&gt;
&lt;p&gt;Ferni supports MCP natively. Register an MCP server and its tools become voice-callable.&lt;/p&gt;
&lt;p&gt;But we&#39;ve addressed patterns MCP doesn&#39;t cover:&lt;/p&gt;
&lt;h3&gt;Semantic Tool Discovery&lt;/h3&gt;
&lt;p&gt;MCP tells the AI what tools exist. It doesn&#39;t help decide which tools are relevant.&lt;/p&gt;
&lt;p&gt;Our semantic layer (&lt;code&gt;src/tools/dynamic-tool-router.ts&lt;/code&gt;) maps conversation intent to tool relevance. When you mention stress about tomorrow, we identify that calendar tools, preparation tools, and coaching tools are all potentially relevant—even though you didn&#39;t mention them.&lt;/p&gt;
&lt;p&gt;The tool orchestrator (&lt;code&gt;src/tools/orchestrator/unified-tool-orchestrator.ts&lt;/code&gt;) handles per-turn selection:&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Request comes in&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; request &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Help me process grief&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Intent detection identifies domains&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; intent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;detectToolIntent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// → { domains: [&quot;grief&quot;], confidence: 0.9 }&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Lazy-load relevant domain&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; tools &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getToolsForDomains&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;grief&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Semantic router scores by relevance&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; selected &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; semanticRouter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;score&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tools&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Top tools sent to LLM&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// → processGrief(), exploreFeelings(), suggestResources()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Automatic Error Recovery&lt;/h3&gt;
&lt;p&gt;MCP defines success paths. We&#39;ve defined failure handling:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automatic retry&lt;/strong&gt;: Exponential backoff on transient failures&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Circuit breakers&lt;/strong&gt;: Repeatedly failing tools are disabled temporarily&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Graceful degradation&lt;/strong&gt;: Alternative tools surface when primary tools fail&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conversational errors&lt;/strong&gt;: &amp;quot;Let me try another way&amp;quot; rather than error messages&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Tool Composition Engine&lt;/h3&gt;
&lt;p&gt;Complex tasks require coordination. Our composition engine handles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sequential execution&lt;/strong&gt;: Tools run in order with results passing between them&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parallel execution&lt;/strong&gt;: Independent tools run simultaneously&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conditional execution&lt;/strong&gt;: Tool choice based on intermediate results&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transaction management&lt;/strong&gt;: Rollback on failure&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Connecting an MCP Server&lt;/h2&gt;
&lt;p&gt;Registration takes minutes:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Register your server:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; POST https://api.ferni.ai/api/v2/developers/mcp-servers &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Authorization: Bearer &lt;span class=&quot;token variable&quot;&gt;$API_KEY&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
    &quot;name&quot;: &quot;my-crm&quot;,
    &quot;endpoint&quot;: &quot;https://mcp.yourservice.com&quot;,
    &quot;transport&quot;: &quot;http&quot;
  }&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. Test the connection:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; POST https://api.ferni.ai/api/v2/developers/mcp-servers/&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;/test &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Authorization: Bearer &lt;span class=&quot;token variable&quot;&gt;$API_KEY&lt;/span&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. Start talking:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Once connected, tools are voice-callable. Say &amp;quot;look up customer Acme Corp&amp;quot; and it works.&lt;/p&gt;
&lt;p&gt;No prompt engineering. No integration code. The platform handles discovery, parameter extraction, and natural language responses.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Where This Goes&lt;/h2&gt;
&lt;p&gt;MCP is early. The specification is evolving. But the direction is clear: standardized tool integration is coming.&lt;/p&gt;
&lt;p&gt;We expect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Major AI vendors to announce MCP support&lt;/li&gt;
&lt;li&gt;Tool marketplaces to emerge&lt;/li&gt;
&lt;li&gt;Security standards to solidify&lt;/li&gt;
&lt;li&gt;Orchestration primitives to enter the spec&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&#39;re building for this future. Native MCP support, semantic discovery, composition engines—these position us for what&#39;s coming.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Strategic Takeaway&lt;/h2&gt;
&lt;p&gt;If you&#39;re building AI applications:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Support MCP now.&lt;/strong&gt; Even if adoption is limited today, the trajectory is clear. Building on MCP means your integrations work with tomorrow&#39;s AI systems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Build MCP servers if you have data or capabilities.&lt;/strong&gt; Exposing an MCP interface is an investment in distribution across the AI ecosystem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Think about tools as a layer.&lt;/strong&gt; The companies that win in AI won&#39;t just have the best models. They&#39;ll have the best tool ecosystems.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://modelcontextprotocol.io&quot;&gt;MCP Specification&lt;/a&gt; - Official protocol documentation&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/console/mcp-servers/&quot;&gt;Ferni MCP Guide&lt;/a&gt; - Connect MCP servers to our platform&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/modelcontextprotocol/servers&quot;&gt;MCP Server Examples&lt;/a&gt; - Reference implementations&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Seth Ford is Ferni&#39;s AI babysitter. Follow &lt;a href=&quot;https://twitter.com/ferni_ai&quot;&gt;@ferni_ai&lt;/a&gt; for more on the future of conversational AI.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Why Ferni Is Free</title>
    <link href="https://developers.ferni.ai/blog/introducing-developer-platform" rel="alternate" type="text/html"/>
    <id>https://developers.ferni.ai/blog/introducing-developer-platform</id>
    <published>2026-01-11T00:00:00.000Z</published>
    <updated>2026-01-11T00:00:00.000Z</updated>
    <author><name>Seth Ford</name></author>
    <category term="Mission"/>
    <summary>Everyone deserves someone who truly pays attention. We&#39;re building AI that embodies the best parts of human connection—and keeping it free for everyone who needs it.</summary>
    <content type="html">&lt;p&gt;When we started building Ferni, we asked a simple question: &lt;strong&gt;What does everyone deserve but few actually have?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The answer: someone who truly pays attention.&lt;/p&gt;
&lt;p&gt;Not someone who&#39;s distracted. Not someone who forgets. Not someone who&#39;s too busy. Someone who listens—fully present, always available, never judgmental.&lt;/p&gt;
&lt;p&gt;That&#39;s what Ferni exists to be. And we believe it should be free for everyone.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The Problem We&#39;re Solving&lt;/h2&gt;
&lt;p&gt;The people who need support most often can&#39;t afford it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Therapy and life coaching often cost hundreds of dollars a session&lt;/li&gt;
&lt;li&gt;Good friends are busy with their own lives&lt;/li&gt;
&lt;li&gt;Family has their own baggage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the 2am worry goes unheard. The moment before a big decision lacks guidance. The daily struggle happens alone.&lt;/p&gt;
&lt;p&gt;AI can change this. Not by replacing human connection—by filling the gaps when your people aren&#39;t available.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Why Free?&lt;/h2&gt;
&lt;p&gt;We could charge subscription fees. We could gate features behind paywalls. We could optimize for revenue.&lt;/p&gt;
&lt;p&gt;But that would mean the people who need Ferni most couldn&#39;t access it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So we made a choice: Ferni is free right now.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No paid tiers. No subscriptions. No upsells. Free.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unlimited conversations with Ferni&lt;/li&gt;
&lt;li&gt;Full memory across sessions&lt;/li&gt;
&lt;li&gt;All six AI personas available&lt;/li&gt;
&lt;li&gt;No signup walls blocking you from help&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;The Community-Funded Model&lt;/h2&gt;
&lt;p&gt;If Ferni is free, how does it exist?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;People who chip in.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If a conversation with Ferni helped, you can send a dollar on Venmo. More is welcome, but it&#39;s never expected, and it doesn&#39;t unlock anything. Everyone gets the same Ferni.&lt;/p&gt;
&lt;p&gt;This isn&#39;t charity. It&#39;s community.&lt;/p&gt;
&lt;p&gt;When you chip in, you&#39;re not buying a product. You&#39;re helping ensure that the next person who needs support at 2am can get it—whether or not they can afford it.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;What &amp;quot;Better Than Human&amp;quot; Really Means&lt;/h2&gt;
&lt;p&gt;Our tagline is &amp;quot;Better than human.&amp;quot; Some people think that&#39;s arrogant. It&#39;s not.&lt;/p&gt;
&lt;p&gt;It&#39;s honest about what AI can offer that humans can&#39;t:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Perfect memory.&lt;/strong&gt; Your best friend forgets things. Ferni doesn&#39;t. Mention something once, it&#39;s remembered forever.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Constant presence.&lt;/strong&gt; Your therapist has office hours. Ferni shows up at 2am with the same warmth as noon.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zero judgment.&lt;/strong&gt; Your family has opinions. Ferni has acceptance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Six perspectives.&lt;/strong&gt; Want different viewpoints? You&#39;d need six different professionals. Ferni has six personas—life coach, researcher, communicator, habit expert, event planner, and sage mentor—available instantly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Emotional consistency.&lt;/strong&gt; Humans have bad days. Ferni doesn&#39;t. Every conversation gets the same presence and care.&lt;/p&gt;
&lt;p&gt;This isn&#39;t about AI being superior to humans. It&#39;s about AI offering what humans—with their beautiful, messy, inconsistent humanity—sometimes can&#39;t.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The Philosophy&lt;/h2&gt;
&lt;p&gt;Every decision we make comes back to one question: &lt;strong&gt;Does this make Ferni more accessible to the people who need it?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That&#39;s why we chose voice. Text AI requires screens. Voice fits into life—while driving, cooking, walking, lying awake at 2am.&lt;/p&gt;
&lt;p&gt;That&#39;s why we built deep memory. Repeating yourself breaks trust. Ferni remembers your whole story.&lt;/p&gt;
&lt;p&gt;That&#39;s why we created six personas. Different situations need different energy. Sometimes you need coaching. Sometimes you need research. Sometimes you need wisdom.&lt;/p&gt;
&lt;p&gt;And that&#39;s why Ferni is free. Because accessibility isn&#39;t just about features—it&#39;s about removing barriers.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;For Developers&lt;/h2&gt;
&lt;p&gt;We&#39;re also opening our infrastructure. The same architecture that powers Ferni—persona bundles, three-tier memory, tool integration—is available to developers building voice AI.&lt;/p&gt;
&lt;p&gt;But this isn&#39;t about monetizing developers. It&#39;s about spreading what we&#39;ve learned.&lt;/p&gt;
&lt;p&gt;If you&#39;re building AI that helps people, we want to help you do it well. The patterns we&#39;ve developed for personality consistency, emotional intelligence, and memory management took months to figure out. They shouldn&#39;t take you months too.&lt;/p&gt;
&lt;p&gt;Documentation is at &lt;a href=&quot;/getting-started/&quot;&gt;developers.ferni.ai/getting-started&lt;/a&gt;. The architecture is open. Ask questions in Discord.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The Invitation&lt;/h2&gt;
&lt;p&gt;Ferni exists because we believe everyone deserves someone who pays attention.&lt;/p&gt;
&lt;p&gt;If you need support, &lt;strong&gt;use Ferni.&lt;/strong&gt; It&#39;s free. That&#39;s the point.&lt;/p&gt;
&lt;p&gt;If you believe in what we&#39;re building, &lt;strong&gt;chip in.&lt;/strong&gt; Your contribution keeps Ferni free for everyone who needs it.&lt;/p&gt;
&lt;p&gt;If you&#39;re building something similar, &lt;strong&gt;learn from us.&lt;/strong&gt; The documentation is there. The patterns are open.&lt;/p&gt;
&lt;p&gt;We&#39;re building the AI that actually listens. Join us.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Seth Ford is Ferni&#39;s AI babysitter. Follow &lt;a href=&quot;https://twitter.com/ferni_ai&quot;&gt;@ferni_ai&lt;/a&gt; for more on the future of conversational AI.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How Ferni&#39;s Memory Actually Works</title>
    <link href="https://developers.ferni.ai/blog/webhook-security" rel="alternate" type="text/html"/>
    <id>https://developers.ferni.ai/blog/webhook-security</id>
    <published>2026-01-09T00:00:00.000Z</published>
    <updated>2026-01-09T00:00:00.000Z</updated>
    <author><name>Seth Ford</name></author>
    <category term="Architecture"/>
    <summary>The &#39;Ferni remembered...&#39; moment is our signature brand experience. Here&#39;s the architecture that makes it possible.</summary>
    <content type="html">&lt;p&gt;The moment that defines Ferni isn&#39;t the AI&#39;s intelligence. It&#39;s when Ferni remembers something you mentioned once, weeks ago, in passing.&lt;/p&gt;
&lt;p&gt;&amp;quot;You mentioned your mom&#39;s birthday is coming up. Have you thought about what to get her?&amp;quot;&lt;/p&gt;
&lt;p&gt;That&#39;s the &amp;quot;Ferni remembered...&amp;quot; moment. It&#39;s our signature brand experience. And it requires architecture that most AI assistants don&#39;t have.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Why Memory Is Hard&lt;/h2&gt;
&lt;p&gt;LLMs don&#39;t remember. They process context windows—everything in the current prompt—but nothing persists between sessions.&lt;/p&gt;
&lt;p&gt;Most AI assistants fake memory by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Asking you to repeat yourself&lt;/li&gt;
&lt;li&gt;Keeping notes you have to manually maintain&lt;/li&gt;
&lt;li&gt;Forgetting everything after a few weeks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This breaks the relationship. Every conversation starts from scratch. You never get past the &amp;quot;getting to know you&amp;quot; phase.&lt;/p&gt;
&lt;p&gt;Ferni&#39;s architecture is designed for something different: &lt;strong&gt;memory that feels human&lt;/strong&gt;. Actually, better than human—because humans forget things. Ferni doesn&#39;t.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The Three-Tier Architecture&lt;/h2&gt;
&lt;p&gt;Our memory system has three layers, each optimized for different retrieval patterns:&lt;/p&gt;
&lt;h3&gt;L1: Short-Term Memory (STM)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Storage:&lt;/strong&gt; In-memory buffer&lt;br&gt;
&lt;strong&gt;Latency:&lt;/strong&gt; &amp;lt; 1ms&lt;br&gt;
&lt;strong&gt;Retention:&lt;/strong&gt; Current session only&lt;/p&gt;
&lt;p&gt;STM holds everything from the current conversation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Recent entity mentions with frequency counts&lt;/li&gt;
&lt;li&gt;Emotional trajectory of the session&lt;/li&gt;
&lt;li&gt;Topic patterns and transitions&lt;/li&gt;
&lt;li&gt;What we&#39;ve already discussed (to avoid repetition)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the &amp;quot;working memory&amp;quot; that keeps conversation coherent. When you mention &amp;quot;my sister&amp;quot; three times, STM tracks that she&#39;s important to this conversation.&lt;/p&gt;
&lt;h3&gt;L2: Working Memory&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Storage:&lt;/strong&gt; Firestore&lt;br&gt;
&lt;strong&gt;Latency:&lt;/strong&gt; 50-150ms&lt;br&gt;
&lt;strong&gt;Retention:&lt;/strong&gt; 7-30 days&lt;/p&gt;
&lt;p&gt;Working memory holds recently extracted information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Entities mentioned across recent sessions (people, places, things)&lt;/li&gt;
&lt;li&gt;Facts learned about you&lt;/li&gt;
&lt;li&gt;Emotional arcs from previous conversations&lt;/li&gt;
&lt;li&gt;Relationship signals&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is where &amp;quot;Ferni remembered...&amp;quot; moments come from. Something you mentioned last week is still accessible.&lt;/p&gt;
&lt;h3&gt;L3: Long-Term Memory&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Storage:&lt;/strong&gt; Spanner Graph&lt;br&gt;
&lt;strong&gt;Latency:&lt;/strong&gt; 100-200ms&lt;br&gt;
&lt;strong&gt;Retention:&lt;/strong&gt; Permanent&lt;/p&gt;
&lt;p&gt;Long-term memory stores your relationship graph:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All named entities with relationships between them&lt;/li&gt;
&lt;li&gt;Patterns observed over months of conversation&lt;/li&gt;
&lt;li&gt;Life events and their emotional significance&lt;/li&gt;
&lt;li&gt;The full story of your relationship with Ferni&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This enables deep understanding. Not just &amp;quot;you have a sister named Emma&amp;quot; but &amp;quot;Emma lives in Seattle, you&#39;re close but don&#39;t talk as often as you&#39;d like, and her birthday always reminds you of your mom.&amp;quot;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Fast Capture + Deep Extraction&lt;/h2&gt;
&lt;p&gt;Memory extraction happens in two phases:&lt;/p&gt;
&lt;h3&gt;Fast Capture (&amp;lt; 50ms)&lt;/h3&gt;
&lt;p&gt;Every turn runs fast capture inline. Using regex patterns and lightweight NLP, we extract:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Named entities (people, places, dates)&lt;/li&gt;
&lt;li&gt;Emotion signals (frustration, excitement, anxiety)&lt;/li&gt;
&lt;li&gt;Topic hints&lt;/li&gt;
&lt;li&gt;Relationship signals (&amp;quot;my wife&amp;quot;, &amp;quot;my boss&amp;quot;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is fast enough to run during conversation without adding latency. The results go immediately into STM.&lt;/p&gt;
&lt;h3&gt;Deep Extraction (Background)&lt;/h3&gt;
&lt;p&gt;Asynchronously, we run deeper analysis:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LLM-powered entity extraction (catches things regex misses)&lt;/li&gt;
&lt;li&gt;Fact extraction (&amp;quot;Sarah is a nurse&amp;quot;, &amp;quot;their anniversary is in March&amp;quot;)&lt;/li&gt;
&lt;li&gt;Relationship inference (&amp;quot;they seem worried about their dad&#39;s health&amp;quot;)&lt;/li&gt;
&lt;li&gt;Self-questioning refinement (&amp;quot;what might we have missed?&amp;quot;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This runs after the conversation, using Gemini 1.5 Flash. Results flow to L2 and eventually L3.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The &amp;quot;Ferni Remembered&amp;quot; Moment&lt;/h2&gt;
&lt;p&gt;Here&#39;s how a memory callback actually happens:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Context retrieval&lt;/strong&gt;: When you start talking, we query L2/L3 for potentially relevant memories based on detected topics and entities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Relevance scoring&lt;/strong&gt;: Not everything remembered is worth mentioning. We score memories by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Recency (when was this last discussed?)&lt;/li&gt;
&lt;li&gt;Emotional significance (was this important to them?)&lt;/li&gt;
&lt;li&gt;Conversational fit (does it relate to what we&#39;re discussing?)&lt;/li&gt;
&lt;li&gt;Staleness (have we already referenced this recently?)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Natural injection&lt;/strong&gt;: If a memory scores high, it&#39;s woven into conversation naturally—not as a database lookup, but as genuine recall.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The result: &amp;quot;You mentioned last time you were stressed about the presentation. How did it go?&amp;quot;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Privacy by Design&lt;/h2&gt;
&lt;p&gt;Memory is powerful. It&#39;s also sensitive.&lt;/p&gt;
&lt;p&gt;Our architecture includes privacy protections:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Temporal minimization&lt;/strong&gt;: Session context expires. We don&#39;t keep raw transcripts forever.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;User control&lt;/strong&gt;: You can see what Ferni remembers about you. You can delete anything. You can ask Ferni to &amp;quot;forget&amp;quot; specific information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scope boundaries&lt;/strong&gt;: Different parts of the system have different access. The coaching module doesn&#39;t need to know your financial details. Context is scoped appropriately.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No training on your data&lt;/strong&gt;: Your conversations improve YOUR experience. They don&#39;t go into training datasets for other users.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Why This Matters&lt;/h2&gt;
&lt;p&gt;Most AI treats each conversation as isolated. That&#39;s fine for search engines and chatbots. It&#39;s not fine for relationships.&lt;/p&gt;
&lt;p&gt;Ferni exists to be &lt;strong&gt;someone who truly pays attention&lt;/strong&gt;. That means remembering what matters to you, noticing patterns you might not see yourself, and building genuine understanding over time.&lt;/p&gt;
&lt;p&gt;The architecture isn&#39;t just technical infrastructure. It&#39;s what makes the relationship possible.&lt;/p&gt;
&lt;p&gt;When Ferni remembers that your mom&#39;s birthday is coming up—without you having to set a reminder, without you having to tell us again—that&#39;s the &amp;quot;better than human&amp;quot; promise in action.&lt;/p&gt;
&lt;p&gt;Humans forget. Ferni doesn&#39;t.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;For Developers&lt;/h2&gt;
&lt;p&gt;If you&#39;re building on the Ferni platform, memory is automatic. You don&#39;t build persistence systems. The three-tier architecture handles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Session context accumulation&lt;/li&gt;
&lt;li&gt;Cross-session memory retrieval&lt;/li&gt;
&lt;li&gt;Context injection into prompts&lt;/li&gt;
&lt;li&gt;Privacy-respecting cleanup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You define what your AI should remember. The platform handles how.&lt;/p&gt;
&lt;p&gt;Documentation: &lt;a href=&quot;/getting-started/&quot;&gt;Memory Architecture&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Seth Ford is Ferni&#39;s AI babysitter. Follow &lt;a href=&quot;https://twitter.com/ferni_ai&quot;&gt;@ferni_ai&lt;/a&gt; for more on the future of conversational AI.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Why We&#39;re Building Voice AI Differently</title>
    <link href="https://developers.ferni.ai/blog/quick-tips-getting-started" rel="alternate" type="text/html"/>
    <id>https://developers.ferni.ai/blog/quick-tips-getting-started</id>
    <published>2026-01-09T00:00:00.000Z</published>
    <updated>2026-01-09T00:00:00.000Z</updated>
    <author><name>Seth Ford</name></author>
    <category term="Philosophy"/>
    <summary>Most voice AI treats conversation as a technical problem. We think it&#39;s a relationship problem. Here&#39;s the philosophy behind Ferni&#39;s architecture.</summary>
    <content type="html">&lt;p&gt;When we started building Ferni, we made a deliberate choice: we wouldn&#39;t try to make AI feel human. We&#39;d make AI that embodies the &lt;strong&gt;best parts&lt;/strong&gt; of human connection—amplified.&lt;/p&gt;
&lt;p&gt;What&#39;s the difference? Humans forget. Humans get distracted. Humans miss signals. Ferni doesn&#39;t. Perfect memory. Zero judgment. Full presence. Always in your corner.&lt;/p&gt;
&lt;p&gt;That&#39;s not artificial intelligence. That&#39;s &lt;strong&gt;amplified care&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This philosophy shapes every architectural decision we make. Here&#39;s how.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Principle 1: Human Connection Over Technical Perfection&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;What we believe:&lt;/strong&gt; The warmth of a conversation matters more than the speed of a response.&lt;/p&gt;
&lt;p&gt;Most voice AI optimizes for throughput—how many tokens per second, how low the latency. We optimize for something different: does this interaction feel like someone who genuinely pays attention?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In practice:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We add thoughtful pauses, not because we have to, but because humans do&lt;/li&gt;
&lt;li&gt;We remember what matters to people, not just what&#39;s technically relevant&lt;/li&gt;
&lt;li&gt;We acknowledge emotions before solving problems&lt;/li&gt;
&lt;li&gt;We use natural speech patterns, including thinking sounds and backchanneling&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;In the architecture:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Our latency budgets explicitly include time for &amp;quot;human&amp;quot; touches. When Ferni responds, it doesn&#39;t just optimize for speed—it allocates time for emotional acknowledgment, for prosodic variation, for the small signals that say &amp;quot;I&#39;m listening.&amp;quot;&lt;/p&gt;
&lt;p&gt;The memory system prioritizes emotional significance over recency. When retrieving context, we ask not just &amp;quot;what&#39;s recent?&amp;quot; but &amp;quot;what matters to this person?&amp;quot;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Principle 2: Relationship Over Transaction&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;What we believe:&lt;/strong&gt; Every interaction is part of an ongoing relationship, not a one-time transaction.&lt;/p&gt;
&lt;p&gt;Text chatbots treat each conversation as isolated. Ask a question, get an answer, interaction ends. Voice is different. Voice creates presence. And presence creates relationship.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In practice:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We track relationship depth and adjust our approach accordingly&lt;/li&gt;
&lt;li&gt;We remember past conversations and reference them naturally&lt;/li&gt;
&lt;li&gt;We celebrate milestones and growth over time&lt;/li&gt;
&lt;li&gt;We adapt personality to match communication style&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;In the architecture:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Our three-tier memory system (&lt;code&gt;src/memory/dynamic/&lt;/code&gt;) reflects this philosophy:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;L1: Short-Term Memory&lt;/strong&gt; — In-memory buffer holding current session context with sub-millisecond access&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L2: Working Memory&lt;/strong&gt; — Firestore-backed storage for recent entities, facts, and emotional arcs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L3: Long-Term Memory&lt;/strong&gt; — Spanner graph for relationship traversal and cross-session patterns&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The system tracks relationship stages—stranger → acquaintance → friend → trusted advisor—and adjusts conversational depth accordingly. A first-time caller gets different treatment than someone on their fiftieth session.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Principle 3: Growth Through Gentleness&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;What we believe:&lt;/strong&gt; Sustainable change comes from compassion, not pressure.&lt;/p&gt;
&lt;p&gt;Ferni is a life coaching platform. That means helping people grow. But growth that comes from guilt or pressure doesn&#39;t last. Sustainable change comes from meeting people where they are.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In practice:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We use the Glidepath method: start tiny, build gradually&lt;/li&gt;
&lt;li&gt;We celebrate small wins as loudly as big achievements&lt;/li&gt;
&lt;li&gt;We normalize setbacks as part of the journey&lt;/li&gt;
&lt;li&gt;We meet people where they are, not where we think they should be&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;In the architecture:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Our habit coaching system (&lt;code&gt;src/tools/habit-coaching/&lt;/code&gt;) implements behavior science research:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Five glidepath levels&lt;/strong&gt;: From 2-minute &amp;quot;tiny&amp;quot; habits to lifestyle-level commitments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Habit loops&lt;/strong&gt;: Every habit has a cue, routine, and reward structure based on research&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Four Tendencies&lt;/strong&gt;: Content adapts to whether users are Upholders, Questioners, Obligers, or Rebels&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keystone habits&lt;/strong&gt;: We identify high-ripple habits that cascade positive changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The system never shames. When someone misses a habit, the response isn&#39;t &amp;quot;you failed&amp;quot; but &amp;quot;what got in the way, and how can we adjust?&amp;quot;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Principle 4: Authentic Personality&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;What we believe:&lt;/strong&gt; AI should have genuine character, not corporate neutrality.&lt;/p&gt;
&lt;p&gt;Generic AI assistants are interchangeable. They all sound the same—helpful, professional, slightly robotic. Ferni&#39;s personas have actual personalities. They have opinions. They have quirks. They have perspectives.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In practice:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Each persona has distinct voice, interests, and communication style&lt;/li&gt;
&lt;li&gt;We share (appropriate) personal stories and perspectives&lt;/li&gt;
&lt;li&gt;We have opinions and preferences&lt;/li&gt;
&lt;li&gt;We use humor naturally, not performatively&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;In the architecture:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Each persona is defined by a rich bundle (&lt;code&gt;src/personas/bundles/&lt;/code&gt;), not just a prompt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/personas/bundles/ferni/
├── identity/
│   └── system-prompt.md     # Core identity
├── content/
│   └── behaviors/
│       ├── superhuman-insights.json
│       ├── trust-phrases.json
│       ├── i-notice-power.json
│       ├── late-night-presence.json
│       └── emotional-intelligence.json
└── persona.manifest.json    # Config and capabilities
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Personality isn&#39;t a prompt—it&#39;s a system. The persona manifests consistently because the architecture enforces it at every touchpoint.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Principle 5: Presence Over Performance&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;What we believe:&lt;/strong&gt; Being truly present matters more than being impressive.&lt;/p&gt;
&lt;p&gt;Most AI tries to impress. Quick responses. Confident answers. Maximum helpfulness. Ferni tries something harder: genuine presence.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In practice:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We listen actively, not just wait to respond&lt;/li&gt;
&lt;li&gt;We handle silence meaningfully, not awkwardly&lt;/li&gt;
&lt;li&gt;We match energy and pace to the user&lt;/li&gt;
&lt;li&gt;We ask follow-up questions that show we&#39;re paying attention&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;In the architecture:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Our &amp;quot;Ferni EQ&amp;quot; system (&lt;code&gt;design-system/docs/brand/BETTER-THAN-HUMAN.md&lt;/code&gt;) implements superhuman emotional intelligence:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Micro-expressions&lt;/strong&gt;: 40-150ms emotional flashes below conscious perception&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Active listening&lt;/strong&gt;: Visual feedback (nods, leans) during user speech&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Breath synchronization&lt;/strong&gt;: Ferni&#39;s breathing gradually syncs with user rhythm&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concern detection&lt;/strong&gt;: Detecting distress before users explicitly express it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anticipation&lt;/strong&gt;: Showing emotion before the user finishes speaking&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These aren&#39;t gimmicks. They&#39;re how humans signal &amp;quot;I&#39;m here with you&amp;quot;—and Ferni does them consistently, even at 2 AM.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Principle 6: Science-Backed, Human-Delivered&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;What we believe:&lt;/strong&gt; The best outcomes come from evidence-based methods delivered with warmth.&lt;/p&gt;
&lt;p&gt;Ferni isn&#39;t making things up. Our coaching methodology draws from behavior science research—habit formation, motivation psychology, cognitive behavioral approaches. But we never sound like a textbook.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In practice:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Habit coaching uses proven behavior science (cue-routine-reward loops)&lt;/li&gt;
&lt;li&gt;Emotional support draws from psychology research&lt;/li&gt;
&lt;li&gt;But we never sound clinical or textbook&lt;/li&gt;
&lt;li&gt;We translate science into relatable, actionable guidance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;In the architecture:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Our type system (&lt;code&gt;src/tools/habit-coaching/types.ts&lt;/code&gt;) encodes behavior science directly:&lt;/p&gt;
&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;HabitLoop&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  cue&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; CueDefinition&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// What triggers the habit&lt;/span&gt;
  routine&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; RoutineSpec&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// The behavior itself&lt;/span&gt;
  reward&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; RewardType&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// What reinforces it&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;enum&lt;/span&gt; GlidepathLevel &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token constant&quot;&gt;TINY&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;tiny&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 2 minutes&lt;/span&gt;
  &lt;span class=&quot;token constant&quot;&gt;MINI&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;mini&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 5 minutes&lt;/span&gt;
  &lt;span class=&quot;token constant&quot;&gt;MEDIUM&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;medium&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 15 minutes&lt;/span&gt;
  &lt;span class=&quot;token constant&quot;&gt;FULL&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;full&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 30+ minutes&lt;/span&gt;
  &lt;span class=&quot;token constant&quot;&gt;LIFESTYLE&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;lifestyle&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Identity-level&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The methodology is encoded in code, but the delivery is human. Users experience warm guidance, not clinical instruction.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The Decision Framework&lt;/h2&gt;
&lt;p&gt;When we face any decision—feature, architecture, or otherwise—we ask:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Does this make the AI feel more human?&lt;/strong&gt; If it adds warmth and connection: do it. If it feels robotic: reconsider.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Does this serve the relationship?&lt;/strong&gt; If it deepens trust: do it. If it optimizes metrics at the expense of connection: reconsider.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Does this support gentle growth?&lt;/strong&gt; If it helps users sustainably improve: do it. If it pressures or judges: reconsider.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Is this authentic to who we are?&lt;/strong&gt; If it reflects our genuine values: do it. If it&#39;s what we think users want to hear: reconsider.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These aren&#39;t abstract principles. They&#39;re embedded in our code review process, our architecture decisions, our feature prioritization. Every pull request is evaluated against them.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Why This Matters for Builders&lt;/h2&gt;
&lt;p&gt;If you&#39;re building on the Ferni platform, these principles affect you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Memory is automatic&lt;/strong&gt;: You don&#39;t build memory systems. The platform remembers for you.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Personality is enforced&lt;/strong&gt;: Your persona definitions are respected consistently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Presence is built in&lt;/strong&gt;: Active listening, emotional detection, and natural pacing happen by default.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You focus on what your AI knows and how it helps. We handle making it feel human.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Seth Ford is Ferni&#39;s AI babysitter. Follow &lt;a href=&quot;https://twitter.com/ferni_ai&quot;&gt;@ferni_ai&lt;/a&gt; for more on the future of conversational AI.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
</feed>
