DEV Community

Cover image for SOVA — A Focus and Recovery App That Notices Your Breathing Before You Do
Chima
Chima

Posted on

SOVA — A Focus and Recovery App That Notices Your Breathing Before You Do

Presage SmartSpectra SDK Challenge Submission

This is my submission for the Presage SmartSpectra SDK Challenge.

What I Built

I spend a lot of time on my laptop. Some days I'm studying, writing code, working on projects or trying to finish something before a deadline.

When I'm really focused, I tend to forget everything else, I'll sit for hours without taking a proper break, sometimes my breathing becomes faster, I barely blink, and I don't even notice how tired I am until I finally stop working

I wanted to do something about that

A regular focus timer can remind me that 25 minutes have passed, but it doesn't know what's happening while I'm working. Breathing apps can help me slow down, but I still have to remember to open them

So I built SOVA, a desktop application that combines a focus timer with live breathing and cardiovascular measurements.

SOVA uses the Presage SmartSpectra SDK to measure breathing rate, pulse and heart rate variability (HRV) through an ordinary webcam. No smartwatch or additional sensor is required.

It learns your personal baseline, looks for sustained changes during a focus session, and can suggest a short breathing reset or an eye rest when appropriate.

It doesn't tell you that you're stressed, unhealthy or unproductive. It simply helps you notice what has changed and gives you the choice to take a break.

A live SOVA focus session

Live measurements from the Presage SmartSpectra SDK. The heart responds to the measured pulse, while the breathing line follows the live breathing signal.

The moment I designed SOVA for

Imagine you're 40 minutes into a difficult task.

You've been concentrating on the same problem for a while. Your breathing has gradually become faster, but you haven't noticed because you're busy working.

SOVA has already learned your usual breathing rate during the first part of the session.

When your breathing stays noticeably above that baseline for several minutes, SOVA doesn't immediately interrupt you. It waits for a suitable moment, such as a pause in your typing, before suggesting a 60-second breathing reset.

You can accept it, postpone it or continue working.

If you choose the reset, SOVA guides you through the breathing exercise. Afterwards, it compares reliable measurements from before and after the break.

You can see what changed without being given a stress score or a medical interpretation.

That's the experience I wanted to build: something that works alongside me, rather than another application demanding my attention.

What Using SOVA Looks Like

Starting with consent

When SOVA opens for the first time, it explains why it needs your camera, what information is stored and how the SmartSpectra SDK handles measurements.

Nothing is measured until you give permission.

If you don't want to use the camera, you can still use SOVA as a normal focus timer.

On the Home screen, you can also describe how you're feeling before starting work. You might choose Calm, Focused, Tense, Tired or Scattered.

These are your own reflections. SOVA doesn't attempt to guess your emotions from your pulse.

The dashboard shows your focus time, breaks, resets and eye rests. There are no productivity scores or streaks to maintain.

Checking your signals in 60 seconds

I wanted people to experience the SmartSpectra integration without having to start a full focus session.

That's why I added Check your signals to the Home screen.

It's a quick check-in that measures available physiological signals through your webcam.

SOVA displays breathing rate, pulse and HRV when the readings are reliable. It also shows which signals are still being collected or aren't reliable enough to display.

HRV needs a longer measurement window, so the check-in can allow up to 30 additional seconds when necessary. If the reading still isn't ready, SOVA explains that instead of inventing a value.

The results are saved in History.

After you've completed enough check-ins, SOVA can also show your personal usual range, based on your previous reliable measurements.

For example, you might see:

Your usual breathing: 12–15 breaths/min

Today's reading: 17 breaths/min

These are personal comparisons, not medical reference ranges.

You can also compare a check-in with your previous one and optionally record how you're feeling.

Starting a focus session

SOVA includes presets for Deep Work, Studying, Reading, Creative Work and General Work.

Before a session starts, it checks your camera setup and gives simple instructions.

For more reliable measurements, it recommends keeping your laptop steady, using even lighting and making sure your face and upper body are visible.

During the first two minutes of a regular session, SOVA gathers reliable readings to establish your baseline.

That reference is used to evaluate changes during the session.

Watching your readings live

I didn't want SOVA to feel like a medical dashboard full of numbers.

I wanted the information to be understandable at a glance.

A 3D heart in the session screen responds to your measured pulse.

When the SDK hasn't provided a reliable pulse reading, the heart remains grey and still.

Once a reliable reading becomes available, the heart turns red and starts beating at the measured rate.

Your breathing is represented by an orange waveform that responds to the breathing signal provided by the SDK.

Other cards show available breathing, pulse, HRV and inhale-to-exhale information.

One rule I followed throughout development was simple:

If the SDK cannot provide a reliable reading, SOVA should not pretend that it can.

Instead, it displays messages like "Waiting for a reading" or "Signal too weak to show."

Taking a break when it makes sense

SOVA compares live readings against the personal baseline established earlier in the session.

For its standard sensitivity setting, it looks for sustained changes such as faster breathing, a higher pulse or lower HRV relative to that baseline.

These are application-defined rules for offering a break, not medical thresholds.

A single unusual reading doesn't trigger a suggestion. The change needs to persist over a period of time.

I also made sure SOVA considers whether a reminder would be inconvenient.

For example, it can hold reminders back when you're talking, when you've marked yourself as "in flow", or when you've stepped away.

On desktop, it can wait for a pause in typing before showing a suggestion.

There are adjustable sensitivity settings and cooldowns between reminders.

I wanted users to have control over the experience rather than feel constantly monitored by their own focus application.

Guided breathing and recovery

The Recovery section includes several breathing patterns, such as slower paced breathing, box breathing and 4-7-8 breathing.

You can choose a short reset or a longer breathing session.

SOVA displays a breathing guide alongside your live breathing waveform when reliable data is available.

There are also quick resets for moments when you need a short pause between tasks or meetings.

An optional microphone feature can listen for audible breathing during a reset, after separate permission.

It uses the sound to estimate breath timing and exhale length without recording or saving the audio.

Once a reset is complete, SOVA can compare reliable readings taken before and after.

If it doesn't have enough information for a meaningful comparison, it tells you.

History, insights and personal patterns

At the end of a session, SOVA gives you the option to describe how the session felt.

You can then review a summary of your focus time, breaks, resets and available before-and-after measurements.

The session timeline shows when important events happened.

History keeps your focus sessions, breathing exercises and signal check-ins together.

The Insights section looks for patterns in your own recorded sessions, including how your readings and focus habits change over time.

SOVA only introduces personal ranges and pattern observations when enough reliable history has been collected.

You can also save or copy a session card that includes your focus information and breathing visualization.

The point isn't to turn every session into a score. It's to help you understand your own habits a little better.

Demo

Watch the demo: https://www.youtube.com/watch?v=zsqQYHev2NM

The video shows SOVA using real measurements from the Presage SmartSpectra SDK.

I intentionally included moments where the SDK couldn't produce a reliable measurement because I think those moments are just as important as successful readings.

At the beginning of the live session, the heart remains grey while SOVA waits for a usable signal.

When the SDK reports a reliable pulse of 92 beats per minute, the heart turns red and begins beating at the measured rate.

Later, the camera conditions become less suitable. The SDK reports a quality problem, and SOVA stops displaying the unreliable pulse reading.

Once the signal improves, the breathing rate becomes available at around 18 breaths per minute, with the breathing line updating on screen.

The demo also shows a pulse reading of 83 bpm compared with a personal session baseline of 73 bpm.

At the same moment, HRV is too weak to display.

Instead of filling the card with a guessed value, SOVA reports that the signal isn't reliable enough.

The video also shows "What SOVA sees," a section where the user can inspect the actual SDK fields, confidence information and decisions made by SOVA.

This is one of the parts I'm most pleased with because it makes the integration visible rather than hiding everything behind the interface.

Code

GitHub logo Chima30 / sova

A focus and recovery app that uses webcam-based breathing and pulse measurements to suggest timely breaks and show what changes after a reset. Built with the Presage SmartSpectra SDK.

SOVA

When I spend hours studying or coding, I often don't notice my breathing getting faster or how long I've gone without a break until I'm already tired.

I built SOVA to help with that. It's a desktop focus app that uses your webcam and Presage's SmartSpectra SDK to measure breathing, pulse and heart rate variability (HRV) while you work. It learns your baseline, suggests a short reset when reliable readings show a lasting change, and compares your measurements before and after.

A live SOVA focus session, showing the breathing waveform and pulse-driven heart

Live camera measurements from SmartSpectra. The heart beats at the measured pulse, and the orange line follows the breathing signal. Recorded with npm run demo, which shortens waiting periods without faking readings.

Watch the demo · Get SOVA

Inspiration

A regular timer tells me when to stop, but it can't tell whether I've been breathing faster than usual or missing breaks. Breathing apps can help, but I…

GitHub repository: https://github.com/Chima30/sova

SOVA's application code is open source under the MIT License. The SmartSpectra SDK itself remains under Presage's own license and terms.

How to run SOVA

You can download a desktop installer from the GitHub Releases page, or run the application directly from the source code.

You'll need a webcam, Node.js 20 or later if running from source, and a free Presage API key.

To get an API key, visit the Presage developer portal.

Clone the repository and run:

git clone https://github.com/Chima30/sova.git
cd sova
npm install
npm start
⭐ Football Update: therichworth/sova a focus and recovery app that notices your breathing before you do ab - Pertandingan Hari Ini ⭐ Football Update: therichworth/sova a focus and recovery app that notices your breathing before you do ab - Pertandingan Hari Ini

When the application opens, review the consent screen and enter your Presage API key in Settings.

No SOVA account is required.

If you want to test the experience more quickly, use:

npm run demo
⭐ Football Update: therichworth/sova a focus and recovery app that notices your breathing before you do ab - Pertandingan Hari Ini ⭐ Football Update: therichworth/sova a focus and recovery app that notices your breathing before you do ab - Pertandingan Hari Ini

Demo mode shortens the waiting periods used for baseline collection and reminders, but it still uses real SDK readings.

The project also includes automated checks:

npm test
npm run smoke
npm run smoke:checkin
⭐ Football Update: therichworth/sova a focus and recovery app that notices your breathing before you do ab - Pertandingan Hari Ini ⭐ Football Update: therichworth/sova a focus and recovery app that notices your breathing before you do ab - Pertandingan Hari Ini

These cover core application rules and Electron interface flows.

The quickest way to try the SDK integration

After setting up your API key, open Home and select Start 60-second check-in.

SOVA will begin collecting available signals and show their status as measurements become ready.

You can also open "What SOVA sees" to inspect the actual SDK values and see why individual readings are accepted or held back.

If you'd rather test the full focus experience, open Focus, choose a preset and start a session.

Let SOVA establish your baseline, then try a guided reset and review the comparison afterwards.

How It Responds to Human Signals

The SmartSpectra SDK is the foundation of SOVA's live measurement features.

I built SOVA with Electron and use @smartspectra/node-sdk version 3.4.0.

The SDK runs in Electron's main process, where it handles camera measurement and produces physiological signals.

Those results pass through SOVA's own processing rules before being displayed or used for reminders.

Signals used in SOVA

SmartSpectra signal How SOVA responds
Breathing rate Builds a personal baseline, checks for sustained changes and supports recovery comparisons
Breathing waveform Draws the live breathing visualization
Pulse Controls the animated heart and contributes to baseline comparisons
Heart rate variability (HRV) Provides another personal comparison when the measurement is reliable
Blink detection Supports eye-rest suggestions
Talking detection Helps delay reminders during conversations or meetings
Validation and signal quality Explains when lighting, movement or camera conditions affect measurement quality

How the measurements reach the interface

The main integration is in src/main/nativeMeasurement.js.

This module initializes the SDK, requests the required metric groups, starts camera measurement and handles incoming SDK events.

The renderer receives the measurement results through Electron's application bridge.

SOVA then applies its own rules for deciding whether readings are reliable enough to display.

Those rules live in shared/core/signals.js.

For example, SOVA considers whether a reading has completed its measurement window, whether the SDK marks it as stable, whether its confidence meets the configured threshold and whether it is recent enough to use.

If any of those checks fail, the reading is held back.

I deliberately separated these checks from the user interface so I could test the behaviour independently.

Using personal baselines instead of population ranges

One of the main design choices was to compare users with their own readings.

During the beginning of a session, SOVA builds a personal baseline using reliable measurements.

The cue engine then looks for sustained changes relative to that baseline.

Under the standard configuration, these include breathing more than 20% above baseline, pulse more than 8 bpm above baseline, or HRV more than 25% below baseline.

The engine considers readings across a three-minute window rather than reacting to a single measurement.

Users can also change sensitivity and reminder timing in Settings.

The relevant logic is implemented in shared/core/cueEngine.js.

These thresholds are not meant to identify medical problems. They simply determine when SOVA may offer an optional recovery break.

What SOVA sees

I added this section because I wanted the measurements to be inspectable.

The "What SOVA sees" table includes the SDK field name, its available value, confidence information and whether SOVA is using the reading.

For someone reviewing the application, it provides a direct way to see the connection between the SmartSpectra SDK and the interface.

For the user, it helps explain why a measurement might be missing.

What I learned from the SDK

A few things became clear during development.

First, camera conditions make a real difference.

During testing, poor lighting caused unreliable readings and camera-quality warnings. I decided to show those warnings rather than hide them.

Second, different physiological measurements become available at different times.

Pulse generally becomes available sooner than breathing, while HRV needs a longer period of steady measurement.

That meant the interface needed to handle individual signal readiness rather than assuming everything would appear together.

Third, unreliable measurements are part of the experience.

I spent time making sure SOVA could handle missing signals, interruptions and camera problems without pretending that measurements were still valid.

Finally, I learned that local processing and offline operation aren't the same thing.

SOVA stores its own session data locally, but live SmartSpectra measurements require an authenticated connection to Presage.

The timer, previously saved history and other non-measurement features can still work without that connection.

Prize Categories

I'm entering both Best Thoughtful Real-World Use and Most Creative or Delightful Use, while also being considered for the overall challenge.

Best Thoughtful Real-World Use

I built SOVA around an everyday problem that I experience personally.

People who study, develop software, work remotely or spend long hours in front of a screen can become absorbed in their work and forget to take breaks.

SOVA uses camera-based measurements to help make those moments more noticeable.

I put a lot of thought into making it practical.

The application doesn't require an additional wearable device, and users can still use the timer without enabling the camera.

It compares measurements against personal baselines rather than assigning a general stress score.

It avoids interrupting people unnecessarily, with meeting detection, typing pauses, cooldowns and manual controls.

It also explains when measurements aren't reliable.

Consent, local data controls, reduced-motion support, keyboard access and accessible interface features were included because I wanted SOVA to be something people could actually use during their day.

Most Creative or Delightful Use

I wanted physiological signals to feel understandable without making the application look clinical.

The heart animation responds to your real pulse, while the orange breathing line follows your measured breath.

When the SDK cannot provide a reliable reading, the visualization changes rather than continuing with made-up movement.

That connection between live measurements and the interface is a big part of SOVA's personality.

I also wanted the recovery experience to feel calm and unhurried.

Guided breathing patterns, ambient sounds, personal session timelines and the shareable session card all build on that idea.

What makes SOVA different to me isn't simply that it displays camera-based measurements. It's that those measurements become part of a focus and recovery experience that responds to the person using it.

Consent and Data Handling

Privacy was an important consideration while building SOVA because the application uses a camera and handles personal physiological measurements.

I wanted users to understand what is being measured, when the camera is active, what is saved and which information is handled by Presage.

Camera consent

SOVA asks for permission before starting camera-based measurements.

The first-launch consent screen explains how the camera is used and how data is handled.

If the user chooses not to enable the camera, SOVA remains available as a focus timer.

During a measurement session, the interface shows a camera indicator and provides a way to pause camera access.

SOVA does not secretly activate the camera or monitor people without their knowledge.

Video and local processing

The SmartSpectra SDK processes camera measurements on the device.

SOVA does not record or save raw camera video or images.

The application uses the resulting physiological measurements to update its interface, establish personal baselines and run its recovery rules.

Raw video is not part of SOVA's stored session history.

What is shared with Presage

Live measurements require a Presage API key and an authenticated connection to Presage's services.

There is also an important distinction between diagnostic telemetry and the SDK's built-in AI Insights functionality.

According to Presage's LLM Insights documentation, the SDK automatically sends selected physiological measurements to Presage's AI analytics service while measurement sessions are running.

These automatic requests can include derived breathing, pulse and HRV values, together with session information.

The SDK uses these values to generate periodic vitals insights.

SOVA does not display those automatic insights.

This processing is separate from SOVA's optional AI reflections, and disabling diagnostic telemetry does not disable the SDK's automatic AI Insights requests.

Presage's documentation states that raw video and camera images are not included in these AI Insights requests.

Information stored by SOVA

SOVA stores application data locally on the user's computer.

This includes session summaries, personal baselines, check-in results, session events, optional reflections, notes and settings.

The Presage API key is protected using the operating system's secure storage.

SOVA does not require a user account or use a cloud database to store personal session history.

Users can export their local data in CSV or JSON format.

The Delete all data option removes locally stored sessions, check-ins, notes, settings, profile information and the saved API key.

Local data is kept until the user chooses to delete it.

Deleting SOVA's local data does not itself delete information that may have been processed or retained by Presage under its own policies.

SDK diagnostic telemetry

SOVA configures the SDK's diagnostic telemetry to be disabled by default.

Users can choose to enable anonymous SDK diagnostics in Settings.

According to Presage's documentation, diagnostic telemetry concerns information such as SDK performance, session outcomes and measurement-quality warnings.

It is separate from the physiological measurements sent through the SDK's AI Insights functionality.

Optional AI reflections

SOVA also provides user-controlled AI reflections through Presage's requestInsight functionality.

These are disabled by default.

When the user enables the feature and requests an AI check-in, SOVA can send relevant session context and buffered physiological measurements to Presage for an AI-generated response.

SOVA can also request a reflection at the end of an eligible session when the feature is enabled.

These responses are labelled as AI-generated and may be inaccurate.

They are intended for personal reflection, not medical interpretation.

The difference is that SOVA's additional, user-facing AI reflections are optional, while the SDK's documented automatic vitals Insights processing is a separate behaviour.

I think it's important to explain this distinction rather than simply saying that all AI processing is disabled.

Optional microphone access

SOVA has an optional breath sound analysis feature.

It requires separate permission and is used during breathing resets.

The feature uses sound measurements to help estimate breath timing and exhale duration.

SOVA does not record, save or upload microphone audio.

Only the derived results needed for the experience are kept locally.

Retention, deletion and privacy limits

SOVA stores its own history locally until the user deletes it.

Presage's SDK and associated services have their own data-processing arrangements, described in the official SmartSpectra documentation and Presage privacy policy.

I wanted to be clear about that distinction because local storage in SOVA does not mean the SDK operates entirely without network communication.

Not a medical application

SOVA is a personal focus and self-reflection tool.

It is not a medical device and does not diagnose health conditions, provide treatment advice or determine whether someone is stressed.

Camera-based measurements can be affected by lighting, movement, framing and other conditions.

The application is designed to communicate uncertainty rather than present unreliable information as fact.

Final Thoughts

When I started building SOVA, I wasn't trying to create another productivity tracker.

I wanted something that could help me pay a little more attention to myself while I work.

The Presage SmartSpectra SDK made it possible to measure breathing and cardiovascular signals using a webcam, without asking people to buy additional hardware.

The bigger challenge was deciding what to do with those measurements.

I spent time thinking about when SOVA should speak, when it should stay quiet, and how it should respond when the SDK doesn't have reliable information.

I wanted the application to feel calm, useful and respectful of the person using it.

There's still room to improve it, and I plan to explore an Android version using the same shared focus and recovery rules.

For now, SOVA is my attempt at making long hours in front of a screen a little more manageable.


Top comments (0)