Skip to content

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.

  1. 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.
  2. 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.
  3. 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 to https://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.