# Publish release notes from CI with the lucid.page GitHub Action
If your release process currently ends with someone pasting Markdown into a chat window, this is the upgrade. The lucid.page GitHub Action publishes a Markdown file as a typeset page and gives you back the URL, right in the workflow. No account required, though you’ll probably want one.
Contents
# The thirty second version
- uses: bitgate/lucid-page-action@v1
id: publish
with:
file: CHANGELOG.md
- run: echo "Live at ${{ steps.publish.outputs.url }}"
That’s a complete setup. One file in, one typeset page out, URL in the step outputs and in a neat table in the job summary.
# A real workflow: publish on every tag
name: release-notes
on:
push:
tags: ["v*"]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: bitgate/lucid-page-action@v1
id: notes
with:
file: RELEASE_NOTES.md
title: "Release ${{ github.ref_name }}"
visibility: public
api-key: ${{ secrets.LUCID_API_KEY }}
- run: echo "${{ steps.notes.outputs.url }}"
Tag a release, get a public page. The URL lands in the step summary where whoever cuts releases will actually see it.
# All the inputs
| Input | Default | What it does |
|---|---|---|
file |
(required) | Path to the Markdown file |
title |
from the Markdown | Override the page title |
visibility |
unlisted |
unlisted, public, or private (private needs a key) |
ttl |
no expiry | Lifetime in seconds, minimum 60 |
slug |
Update an existing page you own instead of creating a new one | |
api-key |
Your lp_ key, or set LUCID_API_KEY as an env var once |
Outputs are url and slug.
# The trick worth knowing: a living page
Pass slug and the action updates that page in place instead of creating a new one every run:
- uses: bitgate/lucid-page-action@v1
with:
file: docs/status.md
slug: our-service-status
api-key: ${{ secrets.LUCID_API_KEY }}
Same URL forever, fresh content every deploy, and every update is stored as a revision you can roll back to. Good for status pages, “latest benchmarks”, living roadmaps, anything people bookmark.
# Anonymous vs keyed
Anonymous works fine for occasional release notes: no secrets to manage, 10 publishes a minute per IP, pages up to 1 MB. The catch is that anonymous pages are unowned, so nothing can update or delete them later (the action prints a claim link you can open once, while signed in, to adopt a page).
With a key you get 120 publishes a minute, private pages, and update-in-place. Mint one in the dashboard under Settings, stash it as LUCID_API_KEY in your repo secrets, done. The key question in more detail: lucid.page API keys: when you need one and when you don’t.
# Worth knowing
- 429s are retried automatically with backoff, three times. If it still fails, you’re genuinely over the limit.
- The visibility and ttl inputs are create-time settings. Updates only replace content and title.
- Empty or missing files fail fast with a clear error, so a bad
file:path won’t silently publish nothing.