rjweb-server 9.x uses {param} not :param for dynamic route segments.
All parametric routes (/webhook/{userId}, /api/previews/{id}, etc.)
were returning 404 because the server never matched them.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Auto-create WebhookToken for new users (first-user and admin-created),
so setup wizard step 3 immediately has a valid secret to display
- Setup wizard: load webhook secret on step 3 entry (not only on AWS save),
so skipping AWS setup still shows correct webhook info
- Admin panel: add Edit modal with username and password change for any user
(spec: 'Edit username or password of any user')
- Webhook handler: only post 'no config' comment on opened/reopened actions,
not on synchronize or closed — prevents spam on sync events
- deploy.ts: clear stale abort signal at start of runDeploy so a signal meant
to cancel the previous job cannot accidentally abort the new one
- routes/auth.ts: fix sameSite cookie case to lowercase 'lax' per TypeScript
- Add node-cron type declaration to silence TS7016 for that import
- SPEC.md: fix ec2:ImportKeyPair → ec2:CreateKeyPair (code uses CreateKeyPair)
- example.env: improve comments, add NODE_ENV, add key generation hints
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- EC2 bootstrap now enables root SSH (copies authorized_keys to root, sets
PermitRootLogin without-password, reloads sshd) so all commands run as
root and NVM at /root/.nvm is accessible
- Added /var/lib/pp-bootstrap-done sentinel; deploy waits for it before
running any user commands — prevents race between SSH availability and
user-data completion (docker/nvm install can take 3-5+ min)
- Fixed stopPreview: terminate instance first, delete key pair next, then
delete security group with 30s delay — SG deletion was previously
attempted before termination causing it to fail
- Fixed redeploy to always fetch fresh instanceIp/sshPrivateKey from DB
rather than using potentially-stale preview parameter
- Fixed .env writing to use base64 encoding via echo|base64-d to safely
handle values with special characters, single quotes, and newlines
- PAT and git clone URL now masked in preview logs (shows **** for password)
- Fixed inactivity cron: removed dead inactivityMs variable, use join on
repoConfig to avoid N+1, deduplicate pending INACTIVITY_STOP jobs
- Fixed IAM policy UI: ec2:CreateKeyPair (backend uses CreateKeyPair, not
ImportKeyPair which is a different AWS operation)
- Admin panel: added Edit button with username/password form for users
- Privacy page: fetch and display admin contactEmail from settings
- pnpm-workspace.yaml: fix allowBuilds→onlyBuiltDependencies for pnpm 9
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
rjweb-server path.http() second argument is the FULL path, not relative to prefix.
Changed all routes from server.path('/prefix', path => path.http(method, '/suffix', ...))
to server.path('/', path => path.http(method, '/prefix/suffix', ...)).
Also fixed:
- Duplicate createContext import in useAuth.ts
- notFound handler now excludes /webhook paths from SPA fallback
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Prefix all nvm-dependent commands with NVM source via withNvm() helper
- Fix .env file writing using printf instead of heredoc (which does not work over SSH exec)
- Fix git clone URL encoding using URL class for proper credential encoding
- Add DEBIAN_FRONTEND=noninteractive to apt-get for non-interactive installs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
AWS CreateKeyPair generates the RSA key pair server-side and returns the private key,
avoiding the need to manually format RSA public keys in OpenSSH wire format.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- On startup, scan for EC2 instances with pp:managed=true and terminate any orphans
- SetupWizard now renders as full-page (no Layout wrapper)
- Fixed SSH RSA key generation (generateKeyPairSync with spki format)
- Removed unused import in orphanCleanup.ts
- Frontend rebuild with App.tsx routing fix
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>