Mnemosyne Admin is an Express + PostgreSQL web app for managing community birthday entries using Discord OAuth authentication.
- Discord OAuth login (
/login→/callback) - Role-based admin access using Discord guild roles
- Personal birthday management (
/me/birthdays) - Admin user directory and per-user management (
/admin/users,/admin/users/:id) - JSON export/import tools for backups (
/admin/export.json,/admin/import) - Server-side sessions stored in Postgres (
connect-pg-simple) - Basic hardening:
- HTTP-only secure session cookie
- CSRF validation on all POST routes
- Security headers (
X-Frame-Options,X-Content-Type-Options, etc.)
- Responsive admin directory view for smaller screens
- Node.js (ESM)
- Express
- PostgreSQL (
pg) express-session+connect-pg-simple
DATABASE_URLDISCORD_CLIENT_IDDISCORD_CLIENT_SECRETDISCORD_REDIRECT_URIDISCORD_GUILD_IDBOT_TOKENSESSION_SECRET
ADMIN_ROLE_IDS(comma-separated Discord role IDs)BIRTHDAYS_TABLE(default:birthdays)PORT(default:3000)PGSSLMODE(disableto turn off SSL)
- Install dependencies:
npm install
- Set env vars in your shell (or
.envif your workflow loads it). - Start server:
npm start
- Open
http://localhost:3000.
GET /– homeGET /login– start Discord OAuthGET /callback– OAuth callbackGET /logout– clear session
GET /me/birthdaysPOST /me/birthdaysPOST /me/birthdays/:id/editPOST /me/birthdays/:id/delete
GET /admin/usersGET /admin/users/:idPOST /admin/users/:id/addPOST /admin/users/:id/deleteGET /admin/export.jsonGET /admin/importPOST /admin/import
discord_usersuser_id(PK),username,avatar,last_seen_at
- birthdays table (defaults to
birthdays)id,user_id,character_name,character_name_key,month,day,image_url, timestamps
Schema/bootstrap is handled on server startup in ensureSchema().
- Run this behind HTTPS in production.
- Keep
SESSION_SECRET, OAuth credentials, and bot token private. - Restrict
ADMIN_ROLE_IDSto trusted roles only.