← Back to the app

Runbook · served from the app itself, no passcode needed

Aurora Hub — Operations Notes

What to do if something needs restarting, where to look when you're not sure the emails went out, and how to get an older version of your task list back if you ever need it. Reachable even if you're locked out — that's exactly when you'd need it.

Live at

hub.auroracomputercare.com

Backups

Nightly · 30-day history

Check-ins

6, 7, 12, 6pm Denver

App directory

~/projects/task-app

Restart the app

If the site feels stuck or you've just changed something, this is the one command that fixes most things.

on the server
sudo systemctl restart task-app

Then confirm it actually came back:

on the server
sudo systemctl status task-app
curl -I https://hub.auroracomputercare.com/login

You're looking for Active: active (running) and HTTP/1.1 200 OK.

Where the logs are

Everything the app prints — every page load, every scheduled email attempt — goes to the system journal.

on the server
# last 50 lines
sudo journalctl -u task-app -n 50

# live, updates as things happen
sudo journalctl -u task-app -f

# everything since midnight
sudo journalctl -u task-app --since today

Email failures specifically also get their own file, which doesn't roll over the way the journal eventually does: data/mail-failures.log.

Did the check-in actually fire?

This is the one command that answers it — every scheduled job (the four check-ins and the nightly backup) writes one line the moment it finishes, whether it worked or not:

the answer
sudo journalctl -u task-app --since today | grep scheduler

A healthy day reads like this:

sqlite-backup completed at 09:00Z
morning-checkin completed at 12:00Z
acc-concepts-digest completed at 13:00Z
midday-checkin completed at 18:00Z
evening-checkin completed at 00:00Z

Those timestamps are UTC, so they'll read a few hours later than the 6am/7am/noon/6pm Denver time you actually see the email land. Silence instead of a line means the job never ran at all, which is worth noticing on its own.

A line reading FAILED means it already retried once, 5 minutes later, and both attempts came up short — check mail-failures.log for the reason.

Backups

Schedule: every night at 3:00am Denver time, automatically — no separate job to maintain, it's the same scheduler as the emails.
Kept for: 30 days, then quietly deleted. At this app's size that's still under a megabyte total, so there was no reason to keep less.

list what you have
ls -la ~/projects/task-app/backups/

Want one right now, before trying something risky? Run it by hand:

on the server
cd ~/projects/task-app
node scripts/backup.js

Restoring a backup

This replaces the live list with an older one. Anything added or checked off after that backup's date is lost — check the date before you commit.

  1. Stop the app so nothing writes to the database mid-restore:
    step 1
    sudo systemctl stop task-app
  2. Save the current database aside, just in case:
    step 2
    cp ~/projects/task-app/data/tasks.db \
       ~/projects/task-app/data/tasks.db.before-restore-$(date +%Y%m%d-%H%M%S)
  3. Copy the backup you want over the live database — swap in the date you actually need:
    step 3
    cp ~/projects/task-app/backups/tasks-2026-09-04.db \
       ~/projects/task-app/data/tasks.db
  4. Start it back up and confirm it's serving the restored data:
    step 4
    sudo systemctl start task-app
    curl -I https://hub.auroracomputercare.com/login
If the restore turns out wrong, your step-2 safety copy is still sitting in data/ — nothing is destroyed until you delete it yourself.

Changing the passcode

It lives in one file. Edit it, then restart:

on the server
sudo nano ~/projects/task-app/.env
# edit the PASSCODE= line, then Ctrl+O, Enter, Ctrl+X to save
sudo systemctl restart task-app

Anyone already signed in stays signed in — only new logins need the new code.

After changing anything

Run the full test suite, then the automated browser check that loads the real app and verifies nothing looks broken on the very first screen:

on the server
cd ~/projects/task-app
npm test
npm run smoke-test

The cache the app uses for offline/installed use updates itself automatically whenever a file changes — there's no manual version number to remember to bump.