<?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: SHIVAM KUMAR RAI</title>
    <description>The latest articles on DEV Community by SHIVAM KUMAR RAI (@iamsmthing).</description>
    <link>https://dev.to/iamsmthing</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%2F1392379%2F85831fb9-8147-470c-921b-16daf45a2412.png</url>
      <title>DEV Community: SHIVAM KUMAR RAI</title>
      <link>https://dev.to/iamsmthing</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iamsmthing"/>
    <language>en</language>
    <item>
      <title>Breathgarden — a breathing guide that checks you're really following it, shows what the camera sees, and talks you through it eyes-closed</title>
      <dc:creator>SHIVAM KUMAR RAI</dc:creator>
      <pubDate>Sat, 14 Nov 2026 12:09:15 +0000</pubDate>
      <link>https://dev.to/iamsmthing/breathgarden-a-breathing-guide-that-checks-youre-really-following-it-shows-what-the-camera-3bo1</link>
      <guid>https://dev.to/iamsmthing/breathgarden-a-breathing-guide-that-checks-youre-really-following-it-shows-what-the-camera-3bo1</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/presage-2026-11-04"&gt;Presage SmartSpectra SDK Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Breathe with the ring and a garden grows. But only if you're &lt;em&gt;really&lt;/em&gt; following it.&lt;/strong&gt; Breathgarden reads your breathing and pulse from your webcam with SmartSpectra, shows you what the camera sees, adapts its pace to you, and can talk you through it with your eyes closed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Breathgarden&lt;/strong&gt; is a desktop app for a two-to-five-minute calm break. A glowing orb grows and shrinks with your &lt;strong&gt;real chest movement&lt;/strong&gt;, read from your webcam by SmartSpectra. A ring breathes at a gentle guide pace. Breathe with the ring and flowers grow; at the end you get a &lt;strong&gt;breath-print postcard&lt;/strong&gt; whose hills are drawn from your own breathing.&lt;/p&gt;

&lt;p&gt;It's a desktop app on purpose: it's built for the desk you're already sitting at between meetings, and a webcam on a desk holds still. SmartSpectra's breathing signal is best when the camera isn't moving, which is hard with a phone in your hand.&lt;/p&gt;

&lt;p&gt;Lots of breathing apps animate something with your breath. Breathgarden does four things I haven't seen elsewhere:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It checks that you're actually following, not just breathing.&lt;/strong&gt; "In step" is the live &lt;strong&gt;correlation between your chest trace and the guide ring&lt;/strong&gt;: a 15-second window, allowing 0–4 s for your reaction time and the SDK's delay. I tuned it on recorded live sessions. Following scores about 0.5–0.9, while breathing freely at your own pace almost never passes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The guide is a closed loop.&lt;/strong&gt; It starts at &lt;em&gt;your&lt;/em&gt; measured rate and eases down only while you follow. If you stop following and speed up, it holds, then &lt;strong&gt;eases back up to meet you&lt;/strong&gt; and says so ("Eased back to 10.4 /min to match you"). It never pushes you into air hunger.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can see what the camera sees, all session.&lt;/strong&gt; A greyscale camera view shows where SmartSpectra looks: a face dot-grid that glows on every pulse beat, and chest lines that rise and fall with your breath. It turns invisible sensing into something you can trust (and hide, with one tap).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can do it with your eyes closed.&lt;/strong&gt; An optional &lt;strong&gt;voice guide&lt;/strong&gt; (clips generated ahead of time with ElevenLabs) gives framing tips, counts your first breaths, tells you when the guide slows or eases back, notices when you talk ("I'll wait while you talk"), and reads out your flower count at the end. The optional &lt;strong&gt;sound garden&lt;/strong&gt; turns your breath into a swelling pad, your pulse into a faint heartbeat and steadier HRV into warmer chords.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/olJV3fq0qbI" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The session is a real, unedited 3-minute live recording. The opening consent screen is a still, and the narration was added afterwards with ElevenLabs. It covers the "What the camera sees" framing check, then the session. You can see the orb following my chest, the dots pulsing with my heartbeat, flowers growing while I follow the ring, the garden pausing while I talk, and the guide easing back when I fell behind. It ends with the breath-print postcard. The &lt;strong&gt;Live · SmartSpectra&lt;/strong&gt; badge and live pulse, breathing and HRV values are on screen throughout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/shivamkr09/breathgarden" rel="noopener noreferrer"&gt;https://github.com/shivamkr09/breathgarden&lt;/a&gt; (MIT). Setup: &lt;code&gt;npm install&lt;/code&gt;, put your Presage key in &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;npm start&lt;/code&gt;. On macOS you can double-click &lt;code&gt;start-breathgarden.command&lt;/code&gt;. Run &lt;code&gt;npm test&lt;/code&gt; for the 13 unit tests covering the follow score, the closed-loop guide, breath detection and framing hints.&lt;/p&gt;

&lt;h3&gt;
  
  
  How judges can test
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live:&lt;/strong&gt; get a free key at &lt;a href="https://physiology.presagetech.com/auth/register" rel="noopener noreferrer"&gt;physiology.presagetech.com&lt;/a&gt;, add it to &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;npm start&lt;/code&gt;. The free trial is about 100 credits (roughly 50 live minutes), so a 3-minute session is plenty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No key or camera:&lt;/strong&gt; &lt;code&gt;npm run demo&lt;/code&gt; (Electron) or &lt;code&gt;npm run web-demo&lt;/code&gt; (browser) runs the whole flow on a clearly labelled simulated signal.&lt;/li&gt;
&lt;li&gt;No login, no accounts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How It Responds to Human Signals
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SmartSpectra signal&lt;/th&gt;
&lt;th&gt;What it drives&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Chest breathing trace&lt;/strong&gt; (&lt;code&gt;breathing.upperTrace&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;The orb, sample by sample · the follow score (trace vs. ring correlation) · the live trace and breath lengths · the moving chest lines in the camera view · the sound pad · the breath-print postcard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Breathing rate&lt;/strong&gt; (&lt;code&gt;breathing.rate&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Where the closed-loop guide starts and whether to ease back · 5-second capsules against the guide's real path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Pulse rate&lt;/strong&gt; (&lt;code&gt;cardio.pulseRate&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;The face dot-grid glowing on each beat · a soft heartbeat in the sound garden · pulse tile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;HRV&lt;/strong&gt; (&lt;code&gt;cardio.hrv[].rmssd&lt;/code&gt;, &lt;code&gt;stable&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Warmer chords in the sound garden as readings steady · HRV tile · start→end trend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Talking&lt;/strong&gt; (&lt;code&gt;face.talking&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;The garden pauses and the voice says "I'll wait while you talk." If a key isn't authorized for it, the app restarts the SDK without it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Validation status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A four-item framing checklist (face · framing · light · stillness) with plain-language and spoken tips; flowers pause until &lt;code&gt;kOk&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Integration:&lt;/strong&gt; Presage's Electron path. &lt;code&gt;bindSmartSpectraIpc(win)&lt;/code&gt; runs the native engine in the main process, &lt;code&gt;@smartspectra/node-sdk/preload&lt;/code&gt; is bundled into a sandboxed preload, and the renderer creates &lt;code&gt;SmartSpectraSDK&lt;/code&gt; from &lt;code&gt;@smartspectra/node-sdk/renderer&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;sdk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SmartSpectraSDK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;requestedMetrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;breathingMetrics&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;MetricType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="no"&gt;PULSE_RATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;MetricType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="no"&gt;HRV&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;MetricType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="no"&gt;TALKING&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;enableTelemetry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// consent screen, off by default&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;sdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'validationStatus'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;checklist&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;sdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'metrics'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;decodeMetrics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;              &lt;span class="c1"&gt;// each event = only the new samples&lt;/span&gt;
  &lt;span class="n"&gt;breath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;breathing&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upperTrace&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// rolling window → orb, follow score, camera view&lt;/span&gt;
  &lt;span class="n"&gt;vitals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;breathing&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cardio&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pulseRate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cardio&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hrv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;talking&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;face&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;talking&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;detected&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp2ebhdff09r83hyp97zx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp2ebhdff09r83hyp97zx.png" alt="A real 3-minute live session: 10 flowers, 1:29 in step, and a breath-print postcard drawn from my own breathing" width="799" height="446"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A real 3-minute live session: 10 flowers, 1 minute 29 seconds in step, and a breath-print postcard drawn from my own breathing.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What I learned tuning it on real sessions
&lt;/h3&gt;

&lt;p&gt;I recorded the app's numbers (never video) during live runs and tuned from them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run 1: zero flowers.&lt;/strong&gt; The guide asked for 6 breaths/min immediately, and the SDK's breathing rate was too jumpy second to second (13.7 → 24 → 11.8) to judge "in step". So "in step" became the trace-to-ring correlation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run 2: 2 flowers in 54 s.&lt;/strong&gt; Real traces are noisier than my simulation (median |r| 0.49). A 15-second window and a threshold matched to real data fixed it, while keeping free breathing at about a 4% false pass rate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run 3: 7 flowers in the first 85 s, then none.&lt;/strong&gt; The guide kept slowing below 7.5/min; I sped up and stopped following. That's why the guide is now a closed loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run 4, with the closed loop: 10 flowers and 1:29 in step over 3 minutes&lt;/strong&gt; (pictured above).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;macOS camera quirk:&lt;/strong&gt; camera permission belongs to the app that &lt;em&gt;launched&lt;/em&gt; Electron. From the wrong parent, the track is "live" but delivers zero frames and the SDK times out. Breathgarden checks &lt;code&gt;systemPreferences&lt;/code&gt; and explains the fix within 7 seconds.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Most Creative or Delightful Use.&lt;/strong&gt; &lt;em&gt;Inspiration:&lt;/em&gt; I wanted to hear my own breath grow something. Your body is the instrument: breath swells the music, your pulse keeps a soft beat, the camera view shows the sensing happening, the garden waits politely when you talk, and the keepsake is a breath-print postcard no one else could make.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Thoughtful Real-World Use.&lt;/strong&gt; &lt;em&gt;Who it's for:&lt;/em&gt; people at a desk all day who want a short reset without buying a wearable or creating an account, and people who'd rather &lt;strong&gt;close their eyes&lt;/strong&gt;, including people with low vision, thanks to the voice guide and sound.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The guide &lt;strong&gt;meets you where you are&lt;/strong&gt; and backs off instead of pushing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Numbers are hidden by default.&lt;/strong&gt; Tiles still say each signal is live, without values that might make someone anxious.&lt;/li&gt;
&lt;li&gt;Consent before the camera; a red "Camera on" badge and live camera panel whenever it's on; "Hide video" keeps the camera honest without showing your face.&lt;/li&gt;
&lt;li&gt;Plain-language framing help, keyboard-operable controls, &lt;code&gt;prefers-reduced-motion&lt;/code&gt; support.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Consent and Data Handling
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Camera consent:&lt;/strong&gt; the camera never starts until you tick an explicit consent box ("I'm only measuring myself") and press Continue, enforced in code. The main process grants camera access only to the app's own page and only for video (never the microphone), and blocks navigation and popups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Processing:&lt;/strong&gt; frames go from the window to the SmartSpectra engine in the app's own process on your computer. Nothing uploads or records video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage and retention:&lt;/strong&gt; none by default. Signals live in memory for the current session only; &lt;strong&gt;Forget session&lt;/strong&gt; clears them and quitting clears everything. No localStorage, no analytics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Postcard:&lt;/strong&gt; optional and user-initiated. One PNG: the garden picture (hill shapes follow your breathing pattern), date, minutes and flower count. No numbers or readings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sharing:&lt;/strong&gt; the SDK authenticates the API key with Presage over TLS. The app makes no other requests; even the font is bundled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SDK telemetry:&lt;/strong&gt; &lt;strong&gt;off by default&lt;/strong&gt;, opt-in on the consent screen. If enabled, the SDK sends session summaries and readiness reports (SDK version, device model and OS, frame rates, validation counts, error codes, possibly technical free text): &lt;strong&gt;no video and no measured vitals&lt;/strong&gt;, but linkable to the API key's account. Retention follows Presage's policies (&lt;a href="https://smartspectra.presagetech.com/docs/telemetry-and-privacy" rel="noopener noreferrer"&gt;details&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI services:&lt;/strong&gt; the voice guide's clips were &lt;strong&gt;generated once, ahead of time, with ElevenLabs text-to-speech&lt;/strong&gt; from a fixed list of phrases (no personal data). At runtime the app only plays those local files, or your OS's built-in voice. &lt;strong&gt;No AI service is called during a session&lt;/strong&gt;, and readings are never spoken or sent. LLM Insights is not used.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Talking and sound:&lt;/strong&gt; the talking signal only pauses the garden; no audio is captured. The sound garden is synthesized locally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not medical:&lt;/strong&gt; relaxation and wellness only. No diagnosis, treatment or medical decisions.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>presagechallenge</category>
      <category>electron</category>
      <category>a11y</category>
    </item>
  </channel>
</rss>
