<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>VoiceMode - Voice for Claude</title>
<meta name="description" content="VoiceMode now works across the entire Claude platform. Add natural voice conversations to Claude Code, Claude Cowork, Claude Desktop, Claude.ai, and Claude Mobile.">
<style>
:root {
--bg-primary: #0a0a0a;
--bg-secondary: #141414;
--bg-tertiary: #1a1a1a;
--bg-code: #0d0d0d;
--text-primary: #e8e8e8;
--text-secondary: #999999;
--text-tertiary: #666666;
--accent: #00c896;
--accent-hover: #00b082;
--accent-muted: #00c89633;
--accent-alt: #ff7979;
--border: #2a2a2a;
--border-subtle: #1f1f1f;
--text-xs: 0.75rem;
--text-sm: 0.875rem;
--text-base: 1rem;
--text-lg: 1.333rem;
--text-xl: 1.777rem;
--text-2xl: 2.369rem;
--text-3xl: 3.157rem;
--space-2: 0.5rem;
--space-3: 0.75rem;
--space-4: 1rem;
--space-5: 1.5rem;
--space-6: 2rem;
--space-8: 3rem;
--transition-base: 250ms;
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', 'Roboto', 'Ubuntu', sans-serif;
background-color: var(--bg-primary);
color: var(--text-primary);
font-size: var(--text-base);
line-height: 1.7;
letter-spacing: -0.011em;
-webkit-font-smoothing: antialiased;
min-height: 100vh;
background-image:
radial-gradient(circle at 10% 20%, rgba(0, 212, 170, 0.08) 0%, transparent 50%),
radial-gradient(circle at 80% 80%, rgba(255, 107, 107, 0.08) 0%, transparent 50%);
}
body::before {
content: '';
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image:
repeating-linear-gradient(
0deg,
transparent,
transparent 2px,
rgba(255, 255, 255, 0.01) 2px,
rgba(255, 255, 255, 0.01) 4px
);
pointer-events: none;
z-index: 1;
}
.container {
max-width: 800px;
margin: 0 auto;
padding: var(--space-6) var(--space-5);
position: relative;
z-index: 2;
}
header {
text-align: center;
padding: var(--space-8) 0 var(--space-4) 0;
margin-bottom: 0;
}
h1 {
font-size: var(--text-3xl);
font-weight: 300;
letter-spacing: -0.03em;
line-height: 1.1;
margin-bottom: var(--space-3);
color: var(--text-primary);
}
.tagline {
color: var(--text-secondary);
font-size: var(--text-lg);
margin-bottom: var(--space-5);
font-family: 'Cascadia Code', 'SF Mono', monospace;
}
.github-link {
position: absolute;
top: var(--space-5);
right: var(--space-5);
color: var(--text-tertiary);
text-decoration: none;
transition: color var(--transition-base);
z-index: 10;
}
.github-link:hover {
color: var(--accent);
}
.product-bar {
display: flex;
justify-content: center;
align-items: center;
gap: var(--space-3);
flex-wrap: wrap;
margin-bottom: var(--space-8);
font-family: 'Cascadia Code', 'SF Mono', monospace;
font-size: var(--text-sm);
color: var(--text-secondary);
}
.product-bar .dot {
width: 4px;
height: 4px;
background-color: var(--accent);
border-radius: 50%;
}
section {
margin-bottom: var(--space-8);
}
h2 {
font-size: var(--text-xl);
font-weight: 400;
margin-bottom: var(--space-5);
color: var(--accent);
}
/* Accordion Product Cards */
.product-accordion {
display: flex;
flex-direction: column;
gap: var(--space-4);
}
.product-item {
background-color: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: 8px;
overflow: hidden;
transition: all var(--transition-base) var(--ease-out);
}
.product-item:hover {
border-color: var(--accent);
}
.product-item.expanded {
border-color: var(--accent);
box-shadow: 0 0 20px var(--accent-muted);
}
.product-header {
display: flex;
align-items: center;
gap: var(--space-4);
padding: var(--space-4) var(--space-5);
cursor: pointer;
user-select: none;
}
.product-thumbnail {
width: 80px;
height: 50px;
background-color: var(--bg-tertiary);
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
position: relative;
overflow: hidden;
}
.product-thumbnail::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 0;
height: 0;
border-left: 12px solid var(--accent);
border-top: 8px solid transparent;
border-bottom: 8px solid transparent;
opacity: 0.8;
}
.product-thumbnail svg {
color: var(--accent);
opacity: 0.6;
}
.product-info {
flex: 1;
}
.product-info h3 {
font-size: var(--text-lg);
color: var(--text-primary);
font-weight: 500;
margin-bottom: var(--space-2);
}
.product-info p {
font-size: var(--text-sm);
color: var(--text-secondary);
margin: 0;
line-height: 1.5;
}
.expand-indicator {
color: var(--text-tertiary);
transition: transform var(--transition-base);
}
.product-item.expanded .expand-indicator {
transform: rotate(180deg);
}
.product-content {
max-height: 0;
overflow: hidden;
transition: max-height 0.4s var(--ease-out);
}
.product-item.expanded .product-content {
max-height: 500px;
}
.product-video {
padding: 0 var(--space-5) var(--space-5) var(--space-5);
}
.video-container {
position: relative;
width: 100%;
padding-bottom: 56.25%;
background-color: var(--bg-code);
border-radius: 8px;
overflow: hidden;
}
.video-container iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
/* Mobile dual video layout */
.mobile-video-container {
display: flex;
gap: var(--space-4);
justify-content: center;
}
.mobile-video-container .video-portrait {
width: calc(50% - var(--space-2));
max-width: 200px;
position: relative;
padding-bottom: 0;
aspect-ratio: 9/16;
background-color: var(--bg-code);
border-radius: 8px;
overflow: hidden;
}
.mobile-video-container .video-portrait iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.video-placeholder {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
color: var(--text-tertiary);
font-size: var(--text-sm);
font-family: 'Cascadia Code', monospace;
}
/* Code block */
.code-block {
background-color: var(--bg-code);
border: 1px solid var(--border);
border-radius: 8px;
padding: var(--space-5);
margin: var(--space-5) 0;
overflow-x: auto;
font-family: 'Cascadia Code', 'SF Mono', 'Monaco', 'Inconsolata', monospace;
font-size: var(--text-sm);
line-height: 1.6;
}
.code-block code {
color: var(--text-primary);
display: block;
}
.comment {
color: var(--text-tertiary);
font-style: italic;
}
/* Links */
.links {
display: flex;
gap: var(--space-6);
margin-top: var(--space-6);
flex-wrap: wrap;
}
.links a {
color: var(--accent);
text-decoration: none;
display: inline-flex;
align-items: center;
gap: var(--space-2);
transition: color var(--transition-base);
}
.links a:hover {
color: var(--accent-hover);
}
p a {
color: var(--accent);
text-decoration: none;
border-bottom: 1px dotted var(--accent);
}
p a:hover {
border-bottom-style: solid;
}
footer {
margin-top: var(--space-8);
padding-top: var(--space-6);
border-top: 1px solid var(--border);
text-align: center;
color: var(--text-secondary);
font-size: var(--text-sm);
}
footer a {
color: var(--accent);
text-decoration: none;
}
footer a:hover {
text-decoration: underline;
}
/* Focus styles */
a:focus, button:focus {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
/* Reduced motion */
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
@media (max-width: 600px) {
h1 {
font-size: var(--text-2xl);
}
.container {
padding: var(--space-5) var(--space-4);
}
.product-header {
flex-wrap: wrap;
}
.product-thumbnail {
width: 60px;
height: 38px;
}
.links {
flex-direction: column;
gap: var(--space-3);
}
.mobile-video-container {
flex-direction: column;
align-items: center;
}
.mobile-video-container .video-portrait {
width: 100%;
max-width: 280px;
}
}
</style>
</head>
<body>
<div class="container">
<a href="https://github.com/mbailey/voicemode" class="github-link" title="View on GitHub">
<svg width="20" height="20" viewBox="0 0 16 16" fill="currentColor">
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/>
</svg>
</a>
<header>
<h1>VoiceMode</h1>
<p class="tagline">Natural voice conversations with Claude</p>
</header>
<div class="product-bar">
<span>Claude.ai</span>
<span class="dot"></span>
<span>Claude Code</span>
<span class="dot"></span>
<span>Claude Cowork</span>
<span class="dot"></span>
<span>Claude Desktop</span>
<span class="dot"></span>
<span>Claude Mobile</span>
</div>
<section>
<h2>Choose Your Claude</h2>
<div class="product-accordion">
<div class="product-item" onclick="toggleProduct(this)">
<div class="product-header">
<div class="product-thumbnail">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<circle cx="12" cy="12" r="10"></circle>
<line x1="2" y1="12" x2="22" y2="12"></line>
<path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"></path>
</svg>
</div>
<div class="product-info">
<h3>Claude.ai</h3>
<p>Voice interaction on the web</p>
</div>
<div class="expand-indicator">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</div>
</div>
<div class="product-content">
<div class="product-video">
<div class="video-container">
<div class="video-placeholder">Demo coming soon</div>
</div>
</div>
</div>
</div>
<div class="product-item" onclick="toggleProduct(this)">
<div class="product-header">
<div class="product-thumbnail">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<polyline points="16 18 22 12 16 6"></polyline>
<polyline points="8 6 2 12 8 18"></polyline>
</svg>
</div>
<div class="product-info">
<h3>Claude Code</h3>
<p>Voice-enabled pair programming in your terminal</p>
</div>
<div class="expand-indicator">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</div>
</div>
<div class="product-content">
<div class="product-video">
<div class="video-container">
<iframe
src="https://www.youtube.com/embed/cYdwOD_-dQc"
title="VoiceMode with Claude Code"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen>
</iframe>
</div>
</div>
</div>
</div>
<div class="product-item" onclick="toggleProduct(this)">
<div class="product-header">
<div class="product-thumbnail">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
<circle cx="9" cy="7" r="4"></circle>
<path d="M23 21v-2a4 4 0 0 0-3-3.87"></path>
<path d="M16 3.13a4 4 0 0 1 0 7.75"></path>
</svg>
</div>
<div class="product-info">
<h3>Claude Cowork</h3>
<p>Enterprise collaboration with voice</p>
</div>
<div class="expand-indicator">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</div>
</div>
<div class="product-content">
<div class="product-video">
<div class="video-container">
<div class="video-placeholder">Demo coming soon</div>
</div>
</div>
</div>
</div>
<div class="product-item" onclick="toggleProduct(this)">
<div class="product-header">
<div class="product-thumbnail">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<rect x="2" y="3" width="20" height="14" rx="2" ry="2"></rect>
<line x1="8" y1="21" x2="16" y2="21"></line>
<line x1="12" y1="17" x2="12" y2="21"></line>
</svg>
</div>
<div class="product-info">
<h3>Claude Desktop</h3>
<p>Natural conversations with your desktop assistant</p>
</div>
<div class="expand-indicator">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</div>
</div>
<div class="product-content">
<div class="product-video">
<div class="video-container">
<div class="video-placeholder">Demo coming soon</div>
</div>
</div>
</div>
</div>
<div class="product-item" onclick="toggleProduct(this)">
<div class="product-header">
<div class="product-thumbnail">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<rect x="5" y="2" width="14" height="20" rx="2" ry="2"></rect>
<line x1="12" y1="18" x2="12.01" y2="18"></line>
</svg>
</div>
<div class="product-info">
<h3>Claude Mobile</h3>
<p>Voice on iOS and Android</p>
</div>
<div class="expand-indicator">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</div>
</div>
<div class="product-content">
<div class="product-video">
<div class="mobile-video-container">
<div class="video-portrait">
<div class="video-placeholder">iOS demo</div>
</div>
<div class="video-portrait">
<div class="video-placeholder">Android demo</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section>
<h2>Getting Started</h2>
<div class="code-block">
<span class="comment"># Install VoiceMode</span><br>
curl -LsSf https://astral.sh/uv/install.sh | sh<br>
uvx voice-mode-install<br><br>
<span class="comment"># Add to Claude</span><br>
claude mcp add --scope user voicemode -- uvx --refresh voice-mode
</div>
<p>
For platform-specific setup, see the <a href="https://github.com/mbailey/voicemode/blob/main/docs/tutorials/getting-started.md">Getting Started Guide</a>.
</p>
</section>
<section>
<h2>Resources</h2>
<div class="links">
<a href="https://github.com/mbailey/voicemode">
<svg width="20" height="20" viewBox="0 0 16 16" fill="currentColor">
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/>
</svg>
GitHub
</a>
<a href="https://pypi.org/project/voice-mode/">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M21 16V8a2 2 0 00-1-1.73l-7-4a2 2 0 00-2 0l-7 4A2 2 0 003 8v8a2 2 0 001 1.73l7 4a2 2 0 002 0l7-4A2 2 0 0021 16z"/>
</svg>
PyPI
</a>
<a href="https://github.com/mbailey/voicemode/blob/main/docs/tutorials/getting-started.md">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"></path>
<path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"></path>
</svg>
Docs
</a>
</div>
</section>
<footer>
<p>
<a href="https://getvoicemode.com">getvoicemode.com</a> · <a href="https://github.com/mbailey/voicemode">GitHub</a> · A <a href="https://failmode.com">Failmode</a> Project · MIT Licensed
</p>
</footer>
</div>
<script>
function toggleProduct(element) {
// Close other expanded items
document.querySelectorAll('.product-item.expanded').forEach(item => {
if (item !== element) {
item.classList.remove('expanded');
}
});
// Toggle clicked item
element.classList.toggle('expanded');
}
</script>
<!-- Goatcounter Analytics -->
<script data-goatcounter="https://getvoicemode.goatcounter.com/count"
async src="//gc.zgo.at/count.js"></script>
<noscript>
<img src="https://getvoicemode.goatcounter.com/count?p=/claude">
</noscript>
</body>
</html>