A modern, performant, and accessible website for The Brooklyn Rail, built with Next.js and Directus Cloud.
🏆 2025 Webby Honoree — Best Visual Design - Function (Webby Awards)
This site was completely re-platformed and re-designed in 2024 to consolidate and make accessible the Rail's vast archive of articles and videos chronicling art and culture since 2000.
| Role | Person |
|---|---|
| Digital & Brand Strategy | Juliette Cezzar & Jeremy Zilar |
| Site Design | Juliette Cezzar & Jeremy Zilar |
| Site Development | Jeremy Zilar |
About the team:
- Juliette Cezzar — Designer, educator, and writer. Former Director of Communication Design at Parsons School of Design and President of AIGA NY. Board member of The Brooklyn Rail since 2018.
- Jeremy Zilar — Designer, strategist, and engineer. Board member of The Brooklyn Rail. Formerly oversaw blogs at The New York Times and served as Director of Digital.gov.
Set in Untitled Sans and Untitled Serif by Klim Type Foundry.
- William Friedman, Alex van der Valk, and Jose Varela at Directus for their continuing technical guidance and support towards managing and migrating our archive data.
- Next.js 15 - React framework for server-rendered applications
- TypeScript - Type-safe JavaScript
- Directus Cloud - Headless CMS for content management
- Tailwind CSS - Utility-first CSS framework
- Vercel - Hosting and deployment platform
- Algolia - Search functionality
- Mailchimp - Newsletter management
- PostHog - Analytics and user tracking
- Google Analytics - Additional analytics
- Stripe - Payment processing for donations
- Airtable - Data management
- Directus Cloud (
studio.brooklynrail.org) — Primary content management system. All articles, issues, events, contributors, and media are managed here. - Vercel — Hosts the main Next.js application with automatic deployments from the
mainbranch. - Cloudflare Workers — Routes
/donatetraffic to Netlify-hosted Hugo site. - Algolia — Provides search functionality across all content types.
- Node.js 20+
- Yarn package manager
- Access to Directus Cloud instance
- Environment variables (see
.env.example)
- Clone the repository:
git clone https://github.com/brooklynrail/app.git
cd app- Install dependencies:
yarn install- Create environment file:
cp .env.example .env.local- Update
.env.localwith your credentials:
DIRECTUS_URL- Your Directus Cloud instance URLDIRECTUS_TOKEN- Your Directus API tokenALGOLIA_APP_ID- Algolia application IDALGOLIA_SEARCH_KEY- Algolia search API keyALGOLIA_ADMIN_KEY- Algolia admin API keyMAILCHIMP_API_KEY- Mailchimp API keyMAILCHIMP_API_SERVER- Mailchimp server prefixMAILCHIMP_AUDIENCE_ID- Mailchimp audience/list ID
- Start the development server:
yarn dev- Open https://localhost:3000 in your browser
yarn dev- Start development server (with HTTPS)yarn build- Build production bundleyarn start- Start production serveryarn lint- Run ESLintyarn type-check- Run TypeScript type checkingyarn validate- Run both linting and type checking
The Brooklyn Rail website manages several types of content through Directus:
- Core content type for all written pieces
- Includes fields for title, body, excerpt, contributors, images
- Connected to issues and sections
- Supports featured articles and artwork
- Monthly and special issues
- Contains articles, sections, and metadata
- Supports both regular monthly issues and special editions
- Content categories (e.g., Art, Poetry, Fiction, ArtSeen, Critics Page)
- Organizes articles by topic
- Includes metadata and sorting
- Authors and contributors to the Rail
- Manages biographical information and contributions
- The New Social Environment events
- Includes event details, participants, and scheduling
- Art exhibitions featured in the Rail
- Includes location, dates, and related information
- Profiles of artists, writers, and other figures
- Connected to articles and events
- Curated groups of content
- Used for homepage features and special sections
- Static content pages
- Includes about pages, contact information, etc.
app/
├── app/ # Next.js App Router
│ ├── api/ # API routes
│ │ ├── article/ # Article endpoints
│ │ ├── collections/ # Collections endpoints
│ │ ├── events/ # Events endpoints
│ │ ├── issues/ # Issues endpoints
│ │ ├── preview/ # Preview mode endpoints
│ │ ├── refresh/ # Cache refresh endpoints
│ │ └── ...
│ ├── hooks/ # Custom React hooks
│ ├── providers/ # Context providers (PostHog, etc.)
│ ├── [year]/ # Dynamic year routes (legacy redirects)
│ ├── about/ # About pages
│ ├── contributor/ # Contributor pages
│ ├── events/ # Events listing and detail
│ ├── exhibitions/ # Exhibitions
│ ├── issues/ # Issue pages
│ ├── preview/ # Preview mode pages
│ ├── search/ # Search page
│ ├── section/ # Section pages
│ ├── tribute/ # Tribute pages
│ └── ...
├── components/ # React components
│ ├── ads/ # Advertisement components
│ ├── article/ # Article-related components
│ ├── banner/ # Homepage banner
│ ├── collections/ # Collection displays
│ ├── events/ # Event components
│ ├── header/ # Site header
│ ├── footer/ # Site footer
│ ├── issuePage/ # Issue page components
│ ├── search/ # Search components
│ └── ...
├── lib/ # Shared utilities
│ ├── directus.tsx # Directus client configuration
│ ├── types.ts # TypeScript type definitions
│ ├── utils.tsx # Utility functions
│ └── utils/ # Additional utilities
├── public/ # Static assets
│ ├── images/ # Static images
│ └── pdf/ # PDF files
├── styles/ # Global styles
│ ├── globals.scss # Global CSS
│ ├── fonts.scss # Font definitions
│ ├── themes.scss # Theme variables
│ └── ...
└── types/ # Additional TypeScript types
The site is automatically deployed to Vercel when changes are pushed to the main branch. Preview deployments are created for pull requests.
Production URL: https://brooklynrail.org
Preview URL: https://preview.brooklynrail.org (requires Vercel login)
All environment variables must be set in the Vercel project settings for production deployment. See .env.example for required variables.
- Create a feature branch from
main - Make changes and test locally
- Push branch and create a Pull Request
- Vercel creates a preview deployment automatically
- Review and test the preview deployment
- Merge to
mainto deploy to production
| Content Type | URL Pattern | Example |
|---|---|---|
| Issue | /issues/[issueSlug] |
/issues/2024-09 |
| Article | /issues/[issueSlug]/[section]/[slug] |
/issues/2024-09/art/my-article |
| Section | /section/[slug] |
/section/artseen |
| Contributor | /contributor/[slug] |
/contributor/john-smith |
| Event | /event/[year]/[month]/[day]/[slug] |
/event/2024/09/15/my-event |
| Exhibition | /exhibition/[slug] |
/exhibition/gallery-show |
| Tribute | /tribute/[tributeSlug] |
/tribute/artist-name |
The site maintains redirects from the old URL structure for backwards compatibility:
| Old Pattern | New Pattern |
|---|---|
/2024/09/ |
/issues/2024-09 |
/2024/09/artseen/ |
/issues/2024-09/artseen |
/special/River_Rail/ |
/issues/River_Rail/ |
See vercel.json and the legacy redirect middleware for complete redirect rules.
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
Please ensure your code follows the project's coding standards and includes appropriate tests.
This project is proprietary and confidential. All rights reserved.
- HANDOFF.md - Handoff documentation for new development team
- Directus Documentation - CMS documentation
- Next.js Documentation - Framework documentation