Loading...
Loading...

Full-stack site for a Swedish youth organization focused on community safety and youth engagement in Alby, Botkyrka. The frontend is a Next.js 15 App Router app with eight routes — landing page with a full-screen video hero, project pages for BotkyrkaChill and UIA, sponsor listings, contact form, membership info, a membership application form, and the usual legal/privacy stuff. On the backend there are actually two implementations living side by side: an Express server with Mongoose that persists membership data and sends emails via Nodemailer, and newer Next.js API routes that do the same thing but add rate limiting and input sanitization. The migration between them never fully finished, so both stay.
The frontend runs on Next.js App Router with client components throughout, using shadcn/ui as the component library and a Tailwind config extended with Alby's brand colors. The project showcase page has a from-scratch carousel built on Framer Motion's AnimatePresence with spring physics and Swiper for touch input. Backend-wise, the Express server handles MongoDB writes through Mongoose and email via Nodemailer, while the newer Next.js API routes layer on rate limiting and sanitization. A middleware file sets security headers — full CSP, HSTS, the works — on all non-static responses. There's also a small toolkit of Sharp scripts for converting images to WebP, sorting by orientation, and verifying that every carousel asset actually exists on disk.
Live at albyradet.se. The site handles membership applications end to end — form submission, MongoDB storage, email notification to the org admins — and does the same for the contact form minus the database part. Built pro bono for a local youth organization.