Keyboard SignalOne keyboard · every source · PointCast

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

AppNotes
—

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 keystrokes

fetch

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 feed

MCP (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/mcp

The 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]