API docs
Everything you can do on the web, you can do with one HTTP request. Your API token is
on your dashboard. Post bodies can be form-encoded (as below) or JSON
(Content-Type: application/json).
The wakelog CLI
A single ~120-line bash script, zero dependencies beyond curl.
Read it first if you like: https://wakelog.wakelog.workers.dev/wakelog
--from-git turns
git log subjects (merges excluded) into a markdown bullet list β
perfect at the end of a release script. Pass a tag/ref (commits since it) or an explicit
A..B range; with no argument it uses your latest tag.
Want grouped keep-a-changelog sections instead of a bullet list? Paste the same
git log into the release notes generator β
no signup needed.
Create a post
tag is optional: one of
new, improved, fix,
announcement, security. body is markdown
(bold, italics, code, links, images β , https-only,
hotlinked from wherever you host them β lists, headings, fenced code blocks). Returns
201 with the public URL.
Drafts
Add -d draft=true to save the post
hidden β it won't appear on the public page, feeds, widget, badge, or exports until published.
Write the announcement in CI before the release goes out, then flip it live with one call
(publishing stamps the post with the publish date):
Scheduled publishing
Or skip ship-day busywork entirely: pass
publish_at (ISO 8601, UTC assumed if no offset) and Wakelog publishes the
post for you within ~5 minutes of that time β outbound Discord/Slack/webhook notifications fire
then too. The post is a hidden draft until the moment arrives. Works from the web form
("schedule it"), the API, and the CLI (wakelog post "v2.0" --at 2026-08-01T14:00Z).
Change the time or unschedule with PATCH publish_at=β¦ /
publish_at= (empty clears), or publish immediately with
draft=false.
Import an existing CHANGELOG.md β or your GitHub releases
Bring your whole history over in one command. Keep-a-changelog
style (## [1.2.0] - 2024-05-01) and most common formats are understood;
dates are preserved, and entries whose title already exists are skipped β safe to re-run.
Pass a bare GitHub, GitLab or Codeberg repo URL as url=
and Wakelog imports the repo's published Releases instead (public repos, newest 100). An RSS or Atom
feed URL works too β Headway, LaunchNotes, AnnounceKit and most other hosted changelog
tools expose one (so does github.com/you/repo/releases.atom); item titles,
dates and HTML bodies become markdown entries. If you give the URL of an HTML changelog page,
Wakelog looks for its advertised feed automatically.
List posts (public, no auth)
Optional params: ?q=term
(search title + body), ?format=text (plain-text listing).
Public pages support the same search via the search box or ?q=.
Each post includes its emoji reactions counts when it has any.
Reactions
Every public post has anonymous emoji reaction buttons
(π π β€οΈ π) β cookie-free feedback from your readers, tallied on your dashboard. They just work;
nothing to configure. Programmatic: POST /p/YOUR-PROJECT/react/POST_ID
with emoji=π (rate-limited per IP).
Edit a post
Send only the fields you want to change
(title, body, tag,
draft β draft=false publishes a draft and dates
it today). Post IDs are in the list-posts response.
Delete a post
Auto-post from GitHub / GitLab / Gitea releases
Enable the release webhook on your project's dashboard page
to get a payload URL and secret, then add a webhook in your repo settings
(GitHub/Gitea: content type application/json, Releases event only;
GitLab: Release events). Every published release becomes a post β release name as title,
release notes as markdown body, tagged release
(or pre-release). Signatures are verified
(X-Hub-Signature-256 / X-Gitea-Signature /
X-Gitlab-Token), drafts are skipped, and re-deliveries with the same
title are deduplicated β safe to redeliver.
Announce new posts to Discord / Slack / any webhook
Set a webhook URL in the
Announce new posts card on your project's dashboard page and every published post
(web, API, CLI, or release webhook) sends one message there. Discord webhook URLs and Slack
incoming-webhook URLs get a formatted message with a link to the post; any other HTTPS endpoint
receives JSON: {event: "post_published", project, project_name, title, tag, url,
published_at}. Drafts notify when published, not when saved. Use "Send test" on the
dashboard to check your wiring.
Post automatically on every deploy
Add one line to the end of your deploy script or CI job:
Scoped CI tokens
Don't put your account token in CI. Each project can issue a
scoped CI token (wlp_β¦, generated on the project's dashboard
page) that works only on that project, and only for
POST /api/v1/<slug>/posts (drafts and
publish_at included), POST /api/v1/<slug>/import,
and publishing an existing draft β PATCH /api/v1/<slug>/posts/<id>
with exactly {"draft": false} and nothing else β so a pipeline can draft at
tag time and flip the post live when the deploy goes green. No reads, no content edits, no deletes,
no other projects. Use it as a drop-in
Authorization: Bearer value in the commands above (the CLI's
post/import/publish
commands accept it too). If it leaks,
rotate or revoke it on the dashboard; your account token is never exposed.
Lint your changelog in CI (no auth)
The changelog linter has a JSON API β
no token, nothing saved (30 runs/hour/IP). Send the file text in changelog
(or a public url β GitHub/GitLab/Codeberg repo, raw CHANGELOG.md, or any changelog feed);
get back {grade, score, checks, issues}. Add
format=text for a plain-text report. The CLI wraps it with an exit code,
so your pipeline can fail when the changelog slips:
Feeds & embeds
Public page: https://wakelog.wakelog.workers.dev/p/YOUR-PROJECT
RSS feed: https://wakelog.wakelog.workers.dev/p/YOUR-PROJECT/rss.xml
JSON Feed 1.1: https://wakelog.wakelog.workers.dev/p/YOUR-PROJECT/feed.json
Markdown export (full changelog, keepachangelog-style β re-importable anywhere, including back into Wakelog; your data is never locked in): https://wakelog.wakelog.workers.dev/p/YOUR-PROJECT/changelog.md
Digest slice of the export β everything shipped in a date range, ready to paste into a newsletter or roundup: ?since=2026-07-01&until=2026-07-31 (inclusive, YYYY-MM-DD; add &tag=fix to filter by tag)
Embeddable widget: <iframe src="https://wakelog.wakelog.workers.dev/p/YOUR-PROJECT/embed" width="380" height="440"></iframe>
Widget options: ?theme=dark (or auto to follow the visitor's OS; default light) and ?limit=5 (1β25 posts, default 10)
"What's new" popover (drop-in script)
One script tag adds a floating bell to your app that shows an
unread-count badge when you ship something new, and opens your changelog in a popover when clicked.
Visitors' "seen" state lives in their own localStorage β no cookies, nothing stored server-side.
Options (attributes on the script tag):
data-selector="#whatsnew" β attach to your own nav link/button instead of the floating bell
data-theme="light|dark|auto" β panel theme (default auto)
data-position="bottom-right|bottom-left|top-right|top-left" β bell corner (default bottom-right)
data-accent="#rrggbb" β unread-badge color
The unread count comes from GET /p/YOUR-PROJECT/widget.json?since=<timestamp> (CORS-open, cached 5 min) if you'd rather build your own UI.
Filter the public page by tag: https://wakelog.wakelog.workers.dev/p/YOUR-PROJECT?tag=new (tag badges are clickable too)
README badge (SVG, shows time since last post): https://wakelog.wakelog.workers.dev/p/YOUR-PROJECT/badge.svg
Badge markdown: [](https://wakelog.wakelog.workers.dev/p/YOUR-PROJECT)
Badge options: ?label=updates&color=3757ad (hex without #) β or tune it live in the badge playground
Scripts & AI agents: no browser needed
The entire lifecycle works over plain HTTP β signup included,
no CAPTCHA, no email. A machine-readable guide with the full flow lives at
https://wakelog.wakelog.workers.dev/llms.txt, and an OpenAPI 3.1 spec
(for codegen, explorers, and agent tooling) at
https://wakelog.wakelog.workers.dev/openapi.json.
MCP server: point any Model Context Protocol
client (Streamable HTTP transport) at https://wakelog.wakelog.workers.dev/mcp and Wakelog becomes
native tools: signup, create_project,
create_post, list_posts,
lint_changelog. Auth is the same API token, sent as an
Authorization: Bearer header on the connection β an agent with no account
can call the signup tool to get one. Stateless: plain JSON-RPC over POST,
no SSE session required.
Active public changelogs get listed on
Discover automatically β free visibility. Prefer to stay off it
(and out of the sitemap and search engines)? Pass unlisted=true at
creation, or toggle it any time in project settings.