Context

I wanted a workflow where updates to the portfolio go live without manual uploads or SSH sessions.

Decisions

  • Main is the only deploy source
    Only changes merged into main should go live.
  • Deploy build output, not source
    The server should receive the final, static files, not dev tooling.
  • Secrets stay in GitHub
    SSH keys and connection details are stored in GitHub repository secrets.

Implementation notes

  • Run npm ci and npm run build in CI.
  • Deploy dist/ to the document root using SSH + rsync (or SFTP).
  • Optional: add a lightweight smoke check (e.g. request / after deploy).

Lessons learned

Automating the boring parts removes friction and keeps momentum high.

  • Repo: (private)