<?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: Eyal Ronen</title>
    <description>The latest articles on DEV Community by Eyal Ronen (@eyalronen).</description>
    <link>https://dev.to/eyalronen</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%2F4135561%2Fd5ab119a-8e9c-48c6-a2a1-2fcbbb75847d.jpg</url>
      <title>DEV Community: Eyal Ronen</title>
      <link>https://dev.to/eyalronen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eyalronen"/>
    <language>en</language>
    <item>
      <title>Designing a No-Account iOS Voice Workflow: Audio to Transcript to Tasks</title>
      <dc:creator>Eyal Ronen</dc:creator>
      <pubDate>Mon, 21 Sep 2026 10:56:23 +0000</pubDate>
      <link>https://dev.to/eyalronen/designing-a-no-account-ios-voice-workflow-audio-to-transcript-to-tasks-315f</link>
      <guid>https://dev.to/eyalronen/designing-a-no-account-ios-voice-workflow-audio-to-transcript-to-tasks-315f</guid>
      <description>&lt;h2&gt;
  
  
  The product problem
&lt;/h2&gt;

&lt;p&gt;A voice recorder is good at preserving audio. It is not good at helping someone find the decision they made in a meeting, remember the promise buried in a lecture, or turn an idea into a next step.&lt;/p&gt;

&lt;p&gt;ToText is a small iOS product built around a longer pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;capture/import -&amp;gt; local record -&amp;gt; temporary transcription -&amp;gt;
transcript -&amp;gt; summary + action items -&amp;gt; questions -&amp;gt; export
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important engineering detail is that this is not one “AI feature.” It is a set of jobs with different storage, retry, and privacy requirements. The app has no user account, and the library is stored on the device, with optional iCloud sync. That constraint shapes nearly every decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Keep capture separate from processing
&lt;/h2&gt;

&lt;p&gt;The first boundary is the audio file.&lt;/p&gt;

&lt;p&gt;A user can record in the app or import a supported file. The app first saves enough local state to represent the recording, then starts processing. That means leaving the app, losing a network connection, or stopping a long recording does not have to destroy the only copy.&lt;/p&gt;

&lt;p&gt;A useful job model looks roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;recording
  -&amp;gt; queued
  -&amp;gt; uploading
  -&amp;gt; transcribing
  -&amp;gt; generating
  -&amp;gt; ready

uploading/transcribing/generating -&amp;gt; failed -&amp;gt; retryable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact implementation can use Swift concurrency, a persistent queue, or another approach. The key is that the state is durable and visible. A spinner is not a recovery strategy.&lt;/p&gt;

&lt;p&gt;For long recordings, the app needs to keep the source available while work is in progress. If a request fails, the user should see a failed job, a reason when possible, and a retry action. If a server-side job stalls, the usage allowance should not remain permanently consumed.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Be precise about the privacy boundary
&lt;/h2&gt;

&lt;p&gt;“No account” and “on device” are different claims.&lt;/p&gt;

&lt;p&gt;ToText does not require an account, email address, or sign-in. The saved library is on the device, with optional sync to the user’s own iCloud Drive. There is no permanent server library of completed recordings.&lt;/p&gt;

&lt;p&gt;The main recording flow still needs cloud speech-to-text. Audio is temporarily sent to AWS Frankfurt and Soniox for transcription, then deleted about a minute after processing. That is the honest boundary: local library, temporary processing service, no permanent server archive.&lt;/p&gt;

&lt;p&gt;Generated features such as summaries, action items, and questions use transcript context. The product should explain that processing is required for these features rather than implying that every operation is local. A privacy label is only useful when it tells the user which path they are choosing.&lt;/p&gt;

&lt;p&gt;There is one absolute never-leaves-the-device path, and it is not the main recording flow. On iOS 26 and later, the Apple dictation keyboard can provide that option when the user uses the system dictation path. Keeping this distinction in the UI and documentation prevents a convenient slogan from becoming a false technical promise.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Treat the transcript as evidence
&lt;/h2&gt;

&lt;p&gt;Speech recognition output is not the same thing as a verified record. Names, numbers, deadlines, and commitments need review.&lt;/p&gt;

&lt;p&gt;The useful interface pattern is to keep the recording beside the transcript. When timing data is available, a sentence can point back to its position in the audio. Speaker labels help with conversations, but they can still need correction, especially with overlap or noise.&lt;/p&gt;

&lt;p&gt;This makes the later steps safer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The summary is a compact reading view.&lt;/li&gt;
&lt;li&gt;Action items are suggestions extracted from the transcript.&lt;/li&gt;
&lt;li&gt;Q&amp;amp;A answers should stay grounded in transcript text.&lt;/li&gt;
&lt;li&gt;A timestamp gives the user a fast way to check a claim.&lt;/li&gt;
&lt;li&gt;Export should preserve enough context to make review possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The app supports summaries and generated text in the user’s chosen app language while keeping the transcript in the language or languages that were spoken. That matters for bilingual speech. Translating the transcript and summarizing it are different operations, and they should not be presented as the same thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Design the no-account tradeoff deliberately
&lt;/h2&gt;

&lt;p&gt;A no-account product gives up some familiar features. There is no server-backed workspace, no team invitation, and no automatic library on every device through a vendor account.&lt;/p&gt;

&lt;p&gt;In return, the core library does not need to be tied to an email address. Usage can be tracked with an anonymous device identifier, and paid access can be managed through Apple’s purchase system. The product remains freemium, with a free plan and optional in-app purchase plans for higher usage, without making signup the first task.&lt;/p&gt;

&lt;p&gt;This model moves complexity into the client:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Persist recording metadata before network work begins.&lt;/li&gt;
&lt;li&gt;Keep pending files recoverable after interruption.&lt;/li&gt;
&lt;li&gt;Make retry idempotent so a second tap does not create confusing duplicates.&lt;/li&gt;
&lt;li&gt;Reconcile purchase state reliably.&lt;/li&gt;
&lt;li&gt;Make deletion report the actual result.&lt;/li&gt;
&lt;li&gt;Keep the local library searchable, including mixed Hebrew and English text.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Privacy is not just a backend retention policy. It is also the behavior users see when the network is unavailable.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Respect iOS product boundaries
&lt;/h2&gt;

&lt;p&gt;The app can capture through its own recorder or import audio. It does not join online meetings or directly capture phone calls, Zoom, Google Meet, or other system audio.&lt;/p&gt;

&lt;p&gt;The keyboard path has its own iOS constraint. A third-party keyboard cannot simply hold the microphone open as if it were the main app. A practical design can hand the user into the recording path, then return with inserted text. That is a different user experience from recording a full conversation and saving it in the library.&lt;/p&gt;

&lt;p&gt;Live Activity controls can make an active recording easier to pause or stop from the Lock Screen. Accessibility also belongs in the first design pass: VoiceOver labels, Dynamic Type, and reduced motion are not polish added after the data model is done.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Test the failures, not only the demo
&lt;/h2&gt;

&lt;p&gt;A builder can make the happy path look impressive in one afternoon. The real work is testing what happens when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the user stops a recording and immediately leaves the app&lt;/li&gt;
&lt;li&gt;the network drops during upload&lt;/li&gt;
&lt;li&gt;a recording lasts an hour or more&lt;/li&gt;
&lt;li&gt;the transcript contains right-to-left and left-to-right text&lt;/li&gt;
&lt;li&gt;two speakers overlap&lt;/li&gt;
&lt;li&gt;the generated summary invents a detail&lt;/li&gt;
&lt;li&gt;the user deletes the library while a job is pending&lt;/li&gt;
&lt;li&gt;a verified subscription is temporarily unavailable to the UI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A clear failed state is a feature. A retry that does not duplicate work is a feature. Showing the original audio beside a generated answer is a feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  The small-system principle
&lt;/h2&gt;

&lt;p&gt;The architecture for a voice-to-notes app does not need a permanent cloud library to be useful. It needs explicit boundaries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;store the user’s working library locally&lt;/li&gt;
&lt;li&gt;send only what processing requires&lt;/li&gt;
&lt;li&gt;delete temporary audio on a defined schedule&lt;/li&gt;
&lt;li&gt;make generated text easy to verify&lt;/li&gt;
&lt;li&gt;expose failures and recovery&lt;/li&gt;
&lt;li&gt;do not confuse an iOS dictation path with the main cloud transcription path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the system behind ToText: record or import, transcribe temporarily, generate useful views, and keep the result close to the original recording. The result is not a promise that AI never makes mistakes. It is a workflow that makes those mistakes easier to spot and the useful parts easier to carry forward.&lt;/p&gt;

&lt;p&gt;ToText is available for iPhone and iPad at &lt;a href="https://apps.apple.com/app/id6770080775" rel="noopener noreferrer"&gt;https://apps.apple.com/app/id6770080775&lt;/a&gt;. Review important names, numbers, and commitments against the audio before relying on generated text.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>ios</category>
      <category>mobile</category>
      <category>product</category>
    </item>
  </channel>
</rss>
