From Side Project to 100% PageSpeed: How We Built Morocco's Restaurant Guide
It started the way most side projects do — with frustration.
We wanted to find good places to eat in Casablanca. Not TripAdvisor-style directories where anyone can post anything. Not Instagram accounts where you can't tell sponsored content from genuine recommendations. We wanted honest, first-hand reviews from people who actually went, sat down, ate the food, and had an opinion.
That didn't exist in Morocco. So we built it.
The WordPress era
Où Sortir launched on WordPress. Classic setup — a theme, some custom fields, manual data entry. Every time we wanted to add a new restaurant, bar, or café, someone had to:
- Look up the address, phone number, hours, website
- Find and download photos
- Write a description
- Pull Google reviews
- Format everything
- Publish
Twenty minutes per listing. On a good day.
We got to 80 places and hit a wall. Not a technical wall — a motivation wall. Adding a single lieu felt like homework. So we stopped. Où Sortir became that thing we'd "get back to eventually." It sat there for months, collecting dust, while we focused on client work at Netspace.
The rebuild
When I got back into building with AI, Où Sortir was one of the first things I looked at with fresh eyes. The content was good — real reviews, real visits, real opinions. The infrastructure was holding it back.
So we rebuilt everything from scratch.
Astro for the frontend — fully static site generation. Every page pre-rendered at build time, served from Cloudflare Pages edge network. No server, no runtime, no cold starts. Just HTML.
Directus as the headless CMS — clean data modeling, proper relationships between lieux, categories, cities, events. A real backend instead of WordPress's post-meta chaos.
shadcn/ui for the design system — consistent components, proper dark mode, responsive layouts that actually work. The kind of polish that makes users trust the content.
Meilisearch for instant search — typo-tolerant, fast, filterable by city, category, sub-category.
MapLibre for interactive maps — colored markers by category, cluster view, individual lieu pages with precise locations.
The result: 100/100 on PageSpeed Insights. Not 95, not 98. A perfect score. Every page loads instantly because every page is just static HTML served from the nearest Cloudflare edge node.
The pipeline that changed everything
Here's where it gets interesting.
Adding a new lieu to Où Sortir now takes about 30 seconds of human input. You enter three things in Directus:
- The name
- The category (restaurant, bar, café, hotel...)
- The city
That's it. Then the automation takes over.
An n8n workflow triggers automatically. It hits the Google Places API and pulls everything — address, phone number, website, opening hours, rating, Google reviews, photos. It scrapes the place's Instagram profile using Puppeteer to grab the profile picture and imports it as the logo.
Then Ollama — running locally on our server — generates SEO-optimized descriptions, meta titles, and meta descriptions in French, tailored for the Moroccan context. It also creates a review outline for our editorial team.
All photos get imported into Directus as managed assets. Google reviews get stored as structured data with reviewer names, ratings, dates, and text.
The lieu page is ready. Our team just needs to write the actual review — the human part that no AI can replace, because we were physically there.
From 20 minutes to 30 seconds. That's not an optimization. That's a category change.
The proof is in the numbers
The day after we finished the migration, we added 20 new lieux. In a single day. That's a quarter of what we'd built in the entire WordPress era.
We're now covering four cities — Casablanca, Rabat, Marrakech, and Tangier — with plans to expand. The traffic growth has been consistent since launch, with organic search driving the majority of visits. When your pages load instantly and your SEO is structurally sound, Google notices.
But the number I care about most isn't traffic. It's the fact that every single review on the site was written by someone who was actually there. No paid placements in editorial content. No sponsored reviews disguised as opinions. When we say a place is good, we mean it. When we say the service was slow, we write that too.
The team
We now have three people dedicated to Où Sortir. Their job is beautifully simple: go out, eat, drink coffee, take notes, take photos. Come back, write the review, add the lieu. The pipeline handles the rest.
They visit places unannounced. No "we're coming to review you" calls. No special treatment. Just a regular visit, a regular meal, a regular experience. That's the whole point — if we told them we were coming, the review would be worthless.
What was a side project is now a business
This is the part I didn't expect.
Où Sortir was never supposed to make money. It was a passion project, a showcase of what we could build, a reason to try new restaurants and write about it. But when your platform has real traffic, real trust, and real engagement, revenue follows.
We've implemented sponsored listings — businesses can pay to appear prominently on the homepage. We run banner and popup partnerships with select brands. And we're about to launch a weekly newsletter curating the best spots and upcoming events.
It's not Netspace revenue. It's Où Sortir revenue. A standalone business with a dedicated team, growing on its own terms.
The meta lesson
Every tool I've written about in this blog — Remindian, Suwar, Barq, Risala — follows the same pattern. Build for yourself. Solve a real problem. Let the quality of the solution attract others.
Où Sortir is the same story at a larger scale. We wanted a restaurant guide we could trust. We couldn't find one. So we built one that loads in milliseconds, enriches itself automatically, and runs on honest reviews from people who actually showed up.
If you're in Morocco and looking for your next dinner spot, a café to work from, or a bar for Friday night — ousortir.ma. Every recommendation is tested. Every review is real.