Files
dependabot[bot] f57036859e Bump qs and express in /server
Bumps [qs](https://github.com/ljharb/qs) to 6.15.2 and updates ancestor dependency [express](https://github.com/expressjs/express). These dependencies need to be updated together.


Updates `qs` from 6.14.2 to 6.15.2
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.14.2...v6.15.2)

Updates `express` from 4.22.1 to 4.22.2
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/v4.22.2/History.md)
- [Commits](https://github.com/expressjs/express/compare/v4.22.1...v4.22.2)

---
updated-dependencies:
- dependency-name: qs
  dependency-version: 6.15.2
  dependency-type: indirect
- dependency-name: express
  dependency-version: 4.22.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-23 12:21:07 +00:00
..
2026-05-23 12:21:07 +00:00

RYS Premium Server

Backend server for the premium subscription system.

Quick Start

# Install dependencies
npm install

# Copy env and fill in values
cp .env.example .env

# Run tests
npm test

# Start development server
npm run dev

# Start production server
npm start

API Endpoints

Endpoint Method Auth Description
/health GET No Health check
/auth/send-magic-link POST No Send magic link email
/auth/verify GET No Magic link target (HTML)
/auth/poll GET No Poll for verification status
/license/check GET Yes Check premium status
/checkout/create POST Yes Create Stripe checkout session
/checkout/success GET No Success page (HTML)
/checkout/cancel GET No Cancel page (HTML)
/billing/portal POST Yes Create billing portal session
/billing/return GET No Return page (HTML)
/webhook/stripe POST No* Stripe webhook

*Authenticated via Stripe signature

File Structure

server/
├── src/
│   ├── index.js        # Entry point
│   ├── config.js       # Configuration
│   ├── routes/         # Express routes
│   ├── services/       # Stripe, JWT, email
│   └── storage/        # File-based storage
├── data/
│   ├── grandfathered.json   # Donor emails (gitignored)
│   ├── auth-requests/       # Pending auth (auto-created)
│   └── rate-limits/         # Rate limit counters (auto-created)
├── tests/
└── package.json

Grandfathered Users

Past donors get lifetime premium. Store emails in data/grandfathered.json:

["donor1@example.com", "donor2@example.com"]

This file is gitignored. See data.example/ for format.

Full Documentation

See DEPLOYMENT.md for complete setup, deployment, and testing instructions.