Software Requirements Specification

Introduction

Purpose

This SRS defines MVP requirements for Cleanroom Whisper, an offline audio transcription app.

Scope

Product: Cleanroom Whisper — a minimal desktop app for voice-to-text using whisper.cpp.

In Scope:

  • Record audio from microphone

  • Transcribe using whisper.cpp

  • Store history in SQLite

  • Global hotkeys for hands-free operation

  • System tray for background operation

Out of Scope:

  • Cloud sync, telemetry, auto-updates

  • FLAC compression, MP3/M4A import

  • Audio playback, streaming transcription

  • Word timestamps, speaker diarization

Definitions

Term

Definition

whisper.cpp

C++ implementation of OpenAI’s Whisper model

System tray

OS notification area (menu bar on macOS, taskbar on Windows/Linux)

Overall Description

Product Perspective

Standalone desktop app that shells out to user-installed whisper.cpp. All processing occurs locally with no network connectivity.

See SDD for architecture diagrams and component details.

Constraints

Constraint

Description

Offline-only

Zero network calls at runtime

air-gap ready

Deployable without internet access

Platforms

macOS, Windows, Linux (GNOME requires AppIndicator extension)

UI model

System tray app with native dialogs (no main window)

Dependencies

User installs whisper.cpp and models

Functional Requirements

Priority: Must / Should / Could

Recording

ID

Priority

Title

FR-WHISPER-001

must

Global Hotkey Toggle

FR-WHISPER-002

must

Tray Icon Recording State

FR-WHISPER-003

must

Default Microphone Input

FR-WHISPER-004

must

WAV Audio Format

FR-WHISPER-005

should

Recording Duration Display

FR-WHISPER-006

should

Recording Duration Limit

FR-WHISPER-007

should

Audio Input Device Selection

Traceable Requirements (sphinx-needs directives):

Requirement: Global Hotkey Toggle FR-WHISPER-001
status: approved
tags: whisper, recording, hotkey
priority: must
release: v1.0

Global hotkey toggles recording (start/stop)

Requirement: Tray Icon Recording State FR-WHISPER-002
status: approved
tags: whisper, recording, ui
priority: must
release: v1.0
is tested by: TC-REC-003

Tray icon changes color/state when recording

Requirement: Default Microphone Input FR-WHISPER-003
status: approved
tags: whisper, recording, audio
priority: must
release: v1.0

Audio captured from system default microphone

Requirement: WAV Audio Format FR-WHISPER-004
status: approved
tags: whisper, recording, audio
priority: must
release: v1.0
is tested by: TC-REC-005

Audio saved as WAV (16kHz mono)

Requirement: Recording Duration Display FR-WHISPER-005
status: approved
tags: whisper, recording, ui
priority: should
release: v1.0
is tested by: TC-REC-006

Tray menu shows recording duration while active

Requirement: Recording Duration Limit FR-WHISPER-006
status: approved
tags: whisper, recording
priority: should
release: v1.0
links incoming: UC-WHISPER-003
is tested by: TC-REC-007

Configurable recording duration limit (default: 120 min)

Requirement: Audio Input Device Selection FR-WHISPER-007
status: approved
tags: whisper, recording, audio
priority: should
release: v1.0
is tested by: TC-REC-008

Audio input device selection in settings

Transcription

ID

Priority

Title

FR-WHISPER-008

must

Invoke Whisper.cpp

FR-WHISPER-009

must

Parse Transcription Output

FR-WHISPER-010

must

Transcription Notification

FR-WHISPER-011

must

Transcription Progress Indicator

FR-WHISPER-012

must

Transcription Error Handling

Requirement: Invoke Whisper.cpp FR-WHISPER-008
status: approved
tags: whisper, transcription
priority: must
release: v1.0

On stop, invoke whisper.cpp with configured model

Requirement: Parse Transcription Output FR-WHISPER-009
status: approved
tags: whisper, transcription
priority: must
release: v1.0
is tested by: TC-TRS-002

Parse whisper.cpp stdout for transcription text. The parser SHALL extract plain text lines from stdout, ignoring timestamp prefixes and blank lines. Lines matching the pattern [HH:MM:SS.mmm --> HH:MM:SS.mmm]  <text> SHALL have timestamps stripped.

Requirement: Transcription Notification FR-WHISPER-010
status: approved
tags: whisper, transcription, ui
priority: must
release: v1.0
is tested by: TC-TRS-003

Show notification with transcription preview on completion

Requirement: Transcription Progress Indicator FR-WHISPER-011
status: approved
tags: whisper, transcription, ui
priority: must
release: v1.0
is tested by: TC-TRS-004

Tray icon indicates transcription in progress

Requirement: Transcription Error Handling FR-WHISPER-012
status: approved
tags: whisper, transcription, error
priority: must
release: v1.0
is tested by: TC-TRS-005

Handle transcription errors with system notification

History

ID

Priority

Title

FR-WHISPER-013

must

Save Transcriptions to Database

FR-WHISPER-014

must

Show Recent Transcriptions

FR-WHISPER-015

must

Transcription Menu Preview

FR-WHISPER-016

must

Copy Transcription on Click

FR-WHISPER-017

should

View History Dialog

FR-WHISPER-018

should

Delete Transcription

Requirement: Save Transcriptions to Database FR-WHISPER-013
status: approved
tags: whisper, history, database
priority: must
release: v1.0
is tested by: TC-HIS-001

Save all transcriptions to SQLite

Requirement: Show Recent Transcriptions FR-WHISPER-014
status: approved
tags: whisper, history, ui
priority: must
release: v1.0
links incoming: UC-WHISPER-002
is tested by: TC-HIS-002

Tray menu shows recent transcriptions (newest first)

Requirement: Transcription Menu Preview FR-WHISPER-015
status: approved
tags: whisper, history, ui
priority: must
release: v1.0
is tested by: TC-HIS-003

Menu items show: timestamp and text preview

Requirement: Copy Transcription on Click FR-WHISPER-016
status: approved
tags: whisper, history, clipboard
priority: must
release: v1.0
links incoming: UC-WHISPER-002
is tested by: TC-HIS-004

Click menu item copies full transcription to clipboard

Requirement: View History Dialog FR-WHISPER-017
status: approved
tags: whisper, history, ui
priority: should
release: v1.0
is tested by: TC-HIS-005

“View History” opens native dialog with full list

Requirement: Delete Transcription FR-WHISPER-018
status: approved
tags: whisper, history
priority: should
release: v1.0
is tested by: TC-HIS-006

Delete transcription from history dialog

Output

ID

Priority

Title

FR-WHISPER-019

must

Copy Last Transcription Hotkey

FR-WHISPER-020

should

Export Transcription to File

Requirement: Copy Last Transcription Hotkey FR-WHISPER-019
status: approved
tags: whisper, output, hotkey, clipboard
priority: must
release: v1.0
is tested by: TC-OUT-001

Global hotkey copies most recent transcription

Requirement: Export Transcription to File FR-WHISPER-020
status: approved
tags: whisper, output, file
priority: should
release: v1.0
links incoming: UC-WHISPER-003
is tested by: TC-OUT-002

Export transcription as .txt file from history dialog

Settings

ID

Priority

Title

FR-WHISPER-021

must

Settings Dialog

FR-WHISPER-022

must

Configure Whisper Binary Path

FR-WHISPER-023

must

Configure Model Path

FR-WHISPER-024

must

Path Validation

FR-WHISPER-025

must

Hotkey Configuration

FR-WHISPER-026

should

First-Run Prompt

Requirement: Settings Dialog FR-WHISPER-021
status: approved
tags: whisper, settings, ui
priority: must
release: v1.0
is tested by: TC-SET-001

“Settings” menu item opens native settings dialog

Requirement: Configure Whisper Binary Path FR-WHISPER-022
status: approved
tags: whisper, settings, configuration
priority: must
release: v1.0
is tested by: TC-SET-002

Configure whisper.cpp binary path with file picker

Requirement: Configure Model Path FR-WHISPER-023
status: approved
tags: whisper, settings, configuration
priority: must
release: v1.0
is tested by: TC-SET-003

Configure model file path with file picker

Requirement: Path Validation FR-WHISPER-024
status: approved
tags: whisper, settings, validation
priority: must
release: v1.0
is tested by: TC-SET-004

Validate paths exist and are accessible before save. The system SHALL verify the file exists, is readable, and (for whisper binary) is executable. Validation SHALL run on every save attempt.

Requirement: Hotkey Configuration FR-WHISPER-025
status: approved
tags: whisper, settings, hotkey
priority: must
release: v1.0
links incoming: UC-WHISPER-004
is tested by: TC-SET-005

Configure global hotkeys with conflict detection

Requirement: First-Run Prompt FR-WHISPER-026
status: approved
tags: whisper, settings, ux
priority: should
release: v1.0
is tested by: TC-SET-006

First-run prompt when paths not configured

System Tray

ID

Priority

Title

FR-WHISPER-027

must

Tray Icon Status Display

FR-WHISPER-028

must

Tray Icon Click Toggle

FR-WHISPER-029

must

Tray Menu

FR-WHISPER-030

must

Minimized Tray Start

Requirement: Tray Icon Status Display FR-WHISPER-027
status: approved
tags: whisper, tray, ui
priority: must
release: v1.0
is tested by: TC-TRAY-001

Tray icon shows app status (idle/recording/transcribing)

Requirement: Tray Icon Click Toggle FR-WHISPER-028
status: approved
tags: whisper, tray, ui
priority: must
release: v1.0
is tested by: TC-TRAY-002

Left-click tray icon toggles recording

Requirement: Tray Menu FR-WHISPER-029
status: approved
tags: whisper, tray, ui
priority: must
release: v1.0
is tested by: TC-TRAY-003

Right-click shows menu: Recent items, Settings, Quit

Requirement: Minimized Tray Start FR-WHISPER-030
status: approved
tags: whisper, tray, ui
priority: must
release: v1.0
is tested by: TC-TRAY-004

App starts minimized to tray (no main window)

Security

ID

Priority

Title

FR-WHISPER-031

must

Path Sanitization

FR-WHISPER-032

must

Parameterized Queries

FR-WHISPER-033

must

No Network Calls

Requirement: Path Sanitization FR-WHISPER-031
status: approved
tags: whisper, security
priority: must
release: v1.0
is tested by: TC-SEC-001

Sanitize file paths: reject paths containing .. (path traversal), resolve symlinks to their target, and convert to absolute paths before use

Requirement: Parameterized Queries FR-WHISPER-032
status: approved
tags: whisper, security, database
priority: must
release: v1.0
is tested by: TC-SEC-002

Use parameterized database queries

Requirement: No Network Calls FR-WHISPER-033
status: approved
tags: whisper, security, privacy
priority: must
release: v1.0

No network calls under any circumstance

Deployment

ID

Priority

Title

FR-WHISPER-034

must

Offline Build Dependencies

FR-WHISPER-035

must

Internet-Free Build

FR-WHISPER-036

should

Single-Directory Deployment

Requirement: Offline Build Dependencies FR-WHISPER-034
status: approved
tags: whisper, deployment
priority: must
release: v1.0
is tested by: TC-DEP-001

All dependencies available for offline build

Requirement: Internet-Free Build FR-WHISPER-035
status: approved
tags: whisper, deployment
priority: must
release: v1.0
is tested by: TC-DEP-002

Build process works without internet after initial setup

Requirement: Single-Directory Deployment FR-WHISPER-036
status: approved
tags: whisper, deployment
priority: should
release: v1.0
is tested by: TC-DEP-003

Single-directory deployment (app + whisper.cpp + model)

Non-Functional Requirements

ID

Priority

Title

NFR-WHISPER-001

must

App Launch Time

NFR-WHISPER-002

must

Memory Footprint

NFR-WHISPER-003

must

Privacy Guarantee

NFR-WHISPER-004

must

Offline Functionality

NFR-WHISPER-005

must

Air-Gap Deployment

NFR-WHISPER-006

should

System Theme Support

NFR-WHISPER-007

should

Transcription Performance

NFR-WHISPER-008

must

Audio File Integrity

NFR-WHISPER-009

must

Database Transaction Safety

NFR-WHISPER-010

must

Graceful Whisper.cpp Failure

NFR-WHISPER-011

should

Hotkey Registration Recovery

NFR-WHISPER-012

must

Notification Clarity

NFR-WHISPER-013

must

Tray Icon State Visibility

NFR-WHISPER-014

should

Settings Discoverability

NFR-WHISPER-015

should

First-Time Setup

NFR-WHISPER-016

must

Test Coverage

NFR-WHISPER-017

must

API Documentation

NFR-WHISPER-018

must

Clippy Compliance

NFR-WHISPER-019

must

Code Formatting

NFR-WHISPER-020

must

Platform-Specific Tray Support

NFR-WHISPER-021

must

Audio Device Compatibility

NFR-WHISPER-022

should

Database Growth Handling

NFR-WHISPER-023

should

Long Audio Support

NFR-WHISPER-024

should

Large Transcription Handling

NFR-WHISPER-025

could

Local Data Encryption

Performance

Non-Functional Requirement: App Launch Time NFR-WHISPER-001
status: approved
tags: whisper, performance
priority: must
release: v1.0
is tested by: TC-NFR-001

App launch time < 2 seconds

Non-Functional Requirement: Memory Footprint NFR-WHISPER-002
status: approved
tags: whisper, performance
priority: must
release: v1.0
is tested by: TC-NFR-002

Memory footprint < 100 MB (excluding whisper.cpp)

Non-Functional Requirement: Transcription Performance NFR-WHISPER-007
status: approved
tags: whisper, performance, transcription
priority: should
release: v1.0
is tested by: TC-NFR-007

Transcription completion time SHALL be within 2x the recording duration

Reliability

Non-Functional Requirement: Audio File Integrity NFR-WHISPER-008
status: approved
tags: whisper, reliability, audio
priority: must
release: v1.0
is tested by: TC-NFR-008

The system SHALL verify WAV file integrity before transcription

Non-Functional Requirement: Database Transaction Safety NFR-WHISPER-009
status: approved
tags: whisper, reliability, database
priority: must
release: v1.0
is tested by: TC-NFR-009

Database operations SHALL use transactions to prevent data loss

Non-Functional Requirement: Graceful Whisper.cpp Failure NFR-WHISPER-010
status: approved
tags: whisper, reliability, error-handling
priority: must
release: v1.0
is tested by: TC-NFR-010

The system SHALL handle whisper.cpp crashes gracefully without losing audio

Non-Functional Requirement: Hotkey Registration Recovery NFR-WHISPER-011
status: approved
tags: whisper, reliability, hotkeys
priority: should
release: v1.0
is tested by: TC-NFR-011

The system SHALL detect and recover from hotkey registration failures

Usability

Non-Functional Requirement: System Theme Support NFR-WHISPER-006
status: approved
tags: whisper, ui, accessibility
priority: should
release: v1.0
is tested by: TC-NFR-004

Follow system theme (dark/light)

Non-Functional Requirement: Notification Clarity NFR-WHISPER-012
status: approved
tags: whisper, usability, notifications
priority: must
release: v1.0
is tested by: TC-NFR-012

System notifications SHALL include clear status and transcription preview

Non-Functional Requirement: Tray Icon State Visibility NFR-WHISPER-013
status: approved
tags: whisper, usability, tray
priority: must
release: v1.0
is tested by: TC-NFR-013

Tray icon SHALL clearly indicate app state (idle/recording/transcribing)

Non-Functional Requirement: Settings Discoverability NFR-WHISPER-014
status: approved
tags: whisper, usability, settings
priority: should
release: v1.0
is tested by: TC-NFR-014

Settings dialog SHALL provide clear labels and validation feedback

Non-Functional Requirement: First-Time Setup NFR-WHISPER-015
status: approved
tags: whisper, usability, setup
priority: should
release: v1.0
is tested by: TC-NFR-015

First-time users SHALL be guided to configure whisper.cpp path via clear prompts

Maintainability

Non-Functional Requirement: Test Coverage NFR-WHISPER-016
status: approved
tags: whisper, maintainability, testing
priority: must
release: v1.0
is tested by: TC-NFR-016

The codebase SHALL achieve at least 80% test coverage

Non-Functional Requirement: API Documentation NFR-WHISPER-017
status: approved
tags: whisper, maintainability, documentation
priority: must
release: v1.0
is tested by: TC-NFR-017

All public APIs SHALL have rustdoc documentation

Non-Functional Requirement: Clippy Compliance NFR-WHISPER-018
status: approved
tags: whisper, maintainability, code-quality
priority: must
release: v1.0
is tested by: TC-NFR-018

The code SHALL pass cargo clippy with zero warnings

Non-Functional Requirement: Code Formatting NFR-WHISPER-019
status: approved
tags: whisper, maintainability, code-quality
priority: must
release: v1.0
is tested by: TC-NFR-019

The code SHALL be formatted with rustfmt

Portability

Non-Functional Requirement: Platform-Specific Tray Support NFR-WHISPER-020
status: approved
tags: whisper, portability, tray
priority: must
release: v1.0
is tested by: TC-NFR-020

The system SHALL support native tray icons on macOS, Windows, Linux (GNOME with AppIndicator)

Non-Functional Requirement: Audio Device Compatibility NFR-WHISPER-021
status: approved
tags: whisper, portability, audio
priority: must
release: v1.0
is tested by: TC-NFR-021

The system SHALL work with standard audio input devices across all platforms

Scalability

Non-Functional Requirement: Database Growth Handling NFR-WHISPER-022
status: approved
tags: whisper, scalability, database
priority: should
release: v1.0
is tested by: TC-NFR-022

The system SHALL handle databases with 10,000+ transcriptions without performance degradation

Non-Functional Requirement: Long Audio Support NFR-WHISPER-023
status: approved
tags: whisper, scalability, audio
priority: should
release: v1.0
is tested by: TC-NFR-023

The system SHALL support audio recordings up to 120 minutes.

Note

The SDD allows configuration up to 480 minutes; this NFR establishes the minimum supported duration.

Non-Functional Requirement: Large Transcription Handling NFR-WHISPER-024
status: approved
tags: whisper, scalability, transcription
priority: should
release: v1.0
is tested by: TC-NFR-024

The system SHALL handle transcriptions with 50,000+ characters

Security & Privacy

Non-Functional Requirement: Privacy Guarantee NFR-WHISPER-003
status: approved
tags: whisper, privacy, security
priority: must
release: v1.0
is tested by: TC-NFR-005

All data stays on user’s machine; no network calls, no telemetry

Non-Functional Requirement: Local Data Encryption NFR-WHISPER-025
status: approved
tags: whisper, security, database
priority: could
release: v1.0
is tested by: TC-NFR-025

The system COULD support optional SQLite encryption for sensitive transcriptions

Deployment

Non-Functional Requirement: Offline Functionality NFR-WHISPER-004
status: approved
tags: whisper, offline
priority: must
release: v1.0
is tested by: TC-SEC-005, TC-NFR-006

100% functional offline

Non-Functional Requirement: Air-Gap Deployment NFR-WHISPER-005
status: approved
tags: whisper, deployment, offline
priority: must
release: v1.0
is tested by: TC-NFR-003

Build and run on systems with no internet access

Error Handling

Scenario

Behavior

Whisper binary not found

Open settings dialog with path field focused

Model file not found

Open settings dialog with path field focused

Whisper process crashes

System notification with error, menu option to retry

Microphone permission denied

System notification explaining how to grant permission

Disk full during recording

Stop recording, save partial, system notification

Hotkey registration failed

System notification, app continues without that hotkey

Hotkey conflict with system

Warning in settings, allow override with confirmation

Appendix: Default Hotkeys

Action

macOS

Windows/Linux

Toggle recording

⌃⌥R

Ctrl+Alt+R

Copy last

⌃⌥C

Ctrl+Alt+C