VoiceMark

Your voice approves the request

Wallet · Tester Handover · v0.1
What it does

VoiceMark Wallet is a phone app that turns your voice into a credential. When you sign up, you create two types of VoiceMark — both stored in the wallet, both checked on every approval:

GLYPH VOICEMARK
Your stable speaker identity — the dot pattern in the app. Captured at setup, used as the reference on every approval. Answers: is this the same person?
CLOUD VOICEMARK
Per-phrase — every cloud looks different because the content changes, but the same speaker's clouds share a consistent spectral shape. Currently rendered and returned to the app after each approval; shape-based verification is the next step.

On each approval the backend runs three independent checks:

1.Liveness — AASIST3 anti-spoofing model checks the audio is real speech, not a recording or synthesis.
2.Phrase match — Whisper transcribes the audio and scores compliance with the challenge phrase.
3.Speaker identity — ECAPA embedding compared against your enrolled Glyph VoiceMark via cosine similarity.

All three must pass. The Cloud VoiceMark is generated on every approval and rendered in the app — incorporating it as a fourth verification signal (shape-based match) is on the roadmap. When a script or agent running on your laptop needs an API key — OpenAI, Stripe, whatever — it sends a push to your phone. You speak a short phrase. The key is released only after all checks clear.

No passwords to copy. No 2FA codes to type. The approval lives on your phone, authenticated by something that can't be phished or leaked.

The problem it solves

Right now, most developers keep API keys in .env files, shell profiles, or hardcoded in scripts. Those files sit on disk permanently. Any process — or person — with access to your laptop can read them. They get accidentally committed to git. They get pasted into Slack. They persist long after the project ends.

With VoiceMark Wallet, keys never touch your filesystem. A script requests a key at runtime; a push arrives on your phone; you speak; the key appears in your shell for that session only. Even if your laptop is fully compromised, an attacker can't get the key without also holding your phone and speaking in your voice.

Every access is logged. Every release is voice-gated. And because it's out-of-band — approval happens on a physically separate device from the one making the request — there's no way for a rogue script to self-approve.

Keys off the filesystem
No .env files, no shell exports, no clipboard history. Keys are encrypted at rest and released only on voice approval.
Out-of-band approval
A compromised laptop can't approve its own requests. Approval happens on a physically separate device — your phone — by your voice.
Zero context switch
$(voicemark secret get openai) in your script. Push arrives. You speak. Key's in the shell. The script carries on.
Approve, deny, or defer
Swipe right to approve with voice. Swipe left to deny. Swipe down to defer 2 minutes if you're mid-thought.
Install & test
1
Open in Safari on your iPhone
Go to app.voicemark.dev in Safari — not Chrome, not Firefox. The PWA install only works from Safari.
2
Add to Home Screen
Tap the Share icon ⎙ at the bottom of Safari, then tap Add to Home Screen. This installs it as a full-screen app — no browser chrome.
3
Open from your Home Screen
Open VoiceMark Wallet from the icon — not from Safari. The app only works from the installed PWA context.
4
Create your VoiceMark
Follow the setup flow. You'll speak a few phrases — this creates your Glyph VoiceMark (stable speaker identity, the dot pattern in the app) and establishes the characteristic shape of your Cloud VoiceMark (the spectral signature your voice consistently produces across different phrases). Both are verified on every approval. Takes about 60 seconds.
5
Enable notifications & microphone
Tap Enable notifications & microphone on the home screen. Both are needed: push for inbound requests, mic for voice approval.
5b
Sign In with Face ID
A passkey is registered during setup and stored in your iOS Keychain. Face ID is your sign-in — it's the trust gate for the wallet itself, separate from your VoiceMark which gates each individual approval. If you reinstall or restore the app, tap Sign In with Face ID to get straight back in without re-enrolling your voice.
6
Install the CLI and link your laptop
First install the CLI: npm install -g voicemark

Then long-hold the glyph → Profile → Link laptop to copy your key. On your Mac run voicemark login and paste it. Now the CLI can reach your phone. (See friction note below.)
7
Trigger a test approval
In Terminal: export KEY=$(voicemark secret get openai). A push arrives on your phone. Open the notification, swipe right, speak the phrase. Done.
app.voicemark.dev
What to test

Run these in order. Each one tests a different part of the approval flow. Use the dummy keys below — they're fake strings, but the wallet stores and returns any value, so the full flow works exactly as it would with real keys.

Test keys — store these in your vault first
openai-test sk-test-vm-aabb1122ccdd3344eeff5566aabb7788
stripe-test sk_test_vm_1a2b3c4d5e6f7a8b9c0d1e2f
anthropic-test sk-ant-test-vm-aabb1122-ccdd-3344-eeff-5566aabb7788
To store: in Terminal, run voicemark secret add <name> <value> for each — e.g. voicemark secret add openai-test sk-test-vm-aabb...
T1
Approve a key request
In Terminal: export KEY=$(voicemark secret get openai-test)

Your phone gets a push: "openai-test requested." Open the notification — the approval screen shows a short phrase. Swipe right, speak the phrase clearly.

Terminal prints the key. Confirm with echo $KEY — you should see the full test string.
T2
Deny a request
In Terminal: voicemark secret get stripe-test

Push arrives → swipe left on the approval screen.

Terminal should print an error: request denied. The key is never released.
T3
Defer, then approve
In Terminal: voicemark secret get anthropic-test

Push arrives → swipe down to defer. The notification is held for 2 minutes; Terminal waits.

Within 2 minutes: tap the deferred notification in your notification centre. Approve with voice. Terminal receives the key.

Alternatively: let the 2 minutes expire without approving. Terminal should time out cleanly.
T4
QR fallback (push didn't arrive?)
In Terminal: voicemark secret get openai-test

Do not open the push notification. After a few seconds, the Terminal prints a QR code.

On your phone, open Camera and scan it. This opens the approval screen directly in Safari — speak to approve. Terminal receives the key.

This is the current fallback for unreliable push delivery.
Known limitation — v0.1
The QR code is the friction

The design principle is phone + voice. Your phone is the wallet — it's a separate hardware device, your VoiceMark lives in it, and every approval happens on it. That's the security model and it doesn't change.

What shouldn't be there is the QR code. Right now setup requires copying a key from the phone and pasting it into voicemark login on the Mac — that's one extra step between you and phone + voice only. The Terminal also shows a QR code as a fallback if a push notification doesn't arrive, which you scan to open the approval screen.

Next step — scan-to-link: open the wallet, tap to show a pairing QR, scan from the CLI. One QR, one scan, done. The approval flow after that is push → phone → voice — no QR involved.

End goal — voice pairing: no QR ever. voicemark login sends a push to your phone the same way a key request does — "Authorise this laptop?" arrives as a notification. You speak to approve it. The CLI gets its session token. Everything after that is push → phone → voice. The same pattern as T1 above, applied to setup itself.

The backend change needed is small: it's the same challenge pipeline, triggered by a login request rather than a secret fetch. The QR fallback also goes away once push delivery is reliable — it exists today purely as a safety net for missed notifications.

Where this goes

Once setup is voice-native, the wallet can expand to any credential type that benefits from out-of-band voice approval:

1
API keys — today
Scripts and agents request keys. Voice approves. Keys never leave the vault unguarded.
2
Passwords
Any stored credential retrieved by voice. No master password — the wallet is opened by speaking.
3
Agent authorisations
AI agents need permission to act — book this, send that, spend up to £X. Voice-approve before they run. The wallet becomes the trust boundary between you and autonomous agents.
4
Payments
Authorise a transaction the same way you authorise a key fetch — push to phone, speak, done. No card, no code, no tap.
The goal
"Phone + voice = wallet."
Passwords · API keys · Agent actions · Payments — all approved by speaking.

When anything needs a credential or an authorisation, it asks your phone. Your phone asks your voice. No passwords to copy, no tokens to manage, no QR codes to scan. Just: push to phone, speak, approved.

What works today
VoiceMark creation (enrollment)
Live
Face ID sign-in (iOS Keychain passkey)
Live
Push notification on key request
Live
QR code fallback in Terminal
Live
Swipe approve / deny / defer
Live
Wallet feed — active keys + activity
Live
Profile sheet — identity, re-enroll, sign out
Live
Laptop link — manual key copy-paste
Works, needs scan-to-link
Challenge persistence across backend restarts
Fix in progress
Scan-to-link laptop pairing (QR on wallet)
Roadmap
Voice laptop pairing — no QR at all
End goal
Passwords, agent auth, payments
Roadmap
Android / desktop PWA
Roadmap