Skip to content

Sync with Start9-Community upstream - #9

Merged
wksantiago merged 10 commits into
mainfrom
next
Oct 18, 2026
Merged

wksantiago merged 10 commits into
mainfrom
next

Conversation

@wksantiago

Copy link
Copy Markdown
Collaborator

Brings the fork's main up to Start9-Community/standardnotes-startos@8e1990e: community audit (#1), web app (#2), and the Signups health-check fix (#5). Fast-forward content — no fork-only changes.

🤖 Generated with Claude Code

MattDHill and others added 10 commits October 16, 2026 10:10
- Close registration from StartOS: a Disable/Enable Signups action, an
  important install task to run it, a Signups health check that fails while
  signups are open, and DISABLE_USER_REGISTRATION passed to the server.
- Replace the Premium Activation Mode toggle, which exposed the activation
  endpoint on the live server, with an Activate Premium action that grants a
  subscription through a private, temporary server while the service is
  stopped.
- Replace the free-text files URL with Set Files URL (setupPrimaryUrl), which
  picks from the server's own addresses and follows them when they change.
- Run Valkey as its own daemon instead of Redis inside the server image;
  drop docker_entrypoint.sh and start the server with plain node so signals
  reach it; probe /healthcheck at a 5s cadence while starting; cap the stop
  timeout at 10s since upstream never exits on SIGTERM.
- Generate ADMIN_KEY so upstream's /admin and /internal routes stay closed.
- Build for aarch64 as well as x86_64.
- License is upstream's: AGPL-3.0-or-later, with LICENSE pointing at the
  submodule's file. packageRepo points at the Start9-Community fork.
- Translate every string into es_ES, de_DE, pl_PL and fr_FR; rewrite README,
  instructions, UPDATING and AGENTS to the packaging guide.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Activate Premium launched a temporary server with E2E_TESTING on, and
upstream's listen(port) binds every interface, so the unauthenticated
/e2e/activate-premium endpoint was reachable from the service network
while the action ran.

The action now runs activate-premium.js in a temporary container against
the stopped server's SQLite database. The script boots upstream's auth
service in-process with the overrides HomeServer passes it and calls its
activatePremiumFeatures method, so the grant is upstream's own use case
with nothing listening. No Valkey, no temporary server, no carried patch;
it finishes in a few seconds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
app.standardnotes.com's CSP connect-src allows only Standard Notes' own
hosts, so sign-in to a custom server fails with "Failed to fetch". Point
users at the desktop and mobile apps or a self-hosted standardnotes/web.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add a Web App interface (ui, port 8080) on the API's host. nginx serves the
static files of upstream's standardnotes/web image — published for amd64
only, but architecture-independent, so copied into a multi-arch nginx image
— and proxies every other path to the server, so the app and the API share
one origin. index.html is rewritten at build time to sync with that origin
and to skip websockets, which the home server does not provide: the app
signs in with no server address to enter, and session cookies are
first-party on every address.

Rename uiPort to apiPort now that the package has a real UI port.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The built-in Web App is a third-party host at its StartOS addresses like
any client, but syncs with the origin it is loaded from, so opened at
http://localhost:3123 through a plain-to-TLS forward it unlocks premium.

The desktop recipe's plain TCP passthrough to the StartOS address could
never complete: StartOS answers a TLS ClientHello whose SNI is localhost
with an unrecognized_name alert. Both upstreams now go through the
TLS-terminating proxy, verifying the LAN address against the root CA.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pointed at the Web App's address, the desktop app's TLS-terminating proxy
also serves the web app at https://localhost:3123, since nginx proxies the
API on the same origin; the two recipes otherwise collide on port 3123.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat: serve the Standard Notes web app
The check's result is fixed for the life of main (it only changes on a restart), and the default trigger retries a failure every second, writing 'Health Check <id> failed' to the service log each time. Run it once, with no grace period so the single result is not reported as starting.

Closes #4

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix: check Signups once per start; 1.23.8:0 → 1.23.8:1
@wksantiago
wksantiago merged commit db67c17 into main Oct 18, 2026
3 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.

2 participants