Skip to content

usertest: the user-testing droplet's setup and log collector - #182

Merged
michielbdejong merged 5 commits into
mainfrom
claude/usertest-droplet
Sep 28, 2026
Merged

michielbdejong merged 5 commits into
mainfrom
claude/usertest-droplet

Conversation

@michielbdejong

Copy link
Copy Markdown
Contributor

Adds usertest/: the setup of the user-testing droplet as files, so it can be rebuilt and others can see how it works. Approved by Michiel as a top-level folder (it is shared tooling, not a plugin).

What it runs

On one DigitalOcean droplet (Ubuntu 24.04, 2 vCPU, 4 GB, AMS3), set up by hand on 2026-09-28 and now deployed from these files:

Host What
https://plugins.178-62-223-35.sslip.io atomic-server: the published e2e image of the pin (2567fc30b) behind Caddy (server.sh)
https://catalog.178-62-223-35.sslip.io/catalog.json a test catalog in which every drive app can be installed and shows without the experimental toggle; unpublished apps are built from this checkout (catalog.mjs)
https://logs.178-62-223-35.sslip.io a dependency-free log collector (collector/)

The proxy is localthought.io, which was moved to atomic-integration-proxy 0.2.1 today (localthought/integration-proxy#78). The Heroku build had been failing since 22 Sep on a leftover APP_BASE/monorepo buildpack; both are now removed.

The collector

  • Sentry's envelope endpoint. server.sh sets SENTRY_DSN (atomic-server) and SENTRY_DSN_BROWSER (the data-browser; atomic-server injects it into the page at runtime). That reports page and server errors and switches on the sidebar's Feedback form.
  • POST /log for anything else. A drive app's errors never leave its sandboxed frame: the host (AppFrame.tsx) shows them and reports nothing. So each app has to post its own. That comes next, calendar first.
  • One JSON line per event in /var/lib/usertest-logs/<UTC date>.jsonl.

Verified: an error thrown in the data-browser on the test instance arrived in the log within seconds, with its stack and URL. Locally: an envelope with an event plus a session item, a /log post, and a null-origin preflight.

Not covered

  • No CI job touches usertest/. oxlint over the folder reports one no-console warning (the same kind the tooling scripts have), and oxfmt --check passes.
  • catalog.mjs reproduces the deployed catalog exactly (compared ignoring key order), and every module it builds is byte-identical to the deployed one.

🤖 Generated with Claude Code

michielbdejong and others added 3 commits September 28, 2026 12:47
The instance at plugins.178-62-223-35.sslip.io (set up 2026-09-28) was
configured by hand. This folder holds what rebuilds it: the Caddyfile and
its systemd drop-in, server.sh (the pinned e2e image behind Caddy),
catalog.mjs (a test catalog with every drive app installable and shown
without the experimental toggle, unpublished apps built from this
checkout) and deploy.sh. The README lists the hosts, the limits testers
hit, how to update an app, and where testers' data ends up.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
michielbdejong and others added 2 commits September 28, 2026 12:57
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ir bytes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@michielbdejong
michielbdejong merged commit 3127927 into main Sep 28, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant