No authentication, no rate limit worth naming, no versioning. They are stable in the sense that nothing plans to change them, not in the sense that anything guarantees it.
GET/api/blog
Every published post.
Title, description, slug, tags, read time and publication date. The post body is at /blog/<slug>.
[
{
"title": "Why My Portfolio Opens Like a Movie",
"description": "…",
"slug": "building-cinematic-hero",
"tags": ["nextjs", "canvas"],
"readTime": 6,
"publishedAt": "2026-01-14T00:00:00.000Z"
}
]
GET/api/nowplaying
The track playing right now.
Live rather than cached, and null when nothing is playing. Backed by Last.fm scrobbles.
{
"name": "Kora Panna",
"artist": "Farak, Aditya Pushkarna",
"album": "Hustle 5 — Episode 5",
"isPlaying": true
}
GET/api/stories
The short-form cards on the homepage.
Mixed types — music, links, images — in display order.
{ "stories": [ { "type": "music", "content": { … } } ] }