Skip to content

SouleymaneSy7/fyrre-magazine-website

Repository files navigation

Fyrre Magazine Website

Website Preview

Demo

Website Link: Demo Live Site

Total time spent on this project: wakatime

100+ hours on WakaTime. Every page, route, component, API endpoint, email template — no dead links, no unfinished sections. Custom 404, Coming Soon page, full newsletter pipeline. Learning project, shipped complete.


Overview

Fyrre Magazine is a digital magazine platform built with Next.js 16. MDX articles with frontmatter, category filtering via URL params, pagination that resets when you switch categories — the usual content-site essentials. Newsletter subscriptions go through Resend with React Email templates. Also includes a podcast section, author profiles, and a custom 404 page.

Design by Pawel Gola.


Features

Content & Navigation

  • MDX format article support with frontmatter parsing
  • Magazine category filtering with URL search params (?category=sculptures)
  • URL-synced Prev / Next pagination — 6 articles per page (?page=2)
  • Pagination resets to page 1 automatically when changing category
  • Custom author profiles and integrated podcast section

Newsletter System

  • Form validation with react-hook-form + Zod on both client and server
  • Resend email delivery API integration
  • Subscribers automatically saved to Resend Audiences — works without a verified domain
  • Demo mode — welcome emails redirected to a test address (RESEND_TEST_EMAIL)
  • Production mode — welcome emails sent directly to subscribers (RESEND_FROM_EMAIL)
  • Admin notification email on every new subscription
  • Animated Toast notifications with auto-dismiss progress bar
  • Reusable Spinner component for loading states

Email Templates (React Email)

  • WelcomeEmail — welcome email sent to new subscribers
  • AdminNotificationEmail — instant admin notification with subscriber details
  • Design tokens fully synchronized with globals.css (colors, spacing, typography)

Design & Accessibility

  • Responsive layout across all devices
  • Keyboard navigation and screen reader support (VisuallyHidden, aria-*, role)
  • SEO optimized with dynamic metadata per page
  • Optimized image loading with Next.js Image component
  • Smooth little animations powered by Motion

Technologies

Core

Styling & UI

Content & Data

Forms & Validation

Email

Utilities


Prerequisites

  • Node.js 18+
  • Bun (package manager)
  • A Resend account (free tier is sufficient)

Installation

# Clone the repository
git clone https://github.com/souleymanesy7/fyrre-magazine-website.git

# Navigate to directory
cd fyrre-magazine-website

# Install dependencies
bun install

# Start development server
bun run dev

Environment Variables

Create a .env.local file at the root of the project:

# ── Required ──────────────────────────────────────────────────────────────────

# Resend API key — get yours at resend.com
RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxx

# Admin email — receives a notification on every new subscriber
NEWSLETTER_TO_EMAIL=your@email.com

# ── Email sending mode (pick one) ─────────────────────────────────────────────
# Demo mode — welcome emails are redirected to this address instead of the real subscriber
# Use this when you don't have a verified domain yet
RESEND_TEST_EMAIL=your@email.com

# Production mode — set this once your domain is verified at resend.com/domains
# When defined, welcome emails are sent directly to the real subscriber
# RESEND_FROM_EMAIL=hello@your-domain.com

How it works without a verified domain: Resend's free plan only allows sending emails to your own account address. With RESEND_TEST_EMAIL set, welcome emails are redirected to you for preview — while every subscriber's email is still saved in your Resend Audience list. When you add a verified domain, just set RESEND_FROM_EMAIL and remove RESEND_TEST_EMAIL. No code changes required.

Project Structure

fyrre-magazine-website/
├── contents/                            # MDX content files
│   ├── magazine/                        # Magazine articles
│   ├── authors/                         # Author profiles
│   └── podcast/                         # Podcast episodes
│
├── public/                              # Static assets
│   ├── assets/                          # Images and media
│   └── preview/                         # README preview images
│
├── src/
│   ├── app/                             # Next.js App Router
│   │   ├── api/
│   │   │   └── newsletter/              # POST /api/newsletter — Resend integration
│   │   ├── authors/                     # Authors listing + individual pages
│   │   ├── coming-soon/                 # Dedicated coming soon page for unavailable links
│   │   ├── magazine/                    # Magazine listing — category filter + pagination
│   │   ├── podcast/                     # Podcast listing + individual episodes
│   │   ├── style-guide/                 # Internal design system reference
│   │   ├── favicon.ico
│   │   ├── globals.css                  # Global styles & design tokens
│   │   ├── layout.tsx                   # Root layout
│   │   ├── not-found.tsx                # Custom 404 page
│   │   └── page.tsx                     # Homepage
│   │
│   ├── components/
│   │   ├── common/                      # Reusable UI primitives
│   │   │   ├── Button.tsx
│   │   │   ├── Card.tsx
│   │   │   ├── Container.tsx
│   │   │   ├── Form.tsx
│   │   │   ├── Input.tsx
│   │   │   ├── List.tsx
│   │   │   ├── SkipToContents.tsx
│   │   │   ├── Title.tsx
│   │   │   └── VisuallyHidden.tsx
│   │   ├── ui/                          # Reusable UI components
│   │   │   ├── DateFormatter.tsx
│   │   │   ├── Headline.tsx
│   │   │   ├── LinkWithArrow.tsx
│   │   │   ├── Marquee.tsx
│   │   │   ├── Pagination.tsx           # Prev/Next navigation with URL sync
│   │   │   ├── PrintEditionCard.tsx     # Cover card with hover overlay + coming soon CTA
│   │   │   ├── ScrollIndicator.tsx
│   │   │   ├── Spinner.tsx              # Animated 4-bar loading indicator
│   │   │   └── Toast.tsx                # Slide-up notification with progress bar
│   │   ├── navigation/                  # Navigation components
│   │   │   ├── Footer.tsx
│   │   │   ├── HamburgerMenu.tsx
│   │   │   ├── Header.tsx
│   │   │   ├── Navbar.tsx
│   │   │   ├── NavbarDesktop.tsx
│   │   │   ├── NavbarMobile.tsx
│   │   │   └── SingleNav.tsx
│   │   ├── sections/                    # Page section components
│   │   │   ├── homepage/
│   │   │   │   ├── HomepageAuthorList.tsx
│   │   │   │   ├── HomepageHero.tsx
│   │   │   │   ├── HomepageMagazineList.tsx
│   │   │   │   ├── HomepagePodcastList.tsx
│   │   │   │   └── HomepageSidebar.tsx
│   │   │   ├── magazine/
│   │   │   │   ├── MagazineCategories.tsx  # Category filter with URL sync
│   │   │   │   ├── MagazineLatestArticles.tsx
│   │   │   │   ├── MagazinePostContents.tsx
│   │   │   │   ├── MagazinePostHero.tsx
│   │   │   │   ├── MagazinePostSidebar.tsx
│   │   │   │   ├── MagazineSummaryCard.tsx
│   │   │   │   └── Magazines.tsx           # Magazine grid with filter + pagination
│   │   │   ├── authors/
│   │   │   │   ├── AuthorContents.tsx
│   │   │   │   ├── AuthorSideBar.tsx
│   │   │   │   └── AuthorSummaryCard.tsx
│   │   │   └── podcast/
│   │   │       ├── PodcastContents.tsx
│   │   │       ├── PodcastSidebar.tsx
│   │   │       └── PodcastSummaryCard.tsx
│   │   ├── forms/                       # Form components
│   │   │   └── NewsletterForm.tsx       # Unified form — footer & sidebar variants
│   │   └── errors/                      # Error & fallback pages
│   │       └── Custom404.tsx
│   │
│   ├── emails/                          # React Email templates
│   │   ├── WelcomeEmail/
│   │   │   ├── WelcomeEmail.tsx
│   │   │   └── style.ts                 # Design tokens mirrored from globals.css
│   │   └── AdminNotificationEmail/
│   │       ├── AdminNotificationEmail.tsx
│   │       └── style.ts                 # Design tokens mirrored from globals.css
│   │
│   ├── hooks/
│   │   └── usePagination.ts             # Client-side pagination with URL search params
│   │
│   ├── constants/                       # Static data and configuration
│   ├── libs/                            # Utility functions and helpers
│   ├── icons/                           # SVG icon components
│   ├── types/                           # TypeScript type definitions
│   └── validators/                      # Zod schemas (email, forms)
│
├── .gitignore
├── bun.lock
├── eslint.config.mjs
├── next.config.ts                       # Next.js & Webpack configuration
├── postcss.config.mjs                   # PostCSS configuration for Tailwind
├── tsconfig.json                        # TypeScript configuration
└── package.json

Email Preview

Preview your email templates locally with React Email:

bunx email dev --dir src/emails

Opens a live preview server at http://localhost:3000 with hot reload for all email templates.


Performance

  • Lighthouse Score:
    • Performance: 97/100
    • Accessibility: 100/100
    • Best Practices: 100/100
    • SEO: 100/100

Lighthouse Preview


Available Scripts

bun run dev        # Start development server with Webpack
bun run build      # Build for production + copy MDX contents to .next/standalone
bun run start      # Start production server
bun run lint       # Run ESLint

Configuration

  • next.config.ts — Next.js and Webpack configuration
  • tsconfig.json — TypeScript configuration
  • .env.local — Environment variables (see above)

Contributing

Contributions are welcome! Please follow these steps:

  1. Fork the project
  2. Create your feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

Developed with ❤️ by Souleymane Sy

About

A fully shipped magazine platform built with Next.js 16 App Router, MDX, TypeScript & Tailwind CSS 4 — featuring a complete newsletter pipeline (Resend + react-hook-form + Zod), React Email templates, URL-synced pagination, and custom animated UI components. Every page complete and functional. Lighthouse 97/100 · 100+ hours tracked with WakaTime.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors