<?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: Christian Hayes</title>
    <description>The latest articles on DEV Community by Christian Hayes (@siyajk_e58bfe4ebd656d1885).</description>
    <link>https://dev.to/siyajk_e58bfe4ebd656d1885</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%2F4227014%2Fa6bfde01-0135-48a2-a54c-c7fd38bbe4c9.png</url>
      <title>DEV Community: Christian Hayes</title>
      <link>https://dev.to/siyajk_e58bfe4ebd656d1885</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/siyajk_e58bfe4ebd656d1885"/>
    <language>en</language>
    <item>
      <title>What "free" actually means in AI companion apps (November 2026)</title>
      <dc:creator>Christian Hayes</dc:creator>
      <pubDate>Wed, 04 Nov 2026 18:58:15 +0000</pubDate>
      <link>https://dev.to/siyajk_e58bfe4ebd656d1885/what-free-actually-means-in-ai-companion-apps-november-2026-3kb8</link>
      <guid>https://dev.to/siyajk_e58bfe4ebd656d1885/what-free-actually-means-in-ai-companion-apps-november-2026-3kb8</guid>
      <description>&lt;p&gt;Almost every AI companion app says it's free to start. What that means varies from "chat all day" to "fifty messages, then read-only". I build one of these apps, Calla, so I read the others' pricing pages, help centres and terms closely. Here is what each free plan actually includes, as of late October 2026. Where a number comes only from review sites rather than the company's own pages, it's marked &lt;em&gt;reported&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Relationship apps
&lt;/h2&gt;

&lt;p&gt;These are built around one ongoing relationship with a companion who's meant to know you.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App&lt;/th&gt;
&lt;th&gt;What the free plan includes&lt;/th&gt;
&lt;th&gt;Paid plan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Calla&lt;/td&gt;
&lt;td&gt;50 messages in any 24 hours, memory across sessions, one picture a day, a first voice note, a short call every three days&lt;/td&gt;
&lt;td&gt;$14.99/month (also $79.99/year; first month $4.99)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kindroid&lt;/td&gt;
&lt;td&gt;50 messages in total, 5 selfies in total, then read-only&lt;/td&gt;
&lt;td&gt;about $13.99/month on the web (&lt;em&gt;reported&lt;/em&gt;), $15.99 in the app stores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nomi&lt;/td&gt;
&lt;td&gt;about 50 messages a day, 400-character messages, one companion, about 2 images a day (&lt;em&gt;reported&lt;/em&gt;)&lt;/td&gt;
&lt;td&gt;$15.99/month, $99.99/year&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replika&lt;/td&gt;
&lt;td&gt;a limited model, no voice or selfies&lt;/td&gt;
&lt;td&gt;Pro $19.99/month or $69.99/year&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nectar AI&lt;/td&gt;
&lt;td&gt;15 messages a day, 10 images a day (&lt;em&gt;reported&lt;/em&gt;)&lt;/td&gt;
&lt;td&gt;Premium $9.99/month (&lt;em&gt;reported&lt;/em&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GirlfriendGPT&lt;/td&gt;
&lt;td&gt;20 messages a day, SFW only (&lt;em&gt;reported&lt;/em&gt;)&lt;/td&gt;
&lt;td&gt;about $15 to $50/month in coin bundles (&lt;em&gt;reported&lt;/em&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Candy AI&lt;/td&gt;
&lt;td&gt;a trial; details not published&lt;/td&gt;
&lt;td&gt;$13.99/month list, less on longer terms, plus tokens for media&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Character and roleplay platforms
&lt;/h2&gt;

&lt;p&gt;These give chat away and sell longer context, better models and media.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App&lt;/th&gt;
&lt;th&gt;What the free plan includes&lt;/th&gt;
&lt;th&gt;Paid plan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Janitor AI&lt;/td&gt;
&lt;td&gt;unlimited messages; context of roughly 8 to 9K tokens&lt;/td&gt;
&lt;td&gt;Janitor+ $12.99/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SpicyChat&lt;/td&gt;
&lt;td&gt;100 messages a day, counting both sides of the conversation&lt;/td&gt;
&lt;td&gt;from $5.95/month (&lt;em&gt;reported&lt;/em&gt;, after a September increase)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CrushOn&lt;/td&gt;
&lt;td&gt;50 messages a day&lt;/td&gt;
&lt;td&gt;from $5.99/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chai&lt;/td&gt;
&lt;td&gt;70 messages per 2.5 hours, with ads&lt;/td&gt;
&lt;td&gt;Premium $13.99/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Character.AI&lt;/td&gt;
&lt;td&gt;ads, swipe caps and a slow mode at busy times&lt;/td&gt;
&lt;td&gt;c.ai+ $9.99/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Talkie&lt;/td&gt;
&lt;td&gt;limits plus ads; calls about 2 minutes (&lt;em&gt;reported&lt;/em&gt;)&lt;/td&gt;
&lt;td&gt;Talkie+ $9.99/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What to actually compare
&lt;/h2&gt;

&lt;p&gt;The message count is the obvious number, but three other things decide whether a free plan is usable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Does memory work on the free plan?&lt;/strong&gt; On Kindroid, the free preview goes read-only after 50 messages. On the character platforms, "memory" is mostly how much recent chat fits in the context window, which is smaller on free tiers. A companion that forgets you between sessions is a different product, not a cheaper version of the same one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is the limit per day or per account?&lt;/strong&gt; Fifty a day and fifty in total are very different things a week later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What's metered besides messages?&lt;/strong&gt; Pictures, voice and calls are almost always the first things to cost money. Several apps meter them with tokens or credits that don't map neatly to a monthly price.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The test I'd suggest for any of them: use the free plan for a week, tell your companion something specific with a date attached, close the app, and come back the day after. Whether it knows, and whether it asks, tells you more than any pricing table.&lt;/p&gt;

&lt;p&gt;Prices in this market change monthly. Everything above was read on or around October 20, 2026; check the app's own pricing page before you pay for anything.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Christian, and I build &lt;a href="https://callagf.com/r/devto_free_tiers" rel="noopener noreferrer"&gt;Calla&lt;/a&gt;, an adults-only AI companion. The comparison above includes my own app; I've tried to describe every free plan, Calla's included, as plainly as the companies' own pages allow. Written with help from an AI assistant; every figure comes from the company's own pages or help centre unless it's marked reported.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>ai</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Our AI companion's memory search was upside down for four months, and nothing looked broken</title>
      <dc:creator>Christian Hayes</dc:creator>
      <pubDate>Wed, 04 Nov 2026 18:53:37 +0000</pubDate>
      <link>https://dev.to/siyajk_e58bfe4ebd656d1885/our-ai-companions-memory-search-was-upside-down-for-four-months-and-nothing-looked-broken-1073</link>
      <guid>https://dev.to/siyajk_e58bfe4ebd656d1885/our-ai-companions-memory-search-was-upside-down-for-four-months-and-nothing-looked-broken-1073</guid>
      <description>&lt;p&gt;I build Calla, an AI companion app whose whole pitch is memory: you tell it about your week, close the app, and the next day it still knows your name, your job and the people in your life. For about four months, the part of the system that finds the right memory at the right moment was returning the &lt;em&gt;least&lt;/em&gt; relevant memories first. Nobody noticed, including me. Here is how that happens, and what I'd tell anyone building long-term memory for an LLM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory is three problems, not one
&lt;/h2&gt;

&lt;p&gt;"The bot remembers what I said ten minutes ago" says almost nothing. That's the context window: a rolling buffer the model can see. Close the app and many products start the next session with an empty one.&lt;/p&gt;

&lt;p&gt;Real long-term memory is three separate jobs, and each can fail quietly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Keeping.&lt;/strong&gt; After a conversation, something reads it back and decides what was worth remembering. We store short episode summaries ("they're nervous about Thursday's interview; their manager has been difficult since the reorg") plus a few structured facts that changed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finding.&lt;/strong&gt; When a new message arrives, the system searches everything it kept and pulls back the handful that matter right now. That's usually vector search over embeddings, so "my sister" can find the episode about the wedding speech even if you never say "wedding".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bringing it up.&lt;/strong&gt; Knowing your sister's name is different from asking, the day after, how the speech went. That needs open loops tracked until they've actually happened.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Our bug lived in step 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  How an inverted search hides
&lt;/h2&gt;

&lt;p&gt;We used an open-source memory layer for the episode store. Its search returned a score with each hit, and our code treated that score as similarity: higher is better, keep the top few. The store was actually returning a &lt;em&gt;distance&lt;/em&gt;: lower is better. So every lookup sorted the memories backwards and kept the least related ones.&lt;/p&gt;

&lt;p&gt;Why didn't anything look broken?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Every result was still a real memory about the right person.&lt;/strong&gt; The companion never said anything false; it just pulled up something about a different week. That reads as "a bit vague", not "broken".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The fact store hid it.&lt;/strong&gt; Names, jobs and pets live in a separate structured profile that goes into every prompt. The obvious tests ("what's my name?") passed every time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logs looked healthy.&lt;/strong&gt; Searches returned results, latency was fine, no exceptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It took a direct test to find it: store one very specific fact, ask about it later in different words, and print what the search &lt;em&gt;actually&lt;/em&gt; returned, not what the companion said. The top hit was unrelated; the right memory sat near the bottom.&lt;/p&gt;

&lt;p&gt;The fix was small. We stopped going through the library's search and wrote the SQL ourselves (pgvector, cosine distance, &lt;code&gt;ORDER BY distance ASC&lt;/code&gt;, with the ordering asserted in a test that uses a known-near and a known-far memory). We also moved recall off the hot path: the next turn's candidate memories are prepared while the current reply is being written, which took memory lookup from about 1.4 seconds per message to under 0.1.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd tell anyone building this
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Test the judgment, not the plumbing.&lt;/strong&gt; "Search returns results in 40 ms" is plumbing. "Search returns &lt;em&gt;the right&lt;/em&gt; result" is the feature. Build the second test first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the sign of every score you didn't write.&lt;/strong&gt; Similarity and distance look identical in a log line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the fact store and the episode store testable separately.&lt;/strong&gt; A good profile can mask a broken episode search indefinitely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use a fixed test the user could run.&lt;/strong&gt; Ours: mention something with a date attached, close the app, come back the day after, and see whether it knows and whether it asks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last test is also how I'd tell anyone to choose an AI companion. Ignore the marketing (mine included) and run it for a week. Knowing is now fairly common. Asking at the right moment, unprompted, is the hard part, and it's still where this whole category, us included, has the most work to do.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Christian, and I build &lt;a href="https://callagf.com/r/devto_memory_bug" rel="noopener noreferrer"&gt;Calla&lt;/a&gt;, an adults-only AI companion with memory on the free plan (50 messages a day; Calla+ is $14.99/month). This post was written with help from an AI assistant and checked by me against our code and commit history.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
    </item>
  </channel>
</rss>
