Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
fe649eb
fix: update CI badge in README to reflect current branch
pedrovsiqueira Dec 17, 2025
883b214
feat: add Privacy Policy & Terms page and update README for privacy d…
pedrovsiqueira Dec 18, 2025
093d79f
feat: add support section with donation links to README
pedrovsiqueira Dec 18, 2025
058b76c
refactor: change default exports to named exports for consistency
pedrovsiqueira Dec 18, 2025
4e20511
feat: add ErrorMessage, TranscriptionActions, and TranscriptionProgre…
pedrovsiqueira Dec 18, 2025
39764d3
test: move test files
pedrovsiqueira Dec 18, 2025
f12d01a
feat: add .nvmrc file and update package.json with node engine requir…
pedrovsiqueira Dec 18, 2025
fd70369
test: refactor SystemWarning tests to use act for event handling and …
pedrovsiqueira Dec 18, 2025
4cc92bb
feat: implement ErrorBoundary component with error handling UI and st…
pedrovsiqueira Dec 18, 2025
c7891a5
refactor: split TranscriptionContext for performance
pedrovsiqueira Dec 18, 2025
8165059
refactor: add centralized logger service
pedrovsiqueira Dec 18, 2025
82b0616
feat: integrate FFmpeg availability checks into transcription components
pedrovsiqueira Dec 18, 2025
9f517c1
feat: refactor transcription and menu handling to use centralized ele…
pedrovsiqueira Dec 18, 2025
2eeba4c
feat: implement useFFmpegStatus hook
pedrovsiqueira Dec 18, 2025
8b6f31d
feat: refactor SystemWarning and SettingsPanel to use updated service…
pedrovsiqueira Dec 18, 2025
9dde448
feat: enhance electronAPI tests with additional functionality checks …
pedrovsiqueira Dec 18, 2025
6bcb9fa
feat: add debug logs modal and integrate logging functionality across…
pedrovsiqueira Dec 18, 2025
86b2266
refactor: update SettingsPanel to use new components and improve stru…
pedrovsiqueira Dec 18, 2025
840dd0e
feat: implement sanitizePath utility and update logging in various co…
pedrovsiqueira Dec 18, 2025
cb9ed0b
refactor: update component exports to use named exports for consistency
pedrovsiqueira Dec 18, 2025
3d616dc
feat: add TypeScript build artifacts to .gitignore for improved proje…
pedrovsiqueira Dec 18, 2025
bdc2232
fix: update DMG background color for improved visibility
pedrovsiqueira Dec 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,12 @@ DEVELOPMENT_PLAN.md
# Copilot Instructions
.github/copilot-instructions.md

*.tsbuildinfo
*.tsbuildinfo

# TypeScript build artifacts (config files)
vite.config.js
vite.config.d.ts
tsup.config.js
tsup.config.d.ts
vitest.config.js
vitest.config.d.ts
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
22.12.0
24 changes: 18 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 🎙️ WhisperDesk

[![CI](https://github.com/PVAS-Development/whisperdesk/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/PVAS-Development/whisperdesk/actions/workflows/ci.yml)
[![Downloads](https://img.shields.io/github/downloads/PVAS-Development/whisperdesk/total.svg)](https://github.com/PVAS-Development/whisperdesk/releases)
[![Release Version](https://img.shields.io/github/v/release/PVAS-Development/whisperdesk?label=release&logo=github)](https://github.com/PVAS-Development/whisperdesk/releases)
[![Lint](https://img.shields.io/badge/lint-passing-brightgreen.svg?logo=eslint&logoColor=white)](https://github.com/PVAS-Development/whisperdesk/actions/workflows/ci.yml)
[![Stars](https://img.shields.io/github/stars/PVAS-Development/whisperdesk?style=social)](https://github.com/PVAS-Development/whisperdesk/stargazers)
Expand Down Expand Up @@ -136,7 +136,7 @@ Models are downloaded automatically on first use and cached in:

### Prerequisites

- Node.js 18+
- Node.js 22.12+ (use `nvm use` to auto-switch via `.nvmrc`)
- CMake (for building whisper.cpp)
- FFmpeg

Expand Down Expand Up @@ -348,11 +348,23 @@ Contributions are welcome! Please see our [Contributing Guide](CONTRIBUTING.md)
- Code style and commit conventions
- Submitting pull requests

## 🔒 Security
## 🔒 Privacy & Security

- All audio/video processing happens **locally** on your device
- No data is sent to external servers
- The app is **code-signed and notarized** by Apple
- **Local Processing**: All audio/video processing happens **locally** on your device. Your files never leave your computer.
- **No Cloud Uploads**: We do not upload your media files or transcriptions to any server.
- **Anonymous Analytics**: We collect minimal, anonymous usage data (e.g., app launches, feature usage) to improve the app. No personal data or file content is collected.
- **Code Signing**: The app is **code-signed and notarized** by Apple for your safety.

For more details, please read our [Privacy Policy](https://whisperdesk.org/privacy.html).

## ☕ Support the Project

WhisperDesk is free and open-source software. If you find it useful, please consider supporting its development:

- [**Donate via PayPal**](https://www.paypal.com/donate/?hosted_button_id=HTJXGMEGMWWD6)
- [**Buy me a coffee**](https://www.buymeacoffee.com/pedrovsiqueira)

Your support helps cover the costs of Apple Developer Program fees and keeps the project alive!

## 📄 License

Expand Down
1 change: 1 addition & 0 deletions docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,7 @@ <h2 id="opensource-title" class="opensource-title">Open Source & Community Drive
rel="noopener noreferrer" class="footer-link">License</a>
<a href="https://github.com/PVAS-Development/whisperdesk/blob/main/CONTRIBUTING.md" target="_blank"
rel="noopener noreferrer" class="footer-link">Contributing</a>
<a href="privacy.html" class="footer-link">Privacy & Terms</a>
<a href="https://github.com/PVAS-Development/whisperdesk" target="_blank" rel="noopener noreferrer"
class="footer-link">GitHub</a>
</nav>
Expand Down
184 changes: 184 additions & 0 deletions docs/privacy.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Privacy Policy & Terms - WhisperDesk</title>
<meta name="description" content="Privacy Policy and Terms of Service for WhisperDesk. We prioritize your privacy with local-only processing.">
<link rel="stylesheet" href="styles.css">
<link rel="icon" type="image/png" href="icon.png">
<script src="https://unpkg.com/lucide@latest"></script>
<style>
.policy-container {
max-width: 800px;
margin: 0 auto;
padding: 4rem 1.5rem;
}

.policy-section {
margin-bottom: 3rem;
}

.policy-section h2 {
font-size: 1.8rem;
margin-bottom: 1.5rem;
color: var(--text-primary);
}

.policy-section h3 {
font-size: 1.4rem;
margin: 1.5rem 0 1rem;
color: var(--text-primary);
}

.policy-section p {
margin-bottom: 1rem;
line-height: 1.7;
color: var(--text-secondary);
}

.policy-section ul {
margin-bottom: 1rem;
padding-left: 1.5rem;
color: var(--text-secondary);
}

.policy-section li {
margin-bottom: 0.5rem;
line-height: 1.6;
}

.back-link {
display: inline-flex;
align-items: center;
gap: 0.5rem;
color: var(--text-secondary);
text-decoration: none;
margin-bottom: 2rem;
font-weight: 500;
transition: color 0.2s;
}

.back-link:hover {
color: var(--accent);
}
</style>
</head>

<body>
<nav class="navbar" role="navigation" aria-label="Main navigation">
<div class="container nav-inner">
<a href="index.html" class="logo" aria-label="WhisperDesk Home">
<img src="icon.png" alt="WhisperDesk Logo" width="32" height="32" />
<span class="logo-text">WhisperDesk</span>
</a>
<div class="nav-actions">
<button id="theme-toggle" class="theme-toggle" aria-label="Toggle dark mode">
<i data-lucide="moon" class="moon-icon" aria-hidden="true"></i>
<i data-lucide="sun" class="sun-icon" aria-hidden="true"></i>
</button>
</div>
</div>
</nav>

<main class="policy-container">
<a href="index.html" class="back-link">
<i data-lucide="arrow-left" style="width: 18px; height: 18px;"></i>
Back to Home
</a>

<h1 style="font-size: 2.5rem; margin-bottom: 0.5rem; color: var(--text-primary);">Privacy Policy & Terms</h1>
<p style="color: var(--text-muted); margin-bottom: 3rem;">Last updated: December 17, 2025</p>

<section class="policy-section">
<h2>Privacy Policy</h2>
<p>At WhisperDesk, we believe your data belongs to you. Our application is designed with privacy as its core principle.</p>

<h3>1. Local Processing</h3>
<p><strong>All audio and video transcription is performed locally on your device.</strong></p>
<p>WhisperDesk uses the <code>whisper.cpp</code> engine to process files directly on your Mac. Your audio files, video files, and transcriptions are <strong>never</strong> uploaded to any cloud server or third-party service for processing. They never leave your computer.</p>

<h3>2. Data Collection</h3>
<p>We collect anonymous usage data to help us improve the application, fix bugs, and understand which features are most valuable to our users. This data is collected via <strong>Aptabase</strong>, a privacy-first analytics provider that is fully GDPR, CCPA, and PECR compliant.</p>

<h3>3. What We Collect</h3>
<ul>
<li><strong>App Lifecycle:</strong> When the app is opened or closed.</li>
<li><strong>Feature Usage:</strong> Anonymous statistics such as "transcription started", "model downloaded", or "export saved".</li>
<li><strong>System Information:</strong> Basic details like your OS version (e.g., macOS 14.0) and App version (e.g., v1.6.2).</li>
<li><strong>Error Logs:</strong> If the app crashes or encounters an error, we receive a log to help us fix it. These logs are <strong>sanitized</strong> to remove any file paths, file names, or personal information before they are sent.</li>
</ul>

<h3>4. What We Do NOT Collect</h3>
<ul>
<li><strong>No File Content:</strong> We never access or transmit the audio/video content you transcribe.</li>
<li><strong>No Transcriptions:</strong> We never access or transmit the text generated by the transcription.</li>
<li><strong>No File Names:</strong> We do not track the names of the files you open.</li>
<li><strong>No Personal Information:</strong> We do not collect your name, email, IP address, or any other personally identifiable information (PII).</li>
</ul>
</section>

<section class="policy-section">
<h2>Terms of Service</h2>

<h3>1. License</h3>
<p>WhisperDesk is open-source software licensed under the <strong>MIT License</strong>. You are free to use, modify, and distribute the software in accordance with the license terms.</p>

<h3>2. Disclaimer</h3>
<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p>

<h3>3. User Responsibility</h3>
<p>You are solely responsible for the content you transcribe using WhisperDesk. Please ensure you have the necessary rights and permissions to process any audio or video files you use with the application.</p>
</section>
</main>

<footer class="footer" role="contentinfo">
<div class="container footer-inner">
<div class="footer-logo">
<img src="icon.png" alt="WhisperDesk Logo" class="footer-logo-img" width="24" height="24" />
<span>WhisperDesk</span>
</div>
<nav class="footer-links" aria-label="Footer navigation">
<a href="https://www.paypal.com/donate/?hosted_button_id=HTJXGMEGMWWD6" target="_blank"
rel="noopener noreferrer" class="footer-link">Donate</a>
<a href="https://www.buymeacoffee.com/pedrovsiqueira" target="_blank"
rel="noopener noreferrer" class="footer-link">Buy me a coffee</a>
<a href="https://github.com/PVAS-Development/whisperdesk/blob/main/LICENSE" target="_blank"
rel="noopener noreferrer" class="footer-link">License</a>
<a href="privacy.html" class="footer-link">Privacy & Terms</a>
<a href="https://github.com/PVAS-Development/whisperdesk" target="_blank" rel="noopener noreferrer"
class="footer-link">GitHub</a>
</nav>
<p class="footer-copyright">© <span id="year"></span> <a href="https://github.com/PVAS-Development"
rel="noopener noreferrer" target="_blank">PVAS Development</a>. WhisperDesk is Open Source (MIT
License).</p>
</div>
</footer>

<script>
lucide.createIcons();

const themeToggle = document.getElementById('theme-toggle');
const html = document.documentElement;

const savedTheme = localStorage.getItem('theme');
const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;

if (savedTheme === 'dark' || (!savedTheme && systemPrefersDark)) {
html.setAttribute('data-theme', 'dark');
}

themeToggle.addEventListener('click', () => {
const currentTheme = html.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';

html.setAttribute('data-theme', newTheme);
localStorage.setItem('theme', newTheme);
lucide.createIcons();
});

document.getElementById('year').textContent = new Date().getFullYear();
</script>
</body>
</html>
Loading