A social media "showcase" profile platform (think cards.lol / guns.lol style).
Every user gets rizzzler.onrender.com/username β a themed, customizable
page with their bio, socials, links, photos, and background music.
Built as a classic MVC app: Express + EJS + MongoDB/Mongoose. Every uploaded file (avatar, banner, showcase photos) is streamed straight into MongoDB via GridFS β nothing is ever written to local/server disk. Max upload size is enforced server-side at 5MB.
- Email-verified auth: register β 6-digit code emailed β enter code β verified & logged in.
- Unverified login guard: if an unverified user tries to log in, they're auto-sent a fresh code and dropped on the verify screen.
- Forgot / reset password: email a 6-digit reset code, confirm, set new password.
- Dashboard: "Good morning/afternoon/evening, {name}" greeting, your unique showcase link, quick stats.
- Settings page: edit display name, bio, social/portfolio links, theme, background audio, avatar, banner, and up to 2 showcase photos β all editable, instantly reflected on your public page.
- 7 built-in themes: Moonlight, Scary Sky, Dark Nights, Cute Foxy, Diva, Scifi, and Rocky β each its own color palette + layout accents. Easy to add more (see below).
- Custom visual effects: choose avatar glow styles, typing/glitch/shimmer title effects, and full-page showcase motion transforms for a more Discord-like, high-end profile vibe.
- Legacy badge: the Nth person to ever verify their account gets a permanent
#Nbadge, togglable on/off per user. - Preset audio: drop
.mp3/.wav/.oggfiles inpublic/audios/and they instantly become pickable, loopable, autoplay-able background tracks on users' showcase pages. - GridFS file storage: all images stream through MongoDB, served via
/file/:id, 5MB hard limit, image-type validated. - Admin panel (
/admin): password-protected control center (password fromADMIN_PASSWORDin.env). View stats, search/manage/edit/delete users, and control three mail features:- Newsletter β write a subject/message in the admin panel and send it to every verified, active user.
- Milestone mail β users automatically get an email when their showcase crosses 50, 100, 500, 1,000, 2,000 views, then every +1,000 after that.
- AI fun mail β a Gemini-generated playful email (like a food-delivery app notification) sent to everyone at a random time on random days. Requires
GEMINI_API_KEY. All three can be toggled on/off from the admin Customize page. After 3 incorrect admin password attempts, that device/IP is permanently blocked from ever reaching/adminagain.
- Set
ADMIN_PASSWORDin.envto a strong password. - (Optional, for AI fun mail) Set
GEMINI_API_KEYβ get one at https://aistudio.google.com/app/apikey. - Visit
/adminand log in with just that password (no username). β οΈ You get 3 attempts. On the 3rd wrong attempt, your current device and IP are permanently blocked from/adminβ there is no automatic unblock. Double-check your password before entering it.
Node.js Β· Express Β· MongoDB + Mongoose Β· GridFS Β· EJS Β· express-session (Mongo-backed) Β· bcryptjs Β· Nodemailer Β· Multer (in-memory only)
config/ db.js, mailer.js, themes.js, milestones.js, aiMailScheduler.js
controllers/ authController, dashboardController, showcaseController, fileController, adminController
middlewares/ authMiddleware.js, upload.js (GridFS streaming), adminMiddleware.js
models/ User.js, Counter.js (legacy badge counter), Settings.js, AdminAccess.js
services/ geminiService.js (AI fun mail content generation)
Routes/ authRoutes, dashboardRoutes, showcaseRoutes, fileRoutes, adminRoutes
views/ landing, auth/*, dashboard/*, admin/*, showcase.ejs, partials/*
public/ css/main.css + css/admin.css + css/themes/*.css, js/, audios/
app.js
npm installCopy .env.example to .env and fill in your values:
cp .env.example .envMONGO_URIβ your MongoDB connection string (MongoDB Atlas free tier works great β this same database stores both your data and uploaded files via GridFS).SESSION_SECRETβ any long random string.SMTP_*β an SMTP account to send verification/reset emails. Easiest: a Gmail address with a generated App Password (Google Account β Security β App Passwords).BASE_URLβ e.g.http://localhost:3000locally, orhttps://rizzzler.onrender.comin production.
Drop a few .mp3 files into public/audios/ β they'll automatically show up in every user's Settings β Audio dropdown.
npm run dev # with nodemon, auto-restarts on changes
# or
npm startVisit http://localhost:3000.
- Add a CSS file at
public/css/themes/yourtheme.css, styling the.rz-theme-yourthemeclasses (copy an existing theme file as a starting point β it only needs to override colors/gradients on.rz-showcase-card,.rz-showcase-name, etc.). - Register it in
config/themes.js:{ key: "yourtheme", label: "Your Theme", desc: "...", css: "/css/themes/yourtheme.css", accent: "#hexcolor" }
That's it β it'll automatically appear as a selectable option in Settings.
You can also expand the visual effect catalog in config/visuals.js for new avatar, title, and showcase motion styles.
- Passwords are hashed with bcrypt before ever touching the database.
- Verification/reset codes are 6-digit, expire after 15 minutes, and are single-use (cleared after success).
- Sessions are stored in MongoDB via
connect-mongoβ no filesystem session storage either. - The
/forgot-passwordflow intentionally never reveals whether an email exists in the system.
- Build command:
npm install - Start command:
npm start - Add the same environment variables from
.env.examplein your host's dashboard. - Point
BASE_URLat your live domain so the dashboard link (rizzzler.onrender.com/username) displays correctly.
Made for showing off. Claim your /username and make it yours. β¨