When a site asks again after a newer version came out, the open
update_requested alert moves on to the latest version ("changed from
...") and the alert address is emailed once; the response says
changed: true with previousVersion (protocol §3a). Needs Cross Events
1.47.4 for the button.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Notes still only attach to tagged versions, so they can be written ahead of a
release or corrected afterwards without tagging a new version.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Hub reads the Cross Events repo's v* tags (each a release, the newest the
latest version) and the client notes from WHATS-NEW.md as of the newest tag,
every 15 minutes and on Sync now. Urgent/security in a version heading marks it
urgent. Repo address, notes path and an optional encrypted token on the
Releases page; manual releases only when no repo is set.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Releases page: each Cross Events version with notes and an urgent flag; the
newest is the latest version (moved off Settings; the old setting becomes the
first release). Installs get the notes for every newer version.
- Notices page: a banner for site admins and supervisors (with a time window),
an email to the customer and admin contact, or both; for every install or
chosen ones.
- POST /api/installs/update-request/cancel resolves the request and emails Joshua.
- Protocol doc: releases and notices in the heartbeat/register replies.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Installs, Customers, Alerts and the audit log get a search box and
25-per-page paging (Installs also a health filter); install History pages too.
- Settings is split into Releases and alerts / Email / Login and security /
Audit log tabs, remembered in the URL hash.
- The side navigation is sticky at window height, so Sign out no longer
scrolls off long pages.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SMTP server, port, user, password and from address are now Hub settings in
the database instead of SMTP_* in .env. The password is encrypted with
HUB_ENCRYPTION_KEY and never sent to the browser; a blank field keeps it.
POST /api/admin/settings/smtp-test logs in with the form's values (saved or
not) and sends a test email, returning the server's reason on failure; it is
rate limited and audited. On first start an existing SMTP_* setup is copied
into Settings once. The audit log no longer records the SMTP password.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ls1vMaqhrehXcHJe32jLL9
scripts/deploy.sh backs up the database (pg_dump), checks out the release,
runs npm ci, prisma migrate deploy and generate, builds the frontend,
restarts the PM2 apps and health-checks them. Any failure puts back the
previous code and build, and restores the dump if new migrations had run.
deployment.md §12 now uses it. tsconfig.tsbuildinfo leaves git so builds
don't leave the tree dirty.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The heartbeat's stats.campuses and stats.campusCount were stored but never
shown. The Usage card now has a Campuses row: Off, or On with the active count.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
POST /api/installs/update-request, signed like the heartbeat: opens an
update_requested alert and emails the alert address once; the next heartbeat
on a newer version resolves it. Shares the signature check with the heartbeat
and syncs docs/hub-protocol.md with the install's copy.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Hope Events is now Cross Events. Protocol identifiers (hel1. tokens, CEH- keys)
are unchanged so existing installs keep working.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>