Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
9 changes: 9 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,15 @@ This repo uses **release-please**. Since GitHub squash-merges use the PR title a

This site is optimized for classic search (SEO) **and** generative answer engines (GEO — being quoted by ChatGPT, Perplexity, Google AI Overviews, Claude). The two overlap but aren't identical: SEO wants crawlable, well-described, linkable pages; GEO wants self-contained, factual, extractable passages an LLM can lift verbatim. Build for both on every page.

### Always review with the SEO skills — every page, every post, every language

**Any page or blog post you add or edit — including a translation, including a "small" copy tweak — gets an SEO/GEO review with the `claude-seo` skills before it ships.** This is not optional and not only for new pages: an edited heading, a reworded intro, or a re-translated description all move the signals the rest of this section is about.

- Start with **`claude-seo:seo-content`** (E-E-A-T, heading hierarchy, quotable leads, meta length, internal linking), then add the specialist that matches what changed: **`seo-schema`** for JSON-LD, **`seo-geo`** for AI-answer surfaces, **`seo-technical`** for routes/robots/sitemap, **`seo-hreflang`** when locales or `translatedRoutes` change.
- Finish with `npm run build && npm run check:links` (add `SYNC_DOCS=1 WAVEKAT_LOCAL_REPOS=<path>` for link-heavy changes).
- **Length budgets are hard limits, and translations break them constantly.** A `<title>` must be ≤ ~50 chars (`Post.astro`/`Base` append ` — WaveKat`, so the SERP title lands near 60) and a `description` 150–160. In CJK the SERP truncates on pixel width, not characters — budget **≤ 28 chars for a title and ≤ 85 for a description** in `zh`/`zh-Hant`/`ja`/`ko`. A faithful de/es/fr/it translation runs 30–60% longer than its English source, so re-measure every localized `title`/`description` instead of translating the English one verbatim.
- **Keep the entity term and the demand term apart.** Product nouns (`call flow`, `phone links`) are what the app calls things and must stay consistent everywhere; the words people actually search (`auto attendant`, `click-to-call`, `IVR`) go in titles, descriptions, and a bridging sentence or FAQ that says plainly which is which. Never let the title claim something the FAQ then denies (e.g. don't title a page "IVR" when the page correctly explains it isn't a full IVR).

### What's already wired (don't reinvent it)

- **`Base.astro` is the SEO baseline** (established in #81, `feat(seo)`). It emits the canonical URL, `<meta name="description">`, the `robots` directive (with a `noindex` prop to opt a page out of indexing), the full Open Graph + Twitter card set, light/dark `theme-color`, and the sitewide `Organization` + `WebSite` JSON-LD graph (`@id`s `https://wavekat.com/#organization` and `#website`). It also takes `ogType` / `article` props so child layouts can emit article semantics. Every layout (`Voice`, `Post`, `Docs`) wraps `Base`, so every page gets this for free.
Expand Down
20 changes: 12 additions & 8 deletions src/content/blog/answer-calls-with-a-call-flow.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
---
title: "Call Flows — Your Phone Answers, You Watch, You Take Over"
description: "WaveKat Voice now answers incoming calls with a call flow: a greeting, a phone menu, voicemail, or a ring to you. Watch each step live and pick up mid-message."
title: "Call Flows — an Auto Attendant for Small Business"
description: "WaveKat Voice answers incoming calls with a call flow — an auto attendant with a greeting, phone menu, and voicemail. Watch each step live, pick up mid-message."
date: 2026-07-25
author: Eason Guo
tags: [voice-ai, calls]
---

WaveKat Voice — the SIP softphone for Mac and Linux that records and transcribes every call — can now answer your incoming calls for you. A **call flow** is the thing that answers: it greets the caller, checks whether you're open, offers a menu, rings you, takes a message, or transfers the call on. You build the flow on the web, point it at one of your phone lines, and from then on the calls you can't get to still get answered. It lands in [0.0.43](/voice/changelog/#0.0.43).
[WaveKat Voice](/voice/) — the SIP softphone for Mac and Linux that records and transcribes every call — can now answer your incoming calls for you. A **call flow** is the thing that answers: it greets the caller, checks whether you're open, offers a menu, rings you, takes a message, or transfers the call on. You build the flow on the web, point it at one of your phone lines, and from then on the calls you can't get to still get answered. It lands in [0.0.43](/voice/changelog/#0.0.43).

This is the biggest step yet toward the thing we keep coming back to: [giving every small business the voice of a big one](/blog/hello-world/). A big company answers every call — there's a receptionist, a phone menu somebody paid a consultant to build, an after-hours service. A three-person shop has a phone that rings until someone can wipe their hands, and a caller who gives up is a booking that never happened. Call flows close that gap, and they run on the computer already sitting on your desk.

## What a call flow is

A flow is a short list of steps, and the call walks through them. Each step is a building block with one job:
A call flow in WaveKat Voice is a short list of steps that an incoming call walks through, one at a time. It's the thing other phone systems sell as an **auto attendant** — the greeting and "press 1 for…" menu that answers when you can't — except here it's built into the softphone you already use, not a separate platform you pay per seat for. Each step is a building block with one job:

| Step | What the caller experiences |
|---|---|
Expand Down Expand Up @@ -42,9 +42,9 @@ The published flow then shows up in the app's new **Flows** section, on every co

Flows run **on your computer**, inside the app, using the SIP account you already have. Nothing about the call is answered on our servers: the greeting is played from your machine, the message is recorded on your machine, and it costs nothing per call because nobody else is in the middle of it. The trade is the honest one — the app has to be running and the computer awake for the flow to pick up, and one computer answers for a given line.

## Watch it answer, live
## Watch the flow answer, live

The part we're most pleased with isn't the answeringit's that you can see it happen.
While a flow is answering, WaveKat Voice shows you what it's doing, step by step, as it happens — the part we're most pleased with isn't the answering, it's that you can see it.

When a flow answers, the app doesn't pretend you're on a call. The screen says **"Reception is answering"** with a line telling you what's happening right now: *Speaking to the caller… Playing the menu… Ringing you… Taking a message…*

Expand All @@ -56,15 +56,15 @@ That's call screening, and it's different from the voicemail you're used to. A c

## Take over mid-message

Because you're watching, you can grab the call. While a caller is leaving a message, the app shows a **Pick up** button: press it and the call moves onto your microphone and speakers, exactly like a call you'd answered yourself. The message that was recorded up to that point is kept.
You can take over a call the flow answered, without the caller starting again. While a caller is leaving a message, the app shows a **Pick up** button: press it and the call moves onto your microphone and speakers, exactly like a call you'd answered yourself. The message that was recorded up to that point is kept.

![WaveKat Voice on Ubuntu — the live flow map with the voicemail step lit, a Pick up button, and the caller's message appearing as a live transcript.](/screenshots/flow-takeover/en.webp)

And you don't have to guess whether it's worth taking: the message appears as text while it's being left, so you can read who it is and what they want before you decide.

Pick up only appears at the moments where a human joining makes sense to the caller — while they're leaving a message, not halfway through your greeting or in the middle of a menu prompt. Nobody wants a voice to cut in over the recording that's still talking to them.

## After the call
## What a flow-answered call leaves behind

A flow-answered call lands in your history like any other, with the flow's name on it — *Answered by "Reception"* — so you can tell at a glance which calls you handled and which the flow did. Open one and the summary tells you how it ended in plain words: **The caller left a message**, with a link to the flow that took it.

Expand All @@ -89,6 +89,10 @@ So a Free account gets a complete answering machine with your own greeting, your

A call flow is a set of steps that answers your incoming calls automatically — a greeting, a check of your business hours, a phone menu, ringing you, taking a message, or transferring the call. You build it on the web at platform.wavekat.com, point it at one of your phone lines, and the WaveKat Voice app on your computer runs it when a call comes in.

### Is a call flow the same as an auto attendant or an IVR?

A call flow is WaveKat Voice's name for an auto attendant: it greets callers, offers a keypad menu, checks your opening hours, rings you, and takes a message. It is not a full IVR in the enterprise sense — it doesn't look callers up in a database or complete transactions for them — and it doesn't hold a spoken conversation yet. If you've been shopping for an "auto attendant for small business", a call flow is the same job, running on your own computer instead of a monthly-per-seat platform.

### Does my computer have to be on for a flow to answer?

Yes. Flows run inside the app on your own computer, not on a server, so the computer needs to be awake with WaveKat Voice running. That's what makes it free per call and keeps the audio on your machine — but it also means a sleeping laptop won't answer. One computer answers for a given line, so signing in on a second machine doesn't cause double answers.
Expand Down
14 changes: 7 additions & 7 deletions src/content/blog/click-to-call-phone-links.md
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
---
title: "Click a Phone Number on a Website to Call It"
description: "WaveKat Voice now handles tel: and sip: links on Mac and Linux — click a phone number on any website and the app opens with it ready to dial. Optional one-click auto-dial, off by default."
title: "Click-to-Call: Dial Phone Links From Any Website"
description: "WaveKat Voice now opens tel: and sip: links on Mac and Linux — click a phone number on any website and it lands in the dial field, ready to call."
date: 2026-07-25
author: Eason Guo
tags: [voice-ai, calls]
---

WaveKat Voice — the SIP softphone for Mac and Linux that records and transcribes every call — can now be the app your computer opens when you click a phone number on a website. Click a `tel:` or `sip:` link anywhere — a company's contact page, a search result, a supplier's invoice — and WaveKat Voice comes to the front with the number already filled in, ready for you to press Call. It lands in [0.0.43](/voice/changelog/#0.0.43).
Click-to-call means a phone number on a web page is a link you can click to dial, instead of something you copy out and retype by hand. [WaveKat Voice](/voice/) — the SIP softphone for Mac and Linux that records and transcribes every call — can now be the app your computer opens for those links. Click a `tel:` or `sip:` link anywhere — a company's contact page, a search result, a supplier's invoice — and WaveKat Voice comes to the front with the number already filled in, ready for you to press Call. It lands in [0.0.43](/voice/changelog/#0.0.43).

Click-to-call means a phone number on a web page is a link you can click to dial, instead of something you copy out and retype by hand. It's table-stakes on a business desk phone, and one of those features you only notice when it's missing: you see a number on a page, you click it, the phone dials. WaveKat Voice — the [SIP softphone](/voice/) that records and transcribes every call and [runs on its own SIP engine](/blog/our-own-sip-engine/) — now dials the numbers you click, too.
It's table-stakes on a business desk phone, and one of those features you only notice when it's missing: you see a number on a page, you click it, the phone dials. This is the outgoing half of the same release that taught WaveKat Voice to [answer your incoming calls with a call flow](/blog/answer-calls-with-a-call-flow/) — and, like the rest of the calling, it runs on [our own from-scratch SIP engine](/blog/our-own-sip-engine/).

## What it does
## What happens when you click a phone number

Turn on **Phone links** and any phone number that's a clickable link becomes a way into WaveKat Voice. Click `tel:+14155550123` in your browser and the app takes focus and opens the New Call sheet with `+14155550123` already in the To field. You look at it, and you press Call. Both `tel:` links (ordinary phone numbers) and `sip:` links (SIP addresses like `sip:alice@example.com`) work — the SIP address goes straight through to your account.

![WaveKat Voice on Ubuntu — the New Call sheet open with a phone number already filled in, ready to dial.](/screenshots/dial-prefilled/en.webp)

The default is deliberately the safe one: the number is filled in, but **you** place the call. A web page can *ask* to start a call; it can't actually dial without a human pressing Call. That matters, because a link on a page is something anyone can put there.

## Turning it on
## How to turn on phone links

Phone links are **off until you turn them on**, because claiming the phone-number links on your whole computer is the kind of thing that should be your choice, not a surprise from an app you just installed. Flip **Phone links** on in **Settings → General** — the same place as "Open at login" — and WaveKat Voice registers with your operating system as a handler for phone links. What that looks like depends on the OS, and the setting is honest about it:

| Platform | What happens when you turn it on |
|---|---|
| **macOS** | WaveKat Voice becomes the handler right away, taking `tel:` links over from FaceTime. |
| **Linux** | Works as soon as you turn it on. |
| **Linux** | WaveKat Voice becomes the handler right away, registered with your desktop as the `tel:`/`sip:` app. |

![WaveKat Voice on Ubuntu — Settings → General with the Phone links toggle switched on.](/screenshots/settings-general-phone-links/en.webp)

Expand Down
Loading
Loading