Authnest is a public archive and runnable demo for a retired authentication product. The project explored consumer-controlled app identities: users could keep app sign-ins and app email separate from their personal inbox, while developers got OAuth-style integration, redirect URI controls, app policies, and stricter email identity checks.
Live archive: authnest.com
The live Authnest service was retired on April 2, 2026. This repository is a safe public snapshot of the product concept. It does not contain production credentials, cloud resources, signing keys, live inboxes, or real user/developer data.
- A small Express archive server for local review
- A static Cloudflare Pages-ready site in
public/ - A local-only representation of an OAuth authorization-code flow
410 Goneresponses for retired OAuth, discovery, and live API routes- Structured archive data with startup/test validation
- Sanitized legacy implementation snapshots under
legacy/
.
|-- index.js # Local server entrypoint
|-- src/
| |-- archive-app.js # Express app factory and demo API routes
| |-- archive-data.js # Canonical product/archive data
| `-- archive-validation.js # Lightweight data shape validation
|-- public/ # Static archive site for Cloudflare Pages
|-- scripts/ # Build helpers for generated static assets
|-- tests/ # Node test runner coverage
|-- docs/ # Project history and publication notes
`-- legacy/ # Sanitized historical source snapshots
The canonical archive content lives in src/archive-data.js. Running
npm run build:data generates public/archive-data.js so the static Pages site
uses the same product data as the local Express server.
- Node.js 20 or newer
- npm
No database, queue, mail provider, Redis instance, or cloud account is required to run the archive.
npm install
npm run build:data
npm startThe local server listens on http://localhost:3000 by default.
npm start # Run the local archive server
npm run dev # Run the server with Node watch mode
npm run build:data # Regenerate public/archive-data.js
npm test # Run Node test runner tests
npm run check # Regenerate data, syntax-check, and test
npm run deploy:pages # Deploy public/ with Wrangler
npm run deploy:pages:preview| Name | Required | Default | Description |
|---|---|---|---|
PORT |
No | 3000 |
Local Express server port. Must be an integer from 1 to 65535. |
The archive intentionally has no production secrets or service bindings.
| Route | Purpose |
|---|---|
/ |
Archive UI and browser-only demo |
/health |
Local service health check |
/api/archive |
Canonical archive JSON |
/api/demo/authorize |
Local-only demo authorization endpoint |
/api/demo/token |
Local-only demo token exchange endpoint |
/oauth2/*, /.well-known/*, retired /api/* |
410 Gone sunset responses |
Demo authorization codes are in-memory, expire after five minutes, and are single-use. They are only a product representation; they are not real OAuth credentials.
The deployable site is the public/ directory. It does not need the Express
server in production because the archive data and browser demo are bundled as
static assets.
Recommended Cloudflare Pages settings:
| Setting | Value |
|---|---|
| Build command | npm run check |
| Build output directory | public |
| Production branch | main |
The included public/_headers file applies a restrictive CSP and basic security
headers. The included public/_redirects file keeps retired service paths from
appearing as live endpoints on the static deployment.
- Treat this repository as an archive and portfolio snapshot, not the retired production service.
- Keep
.envfiles, private keys, logs, credential exports, cloud configuration, inbox data, and real customer data out of the repo. - The
legacy/directory is historical source only. Do not deploy it or treat its routes as supported runtime code. - If archive content changes, run
npm run build:databefore committing so the static bundle stays synchronized withsrc/archive-data.js.
Additional context: