diff --git a/README.md b/README.md index 40da2b5..799a857 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,14 @@ Blurt logo -

Incredibly fast, accurate voice dictation by AssemblyAI

+

Free, open-source dictation for your Mac

- Open-source Mac dictation that turns speech into polished text in the app - you're already using. + Hold a key, talk, and the words land in whatever you're typing. One tool, + one job. No subscription, no account, no middleman — audio goes straight + from your Mac to AssemblyAI with your own key, and you can read every + line of code that sends it.

@@ -38,7 +40,8 @@

- Free app · Apple Silicon · Bring your own AssemblyAI API key + MIT licensed · No subscription · Signed & notarized · Bring your + own AssemblyAI API key

Blurt — native macOS dictation @@ -16,7 +16,7 @@ @@ -48,11 +48,11 @@ "@context": "https://schema.org", "@type": "SoftwareApplication", "name": "Blurt", - "description": "Incredibly fast, accurate voice dictation by AssemblyAI. Blurt is a small, open-source macOS dictation app for turning speech into text in the app you're already using.", + "description": "Free, open-source dictation for your Mac. Hold a key, talk, and the words land in whatever you're typing. No subscription, no account — bring your own AssemblyAI key.", "url": "https://blurtblurt.com/", "image": "https://blurtblurt.com/assets/blurt-b-icon.png", "applicationCategory": "UtilitiesApplication", - "operatingSystem": "macOS 26.0 or later", + "operatingSystem": "macOS 15.0 or later", "downloadUrl": "https://github.com/AssemblyAI/blurt/releases/latest/download/Blurt.dmg", "offers": { "@type": "Offer", @@ -68,8 +68,8 @@ -
- +
-
- - - Blurt - -

Native macOS dictation

-

Incredibly fast, accurate voice dictation by AssemblyAI

-

- A small, open-source Mac dictation app that turns speech into - polished text in the app you're already using — cued by real Yamaha - DX7 and Roland Juno-106 synths. -

+ + + Blurt + -
    -
  • Built on the world's most accurate transcription model
  • -
  • Works in 18 languages
  • -
  • Blazing fast at <100ms
  • -
+

Free, open-source dictation for your Mac

+

+ Hold a key, talk, and the words land in whatever you're typing. One + tool, one job. No subscription, no account, no middleman — audio goes + straight from your Mac to AssemblyAI with your own key, and you can + read every line of code that sends it. +

+ +
    +
  • Free & open source
  • +
  • MIT licensed
  • +
  • No subscription
  • +
  • Signed & notarized
  • +
- -

- Free for macOS 26+ on Apple Silicon. BYO AssemblyAI key. -

+ +

+ macOS 15+ on Apple Silicon. The + free-tier API key + works. +

-
+
Incredibly fast, accurate voice dictation by AssemblyAI
-
+
+

Features

+

Dictation you can trust

+
+
+

Zero dependencies

+

+ Plain Swift on Apple's frameworks — no packages you've never heard + of, no supply chain to audit. Fork it and make it yours. +

+
+
+

No telemetry

+

+ No analytics, no crash reporting, no accounts. Blurt talks to + exactly one server, and you can read the code that does it. +

+
+
+

Native Mac app

+

+ Not a web page in a window. A small Mac app that starts fast, + stays out of the way, and types into whatever has focus. +

+
+
+

Accurate transcription

+

+ Speech in, clean text out — usually in about a tenth of a second, + with + 30% fewer hallucinations than Whisper. You pay AssemblyAI directly for what you use. +

+
+
+

18 languages

+

+ Dictate in 18 languages, not just English — and code-switch + mid-sentence. The model follows you between languages without + touching a setting. +

+
+
+

Real synth cues

+

+ Start and stop sounds from a real Yamaha DX7 and Roland Juno-106. + There's an off switch, but why would you. +

+
+
+
+
+ + -
+ + diff --git a/site/sitemap.xml b/site/sitemap.xml index 6d6a166..ab1be1d 100644 --- a/site/sitemap.xml +++ b/site/sitemap.xml @@ -2,7 +2,7 @@ https://blurtblurt.com/ - 2026-07-01 + 2026-07-07 monthly 1.0 diff --git a/site/styles.css b/site/styles.css index bd04944..73bbe48 100644 --- a/site/styles.css +++ b/site/styles.css @@ -1,20 +1,24 @@ -/* Blurt — compact pixel-neon landing page */ +/* Blurt — dark, native-app landing page */ :root { - --void: #09090e; - --panel: #14141c; - --panel-2: #20202d; - --line: #2b2b3e; + --void: #0a0a0f; + --panel: #12121a; + --panel-2: #1a1a26; + --line: #26263a; --ice: #00d8ef; --hot: #f32a91; --text: #f4f1ff; - --dim: #aaa8ba; + --dim: #b0aec2; --muted: #767589; - --grad: linear-gradient(180deg, var(--ice) 0%, var(--hot) 100%); + --grad: linear-gradient(135deg, var(--ice) 0%, var(--hot) 100%); --display: "Bricolage Grotesque", system-ui, sans-serif; + --sans: + system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif; --mono: "Space Mono", ui-monospace, "SF Mono", Menlo, monospace; - --pixel: "Silkscreen", var(--mono); + + --container: 1080px; + --radius: 14px; } * { @@ -28,22 +32,15 @@ html { body { margin: 0; background-color: var(--void); - background-image: - radial-gradient( - 1100px 520px at 82% -140px, - rgba(0, 216, 239, 0.09), - transparent 68% - ), - radial-gradient( - 900px 480px at 8% 6%, - rgba(243, 42, 145, 0.07), - transparent 66% - ), - linear-gradient(180deg, var(--void) 0%, #0d0d14 56%, #08080d 100%); + background-image: radial-gradient( + 900px 480px at 50% -180px, + rgba(0, 216, 239, 0.08), + transparent 70% + ); color: var(--text); - font-family: var(--mono); + font-family: var(--sans); font-size: 16px; - line-height: 1.55; + line-height: 1.6; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; overflow-x: clip; @@ -55,7 +52,12 @@ img { } a { - color: inherit; + color: var(--ice); + text-decoration-color: rgba(0, 216, 239, 0.4); +} + +a:hover { + text-decoration-color: var(--ice); } :focus-visible { @@ -64,19 +66,22 @@ a { border-radius: 4px; } -.page { - width: min(1180px, calc(100% - 44px)); - min-height: 100vh; - min-height: 100svh; - margin: 0 auto; - padding: 18px 0 16px; - display: flex; - flex-direction: column; -} - /* ---- Header ---- */ .site-header { + position: sticky; + top: 0; + z-index: 10; + background: rgba(10, 10, 15, 0.82); + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + border-bottom: 1px solid var(--line); +} + +.header-inner { + width: min(var(--container), calc(100% - 44px)); + margin: 0 auto; + padding: 12px 0; display: flex; align-items: center; justify-content: space-between; @@ -87,15 +92,17 @@ a { display: inline-flex; align-items: center; gap: 10px; + color: var(--text); text-decoration: none; - font-family: var(--pixel); - font-size: 0.95rem; - letter-spacing: 0.08em; + font-family: var(--display); + font-weight: 700; + font-size: 1.02rem; + letter-spacing: 0.02em; } .brand-icon { - width: 30px; - height: 30px; + width: 28px; + height: 28px; border-radius: 7px; flex: 0 0 auto; image-rendering: pixelated; @@ -104,7 +111,7 @@ a { .site-nav { display: flex; align-items: center; - gap: 20px; + gap: 22px; font-size: 0.9rem; } @@ -115,101 +122,81 @@ a { } .site-nav a:hover { - color: var(--ice); + color: var(--text); } /* ---- Hero ---- */ .hero { - flex: 1; - display: grid; - grid-template-columns: minmax(360px, 620px) minmax(0, 1fr); - align-items: center; - gap: clamp(32px, 5vw, 64px); - padding: clamp(24px, 5vh, 54px) 0 22px; -} - -.hero-copy { + width: min(var(--container), calc(100% - 44px)); + margin: 0 auto; + padding: clamp(48px, 9vh, 92px) 0 0; display: flex; flex-direction: column; - align-items: flex-start; - gap: 14px; + align-items: center; + text-align: center; } .hero-wordmark { display: block; - width: min(250px, 72vw); - margin-bottom: 6px; + width: min(280px, 74vw); + margin-bottom: 26px; } .wordmark { width: 100%; height: auto; image-rendering: pixelated; - filter: drop-shadow(0 0 24px rgba(243, 42, 145, 0.22)); -} - -.eyebrow { - margin: 0; - color: var(--ice); - font-family: var(--pixel); - font-size: 0.72rem; - letter-spacing: 0.18em; - line-height: 1.1; - text-transform: uppercase; + filter: drop-shadow(0 0 28px rgba(243, 42, 145, 0.2)); } h1 { margin: 0; - max-width: 22ch; + max-width: 20ch; font-family: var(--display); font-weight: 800; - font-size: clamp(1.7rem, 2.6vw, 2.35rem); - line-height: 1.04; - letter-spacing: 0; + font-size: clamp(2rem, 4.6vw, 3.1rem); + line-height: 1.05; + letter-spacing: -0.01em; text-wrap: balance; } .lede { - max-width: 52ch; - margin: 2px 0 0; + max-width: 56ch; + margin: 18px 0 0; color: var(--dim); - font-size: 1.02rem; - line-height: 1.6; + font-size: 1.08rem; text-wrap: pretty; } -.hero-points { - margin: 2px 0 0; +.badges { + margin: 22px 0 0; padding: 0; list-style: none; display: flex; - flex-direction: column; - gap: 7px; - color: var(--dim); - font-size: 0.92rem; - line-height: 1.45; -} - -.hero-points li { - display: flex; - align-items: baseline; + flex-wrap: wrap; + justify-content: center; gap: 10px; - text-align: left; } -.hero-points li::before { - content: "▸"; - color: var(--hot); - font-family: var(--pixel); - font-size: 0.78rem; +.badges li { + padding: 6px 14px; + border: 1px solid var(--line); + border-radius: 999px; + background: var(--panel); + color: var(--dim); + font-family: var(--mono); + font-size: 0.76rem; + letter-spacing: 0.04em; + line-height: 1.4; } .actions { display: flex; flex-wrap: wrap; + justify-content: center; gap: 12px; - margin-top: 10px; + margin-top: 26px; } .button { @@ -217,15 +204,14 @@ h1 { align-items: center; justify-content: center; min-height: 50px; - min-width: 232px; - padding: 14px 24px; + padding: 14px 26px; border: 1px solid var(--line); - border-radius: 9px; + border-radius: 10px; background: var(--panel); color: var(--text); - font-family: var(--mono); - font-weight: 700; - font-size: 0.94rem; + font-family: var(--sans); + font-weight: 600; + font-size: 0.96rem; line-height: 1; text-decoration: none; transition: @@ -247,6 +233,7 @@ h1 { border: 0; background: var(--grad); color: #06060a; + font-weight: 700; box-shadow: 0 18px 44px -18px rgba(243, 42, 145, 0.72); } @@ -255,31 +242,108 @@ h1 { } .fine-print { - margin: 0; + margin: 16px 0 0; color: var(--muted); - font-size: 0.78rem; - line-height: 1.45; + font-size: 0.82rem; } -/* ---- Demo ---- */ +.fine-print a { + color: var(--dim); +} + +/* ---- Screenshots ---- */ .demo { - margin: 0; - width: min(100%, 520px); - justify-self: end; + margin: clamp(40px, 7vh, 64px) 0 0; + width: min(100%, 860px); + padding: 10px; + border: 1px solid var(--line); + border-radius: calc(var(--radius) + 6px); + background: var(--panel); + box-shadow: 0 40px 90px -40px rgba(0, 0, 0, 0.8); } .shot { width: 100%; height: auto; - filter: drop-shadow(0 30px 48px rgba(0, 0, 0, 0.3)); + border-radius: var(--radius); +} + +/* ---- Sections ---- */ + +.section { + width: min(var(--container), calc(100% - 44px)); + margin: 0 auto; + padding: clamp(64px, 11vh, 110px) 0 0; +} + +.eyebrow { + margin: 0 0 10px; + color: var(--ice); + font-family: var(--mono); + font-size: 0.74rem; + font-weight: 700; + letter-spacing: 0.2em; + text-transform: uppercase; +} + +h2 { + margin: 0; + max-width: 36ch; + font-family: var(--display); + font-weight: 700; + font-size: clamp(1.5rem, 3vw, 2.1rem); + line-height: 1.12; + letter-spacing: -0.01em; + text-wrap: balance; +} + +/* ---- Feature grid ---- */ + +.feature-grid { + margin-top: 34px; + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 16px; +} + +.feature { + padding: 22px 22px 24px; + border: 1px solid var(--line); + border-radius: var(--radius); + background: var(--panel); + transition: border-color 0.16s ease; +} + +.feature:hover { + border-color: #3a3a56; +} + +.feature h3 { + margin: 0; + font-family: var(--display); + font-weight: 700; + font-size: 1.06rem; + line-height: 1.25; +} + +.feature p { + margin: 8px 0 0; + color: var(--dim); + font-size: 0.92rem; } /* ---- Footer ---- */ .site-footer { - padding-top: 14px; + margin-top: clamp(64px, 11vh, 110px); border-top: 1px solid var(--line); +} + +.footer-inner { + width: min(var(--container), calc(100% - 44px)); + margin: 0 auto; + padding: 22px 0 26px; color: var(--muted); display: flex; flex-wrap: wrap; @@ -290,18 +354,18 @@ h1 { .footer-note { margin: 0; - font-size: 0.82rem; + font-size: 0.84rem; } .footer-note a { - color: var(--text); + color: var(--dim); } .footer-links { display: flex; flex-wrap: wrap; gap: 20px; - font-size: 0.82rem; + font-size: 0.84rem; } .footer-links a { @@ -311,108 +375,54 @@ h1 { } .footer-links a:hover { - color: var(--ice); + color: var(--text); } /* ---- Responsive ---- */ -@media (max-width: 820px) { - .page { - width: min(100% - 32px, 620px); - padding-top: 16px; - } - - .hero { - grid-template-columns: 1fr; - align-content: start; - gap: 24px; - padding: 34px 0 20px; - } - - .hero-copy { - align-items: center; - text-align: center; - } - - .hero-wordmark { - width: min(220px, 70vw); - margin-bottom: 2px; - } - - h1 { - max-width: 16ch; - font-size: clamp(1.5rem, 6.5vw, 2.2rem); - } - - .lede { - max-width: 42ch; - font-size: 0.98rem; - } - - .hero-points { - align-items: center; - } - - .actions { - justify-content: center; - } - - .demo { - width: min(100%, 520px); - justify-self: center; - } - - .site-footer { - justify-content: center; - text-align: center; +@media (max-width: 900px) { + .feature-grid { + grid-template-columns: repeat(2, 1fr); } } -@media (max-width: 440px) { - .site-header { - gap: 12px; +@media (max-width: 600px) { + .header-inner, + .hero, + .section, + .footer-inner { + width: calc(100% - 32px); } - .brand { - gap: 8px; + .site-nav { + gap: 14px; font-size: 0.84rem; } - .brand-icon { - width: 28px; - height: 28px; - } - - .button { - width: 100%; - min-width: 0; - } - - .fine-print { - max-width: 32ch; + .site-nav a:not(:last-child) { + display: none; } -} -@media (max-height: 760px) and (min-width: 821px) { - .hero { - padding-top: 22px; - gap: clamp(28px, 4.5vw, 54px); + .feature-grid { + grid-template-columns: 1fr; } .hero-wordmark { - width: 210px; + width: min(230px, 70vw); } - h1 { - font-size: clamp(1.6rem, 2.4vw, 2.2rem); + .button { + width: 100%; } - .lede { - font-size: 0.96rem; + .actions { + width: 100%; } - .demo { - width: min(100%, 585px); + .footer-inner { + flex-direction: column; + justify-content: center; + text-align: center; } }