Back to Projects
Brewbook

Brewbook

Next.js 15 React 19 TypeScript Storyblok Algolia Leaflet

Full-stack city guide built with Next.js 15, Storyblok CMS, and Algolia search. Features enterprise-grade search with synonyms, typo tolerance, and composite filtering. Service-oriented backend with dependency injection.

Next.js 15 App Router with Storyblok visual editor integration
01

Next.js 15 App Router with Storyblok visual editor integration

Headless CMS architecture with Storyblok powering content and Algolia handling search. Components are mapped to Storyblok blocks (hero, cafe, event, card_grid) enabling visual editing while maintaining type-safe rendering in React.

React InstantSearch with real-time results
02

React InstantSearch with real-time results

Search powered by Algolia with configured synonyms (quiet↔calm↔peaceful, wifi↔internet↔wireless) and typo tolerance. React InstantSearch provides instant filtering with infinite scroll pagination loading 6 hits per page.

Faceted filtering with composite attributes
03

Faceted filtering with composite attributes

Advanced faceted search across noise_level, price_range, wifi, power_outlets, and more. The "Work-Friendly" filter demonstrates composite filtering—combining WiFi and power outlet availability into a single smart toggle.

Dynamic routes with Storyblok rich text rendering
04

Dynamic routes with Storyblok rich text rendering

Detail pages use Next.js dynamic routing (/cafe/[slug]) with server-side Storyblok fetches. Rich text content is extracted from nested Storyblok structures and rendered with the official rich text renderer.

Geolocation with Leaflet maps
05

Geolocation with Leaflet maps

Each venue includes _geoloc data synced to Algolia. React Leaflet renders interactive maps on detail pages. The data model supports both cafes and events with shared search infrastructure but type-specific rendering.

Service-oriented data pipeline
06

Service-oriented data pipeline

Backend follows SOLID principles with StoryblokService, AlgoliaService, RecordNormalizer, and SeedingOrchestrator. Python seeds Storyblok, Node.js syncs to Algolia with idempotent upserts—safe to re-run without duplicates.