Embed the station. Anywhere.

One iframe, no JS to install, no API key. Pick a size, paste the snippet, and the card updates itself when the next track lands.

Banner · dark

360 × 88

Default. Sits nicely under a hero or in a sidebar.

<iframe
  src="https://kev.fm/embed/now?size=banner&theme=dark"
  width="360"
  height="88"
  loading="lazy"
  frameborder="0"
  scrolling="no"
  title="Now playing on kev.fm"
  style="border:0; border-radius:4px;">
</iframe>

Banner · light

360 × 88

Same shape, lighter palette for light-themed sites.

<iframe
  src="https://kev.fm/embed/now?size=banner&theme=light"
  width="360"
  height="88"
  loading="lazy"
  frameborder="0"
  scrolling="no"
  title="Now playing on kev.fm"
  style="border:0; border-radius:4px;">
</iframe>

Square · dark

280 × 280

Artwork-forward. Use where a square fits better than a strip.

<iframe
  src="https://kev.fm/embed/now?size=square&theme=dark"
  width="280"
  height="280"
  loading="lazy"
  frameborder="0"
  scrolling="no"
  title="Now playing on kev.fm"
  style="border:0; border-radius:4px;">
</iframe>

Mini · dark

280 × 44

Single line. Discreet — good for footers and corners.

<iframe
  src="https://kev.fm/embed/now?size=mini&theme=dark"
  width="280"
  height="44"
  loading="lazy"
  frameborder="0"
  scrolling="no"
  title="Now playing on kev.fm"
  style="border:0; border-radius:4px;">
</iframe>

Want JSON?

The raw "what's playing now" feed is at /api/now — CORS is open, cache-control is no-store, the shape is:

{
  "state": "playing" | "empty",
  "serverNow": <unix seconds>,
  "startedAt": <unix seconds>,
  "endsAt":   <unix seconds>,
  "track": {
    "id":         <number>,
    "title":      <string | null>,
    "artist":     <string | null>,
    "provider":   <string>,
    "url":        <string>,
    "embedUrl":   <string | null>,
    "audioUrl":   <string | null>,
    "artworkUrl": <string | null>
  }
}

Build something cool? Send the link to hello@kev.fm.

↗