Changelog

v0.40.0 - Postgres HEXL migration

2025-11-22

  • Replaced SQLite HEXL.db with a Postgres database schema, marking the first major step toward migration to a scalable system.
  • Automated setup and migration of HEXL data from legacy SQLite to Postgres.
  • Reworked user profile data to be pushed as a snapshot to the HEXL upon creation of a new experience log.
  • Replaced AWS VM’s local instance of Portainer with Portainer-agent to reduce load on the very small AWS VM.
  • Introduced profile data coarsing when sending profile snapshot to HEXL. Included admin controls for refinement.
  • Fixed admin settings to allow text fields to expand horizontally.
  • Added safeguards to prevent duplicate users and preserve existing timestamps.
  • Limited updates to only the newest matching experience to avoid overwriting history.
  • Automated populating HEXL statistics with the most recent profile snapshots for more accurate reporting.
  • Fixed handling of Stroop test tags so they correctly link to stored test results.
  • Preserved Stroop trial timestamps and improved result ordering.
  • Ensured Stroop tags match and align with HEXL test identifiers.
  • Removed the need for placeholder experiences when tagging Stroop data.
  • Added guards to avoid repeat HEXL syncs during routine flows.
  • Added horizontal resizing for admin text areas.
  • Wired in Sentry endpoints to monitor errors and outages externally.
  • Corrected mail environment variable fallbacks for reliability.

v0.36.2 - App Monitoring

2025-11-18

  • Added a healthcheck /health endpoint.
  • Introduced a status page on https://status.cframe.co and included Discord webhooks to allow real time app monitoring.
  • Replaced entire backend docker stacks with more reliable and easier-to-read compose files.
  • Added backups for backend files to CFrame documentation.
  • Made a bunch of mistakes that shouldn't happen again.

v0.36.1 - Pointless security updates but also some useful stuff

2025-10-31

  • Added encryption scaffolding with runtime toggles and KMS settings, expanded experience entries with encryption metadata, supplied an Alembic migration, documented crypto/key/KMS interfaces for future implementations, and ensured supporting dependencies are declared.
  • Introduced a HEXL dispatcher that normalizes timestamps and emits anonymized metric payloads after decryption via the trusted backend pipeline.
  • Refactored HEXL record aggregation to share sanitized data for admin and public analytics, navigation, statistics, and Stroop pages.
  • Added regression tests capturing dispatched payloads and verifying HEXL views continue serving sanitized analytics feeds.
  • Added configurable login throttling defaults and ensured clinician login attempt tables are created during app startup.
  • Introduced shared throttling utilities and wired them into the primary user login API to enforce exponential backoff with retry hints.
  • Hardened clinician authentication by logging attempts, applying throttling with retry headers, and enforcing a 30-minute inactivity timeout across protected routes and logout handling.
  • Added a Demo User settings card so admins can store or clear the demo login email and password while masking password changes in the admin audit log.
  • Created a reusable helper to fetch stored demo credentials and wired them into both the public login flow and the admin preview context so the button only appears when fully configured.
  • Updated the login page shortcut and client script to use the configured demo credentials and show a disabled state with messaging when no demo user is available.
  • Extended _delete_user_data to clear Fitbit, clinician, study, notification, and other dependent records while supporting optional transaction control so account removals no longer leave foreign key violations.
  • Reused the shared cleanup helper in the admin delete endpoint and reassigned any admin log entries to a surviving administrator before dropping the user record.
  • Added a regression test that signs up an admin and a study creator to confirm the admin deletion flow succeeds without integrity errors.
  • Added a fallback in _collect_hexl_record_components so HEXL records always expose a pseudonym derived from the user ID when no profile metadata exists.
  • Added a regression test ensuring the admin aggregates endpoint returns the fallback pseudonym for users lacking a HEXL profile row.

v0.35.0 - Hotfix HEXL comparison in user statistics

2025-10-30

  • Declared the SOS threshold constant at module scope so computeHexlComparison and other helpers share the same value without scope errors.
  • Updated the trigger bucket computation to rely on the shared SOS threshold rather than a shadowed local definition.
  • Fixed version number. The last update was supposed to be 0.35.0 so I just went ahead and made this one that.

v0.34.5 - PHI tagging and sleep data refinement

2025-10-29

  • Added X, Y, and SoS to Trigger Words table in user and HEXL Statistics page and made them sortable by column.
  • Highlighted Fitbit data as PHI, surfaced saved-data counts, and added deletion controls on the integration and Fitbit data pages so participants can manage stored imports explicitly.
  • Added helpers that describe requested Fitbit scopes, summarize stored Fitbit records, protect revoke/delete forms with CSRF, and introduced a deletion route that clears snapshots, sleep logs, and experience metrics only when the user requests it.
  • Added a “Display options” control group to the 3D scatter analytics card so viewers can toggle markers, trajectory lines, SoS coloring, and SoS-based sizing directly from the dashboard UI.
  • Set the Sleep Data chart controls to make Hypnogram the default selection, clarified the default label copy, and synchronized stored preferences across pages through local-storage handling and storage events.