<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Sms App on ErrorZap</title><link>https://errorzap.com/tags/sms-app/</link><description>Recent content in Sms App on ErrorZap</description><image><title>ErrorZap</title><url>https://errorzap.com/og.png</url><link>https://errorzap.com/og.png</link></image><generator>Hugo</generator><language>en-US</language><copyright>ErrorZap</copyright><lastBuildDate>Fri, 02 Oct 2026 23:36:00 -0600</lastBuildDate><atom:link href="https://errorzap.com/tags/sms-app/index.xml" rel="self" type="application/rss+xml"/><item><title>Making It Mine</title><link>https://errorzap.com/texting/making-it-mine/</link><pubDate>Fri, 02 Oct 2026 23:36:00 -0600</pubDate><guid>https://errorzap.com/texting/making-it-mine/</guid><description>Version 0.3 of the KCCS Text app added the things no off-the-shelf texting app would give me: per-contact sounds, nagging reminders, quiet hours, VIPs, a desktop page and business voicemail.</description><content:encoded><![CDATA[<div class="ez-dossier-lede"><span>MY OWN TEXTING · MESSAGE 06 · THE GOOD PART</span><p>Once it's your app, "I wish it could…" stops being a complaint and turns into a to-do item.</p></div>
<h2 id="version-03-the-same-night">Version 0.3, the same night</h2>
<p>Version 0.2 went live at 6:27 PM on September 23. Version 0.3 went live at 7:38 PM.
That hour was mostly testing, because the features had been built that afternoon
alongside everything else. Here&rsquo;s what I got.</p>
<p><strong>A sound for every person.</strong> Each contact can have its own notification sound and
vibration. Under the hood, the app makes a separate Android notification channel
for each person, since that&rsquo;s the only way Android lets an app give different
alerts different sounds. Now I know who&rsquo;s texting before I look.</p>
<p><strong>Priorities and VIPs.</strong> Every contact is Standard, Priority or Silent, and anyone
can be a VIP. VIPs sit at the top of my People list and always count as priority.</p>
<p><strong>Reminders that don&rsquo;t quit.</strong> If a priority text sits unread, the app reminds me
again, on a schedule I set per person (every 10 minutes, up to twice, for
example). Reading it or replying cancels the reminders. They survive the phone
rebooting, too.</p>
<p><strong>Quiet hours and snooze,</strong> so all of the above leaves me alone at night unless it
really matters.</p>
<p><strong>A setup checklist.</strong> Android has a handful of settings that silently wreck
alerts: battery optimization, exact alarms, Do Not Disturb access. The settings
screen checks each one and gives you a <strong>Fix</strong> button that jumps straight to the
right system page.</p>
<div class="tx-shots">
<figure><img src="shot-conversation.webp" alt="A conversation in the KCCS Text app with a made-up contact, chat bubbles with sent and delivered marks, and quick-reply buttons like On my way above the text box." loading="lazy" width="390" height="844"><figcaption>A conversation, with quick replies above the keyboard. (Made-up contact from the test harness.)</figcaption></figure>
<figure><img src="shot-contact.webp" alt="Contact settings in the KCCS Text app showing priority, a VIP checkbox and a list of sounds: KCCS Chime, KCCS Priority, KCCS Urgent, phone default, silent." loading="lazy" width="390" height="844"><figcaption>Every contact gets a priority, a VIP switch and its own sound.</figcaption></figure>
<figure><img src="shot-people.webp" alt="Settings screen showing Fix needed buttons for exact alarms, battery optimization and Do Not Disturb access, then a People and priorities list with Standard, Priority and Silent contacts." loading="lazy" width="390" height="844"><figcaption>The checklist that finds alert-killing settings, then People &amp; priorities.</figcaption></figure>
</div>
<h2 id="the-upgrade-trick">The upgrade trick</h2>
<p>Here&rsquo;s a small detail I love. The first rebuilt app had been installed under a
test package name. Instead of switching to a &ldquo;proper&rdquo; name and making me log in
again and redo every contact&rsquo;s sound, the real release <strong>kept that package name
and signing key</strong>. Android treated each new version as an update, so my login and
all my per-contact sounds carried over every time. Not pretty, but it worked
every time.</p>
<h2 id="goodbye-to-the-old-app">Goodbye to the old app</h2>
<p>For about a day I had <strong>two</strong> apps on my phone with the same name: the old
React Native one and the new one. Same name, different insides. I asked Leo to get
rid of the old one, and it came off both phones. Its 7-second polling stopped for
good on September 24.</p>
<h2 id="the-desk-page">The desk page</h2>
<p>Most of my day is at a PC, so on September 24 the same server got a desktop page:
texts <strong>and</strong> calls in one list, call and voicemail cards right inside each
conversation, keyboard shortcuts for everything, and a Ctrl+K search box for
jumping to anyone. It went through 31 automated checks before going live that
night.</p>
<div class="tx-shots">
<figure><img src="shot-desk.webp" alt="The KCCS Text desk page: a dark list of made-up conversations and calls on the left, and a welcome panel with unread counts and keyboard shortcuts on the right." loading="lazy" width="1600" height="950"><figcaption>The desk page: everything in one list, with keyboard shortcuts. (Test data.)</figcaption></figure>
</div>
<h2 id="voicemail-moves-in">Voicemail moves in</h2>
<p>My office phone system already turned voicemails into emails and transcripts. On
September 26 the app got a <strong>Voicemail</strong> button with a badge. Tap it to play a
message, read the transcript, call back or mark it heard. There&rsquo;s a second tab for
&ldquo;AI took a message,&rdquo; which you&rsquo;ll understand after the next message.</p>
<p>The same weekend the app learned to <strong>open on my main line by default.</strong> My server
sends from more than one number, and the app had been guessing.</p>
<h2 id="the-full-test">The full test</h2>
<p>On September 26 we test-called <strong>every line</strong> I own and sent test texts across all
of them: 22 calls and 9 texts. It found one problem I never would have guessed.
One of my phones had been sitting on manual Do Not Disturb since the 22nd, so
calls rang silently and showed up as missed. No app bug. Just a setting. That&rsquo;s
exactly why the setup checklist exists.</p>
]]></content:encoded></item><item><title>Six Hours Later: The First App</title><link>https://errorzap.com/texting/first-app/</link><pubDate>Fri, 02 Oct 2026 23:34:00 -0600</pubDate><guid>https://errorzap.com/texting/first-app/</guid><description>The first KCCS Text app was a fork of an open-source VoIP app. It got texts onto my phone fast. Then it started eating what I typed.</description><content:encoded><![CDATA[<div class="ez-dossier-lede"><span>MY OWN TEXTING · MESSAGE 04 · VERSION ZERO</span><p>The fastest way to learn what you want is to use something that isn't it.</p></div>
<h2 id="the-question">The question</h2>
<p>My first instinct on port day was to skip apps entirely. I live in Telegram, so I
asked for a bot that would let me text through it &ldquo;so I don&rsquo;t have to deal with a
weird app.&rdquo; That works for alerts. It&rsquo;s miserable for actual conversations with
forty different people.</p>
<p>So at 3:29 that afternoon:</p>
<figure class="tx-thread" role="group" aria-label="Sep 15 · 3:29 PM"><div class="tx-thread-head">Sep 15 · 3:29 PM</div>
  <span class="tx-b me"><small>Me → Orion</small>Is there a way to have a Google Voice-like texting app on my phone?</span>
</figure>

<p>Orion came back with a short list of open-source options. Fifteen minutes later:</p>
<figure class="tx-thread" role="group" aria-label="Sep 15 · 3:45 PM"><div class="tx-thread-head">Sep 15 · 3:45 PM</div>
  <span class="tx-b me"><small>Me → Orion</small>Privacy app: modify it… Don&rsquo;t ask me any questions. Do it.</span>
</figure>

<h2 id="forking-an-open-source-app">Forking an open-source app</h2>
<p>Orion found <strong>VoIPSuite-Mobile</strong>, an open-source texting app from a privacy project.
It&rsquo;s built in React Native, and it already knew how to talk to a VoIP carrier.
Orion forked it, pointed it at my own server, and named it <strong>KCCS Text</strong>.</p>
<p>Within two days it was on both of my phones. By September 17 it was at version
0.7.0, with a desktop-and-mobile &ldquo;business hub&rdquo; growing next to it on the server.
For a forked weekend project, that&rsquo;s fast.</p>
<p>Then I actually used it all day.</p>
<h2 id="bug-one-the-silent-alarm">Bug one: the silent alarm</h2>
<p>The point of a texting app is knowing when a text arrives. On September 17 we found
that Android had been quietly marking <strong>every single notification from the app as
SILENT</strong>. The notification channels had been created with sound and vibration
off, and once Android creates a channel, the app can&rsquo;t simply change it later.</p>
<p>The fix was new channels with new IDs, plus a lesson I&rsquo;d keep relearning for the
rest of this project: <strong>on Android, notification settings are sticky.</strong> If you get
them wrong on the first install, you have to version your way out.</p>
<h2 id="bug-two-the-text-eater">Bug two: the text eater</h2>
<p>The one that drove me nuts showed up the next day:</p>
<figure class="tx-thread" role="group" aria-label="Sep 18"><div class="tx-thread-head">Sep 18</div>
  <span class="tx-b me"><small>Me → Orion</small>Look into the [KCCS Text] app. When I&rsquo;m typing on it on my Pixel 7, it keeps erasing stuff.</span>
</figure>

<p>Here&rsquo;s what was going on. The app checked the server for new messages <strong>every 10
seconds</strong>, and each check redrew the screen, including the box I was typing in.
Phone keyboards keep a little &ldquo;work in progress&rdquo; state while you type (the word
being autocorrected, the swipe in flight). Redraw the box under it and the keyboard
loses its place. Letters vanish. Sometimes a whole sentence.</p>
<p>Orion&rsquo;s answer was a redesign, version 0.6.1. When Leo reviewed it, it caught a
trap: the &ldquo;new&rdquo; version had the <strong>same internal version
number</strong> as the 0.7.0 already installed, and it was missing picture messages and
saved drafts. Installed over the top, it would have been a downgrade wearing a
new coat of paint.</p>
<h2 id="the-audit">The audit</h2>
<p>That night I told Leo what I really wanted. Roughly: make this the ultimate texting
app for my number, not a half-baked thing I can kind of put up with.</p>
<p>Leo&rsquo;s audit was blunt:</p>
<ul>
<li>The whole app was <strong>one giant file</strong> on a React Native version from 2022.</li>
<li>There were <strong>three copies</strong> of the code drifting apart in different folders.</li>
<li>The <strong>10-second polling</strong> was the root of the typing bug, the battery drain <em>and</em>
the slow delivery.</li>
<li>Patching it would mean fighting an old framework forever.</li>
</ul>
<p>The recommendation: freeze the old app, stop polling, and rebuild around a server
that <strong>pushes</strong> new messages the instant they arrive. That&rsquo;s message 05.</p>
]]></content:encoded></item></channel></rss>