Fresh Jots for GitHub Actions
One step in any workflow appends a line to a note you can read on your
phone — a deploy log, a red-build alert, or a nightly job that emails you
if it ever stops running. No runtime to install, no curl to
hand-write, no scripting.
- uses: Goran-Arsov/freshjots-append@v1
with:
note: deploys-prod
text: "deployed ${{ github.sha }} (${{ job.status }})"
env:
FRESHJOTS_TOKEN: ${{ secrets.FRESHJOTS_TOKEN }}
What you get
One step, zero install
It's a single uses: line. The note is
created on the first run and appended on every run after — nothing to
apt install, no token juggling in shell.
A log you'll actually read
Each run adds one line to a note addressed by filename. Read it in the browser, on the installable phone app, through the REST API, or hand it to your AI over MCP — it outlives the Actions run log and isn't buried three clicks deep.
Append-only by default
The Action creates the note append-only, so entries are added and never rewritten — the log reads as a true chronological record of what your pipeline did.
A watchdog for free
Add one input and a scheduled workflow becomes its own dead-man's switch: if the run stops firing, Fresh Jots emails you — the uptime-monitor pattern, with no extra service.
Before it works
Three one-time things before the first workflow run can write to your notebook.
- A Fresh Jots account on the Dev tier or higher. API access — including this Action — is on the Dev and Team plans; the free and Personal plans are web-only. New accounts get a 14-day Dev API trial, so you can wire a real workflow before paying anything.
- An API token, minted at /settings/api_tokens. For CI, choose the write-only scope and bind it to the single note you'll append to — a leaked CI token then writes garbage to one notebook instead of exposing your whole account.
-
Store the token as a GitHub Actions secret named exactly
FRESHJOTS_TOKEN. In the consuming repo: Settings → Secrets and variables → Actions → New repository secret. For many repos, store it once at the org level and grant each repo access instead.
The note itself doesn't need to exist first — the Action creates it on the first append. Create it by hand only if you want to set a custom title, owner, or privacy level up front.
Add the step
Drop it as the last step of a job. ${{ github.sha }}
and ${{ job.status }} are standard GitHub
context — the appended line is just a string, so put whatever you'd want
to see on your phone in it.
- uses: Goran-Arsov/freshjots-append@v1
with:
note: deploys-prod
text: "deployed ${{ github.sha }} (${{ job.status }})"
env:
FRESHJOTS_TOKEN: ${{ secrets.FRESHJOTS_TOKEN }}
Turn a scheduled job into its own watchdog
Add the append-deadline-hours input and
if: always() so the step runs whether the
job passed or failed. The first run creates the note, sets the deadline,
and writes the first line.
on:
schedule:
- cron: "0 3 * * *" # nightly at 03:00 UTC
jobs:
backup:
runs-on: ubuntu-latest
steps:
- run: ./backup.sh
- uses: Goran-Arsov/freshjots-append@v1
if: always() # log success and failure alike
with:
note: nightly-backup
text: "backup ${{ job.status }} (${{ github.sha }})"
append-deadline-hours: 26 # alert me if no run within 26h
env:
FRESHJOTS_TOKEN: ${{ secrets.FRESHJOTS_TOKEN }}
If the workflow ever stops firing — the runner is down, the schedule got disabled, or an earlier step broke the job before it reached this one — Fresh Jots emails you within about ten minutes of the deadline lapsing. Same primitive that Healthchecks.io built a business around, included on the Dev tier.
More recipes
Only when a deploy fails
- uses: Goran-Arsov/freshjots-append@v1
if: failure()
with:
note: failed-deploys
text: "${{ github.workflow }} ${{ github.ref_name }} failed @ ${{ github.sha }}"
env:
FRESHJOTS_TOKEN: ${{ secrets.FRESHJOTS_TOKEN }}
A separate log per environment
- uses: Goran-Arsov/freshjots-append@v1
with:
note: deploys-${{ inputs.environment }}
text: "deployed ${{ github.sha }} to ${{ inputs.environment }}"
env:
FRESHJOTS_TOKEN: ${{ secrets.FRESHJOTS_TOKEN }}
Inputs & output
note(required) — filename of the notebook, e.g.deploys-prod. Created on first append.text(required) — the line to append; newlines are stored verbatim. Convention is one line per run.append-deadline-hours(optional, 1–720) — dead-man's-switch deadline; re-set on every run (idempotent).api-url(optional) — defaults tohttps://freshjots.com/api/v1; override only for self-hosted instances.note-id(output) — numeric id of the note that received the append.
Authentication is the FRESHJOTS_TOKEN env var, above.
Pin a version
@v1 always tracks the latest 1.x release
(non-breaking updates). Pin @v1.0.1 or a commit
SHA for full reproducibility. The Action is MIT-licensed — see the
GitHub Marketplace listing
and the
freshjots-append repo.