Play the town keyboard · ● connecting
Tap, or type A S D F G H J K (black keys W E T Y U). Every note counts as pointcast / /keyboard-signal.
Global count · every note, every source
—
Pitched
—
Keystrokes
—
Today (UTC)
—
Key of the day
—
Playing now
—
Sources
—
The town chord
Every pitched note, folded into one octave. The wheel is today's (UTC) shape; the key is the Krumhansl–Schmuckler best fit, once there are a dozen notes to go on.
Sounds like
—
Register
Just heard
The latest phrases on the signal. Tap one to hear it. With Listen on, new ones play as they arrive.
Waiting for the first phrase…
Where the notes come from
Kinds are inferred from the page that sent the note; only PointCast's own origin can call itself pointcast.
Last 30 days
Sources
| App | Notes |
|---|---|
| — | |
This week's league
Every tagged app is a team. Mon–Sun UTC, capped at 5,000 notes per app per day.
| — |
Places
Add the keyboard to anything
Open to everyone, CORS *, no key, no cookies. Notes are plain MIDI numbers; text you send is turned into notes and dropped. Typing surfaces can send a keystroke count — never which keys.
Script + element
<script src="https://pointcast.xyz/keyboard.js" data-app="my-site" async></script> <pointcast-keyboard></pointcast-keyboard> <button data-pointcast-keyboard-note="60 64 67">C chord</button> <span data-pointcast-keyboard-count></span>
JavaScript
PointCastKeyboard.note([60, 64, 67]); // play + count a chord
PointCastKeyboard.play('good morning'); // text → melody (text never sent)
PointCastKeyboard.keys(12); // 12 unpitched keystrokesfetch
fetch('https://pointcast.xyz/api/keyboard/signal', {
method: 'POST',
body: JSON.stringify({ notes: [62, 65, 69], app: 'my-app', place: 'el-segundo' }),
});curl
curl -X POST https://pointcast.xyz/api/keyboard/signal \
-d '{"text":"hello town","app":"my-script","kind":"standalone"}'
curl https://pointcast.xyz/api/keyboard/signal # summary + key of the day
curl "https://pointcast.xyz/api/keyboard/signal?since=0" # the live phrase feedMCP (agents + artifacts)
keyboard_play { "notes": [60, 64, 67] } or { "text": "hello" }
keyboard_signal_state totals, sources, today's key, recent phrases
Connector: https://pointcast.xyz/api/mcpThe contract
POST /api/keyboard/signal notes MIDI 0–127, up to 64 per post count 0–200 unpitched keystrokes text ≤64 chars, played as notes, not stored app, kind, place optional source tag GET /api/keyboard/signal[?since=id | ?league=1]