Back home
Oasi Kadir preview

Oasi Kadir

A bilingual agriturismo site on Cloudflare - content-managed, fast, and cheap to run

Visit site
Client
Oasi Kadir (agriturismo, Rome)
Role
Design & full-stack engineering
Year
2026

The brief

Oasi Kadir is a working agriturismo - a farm that also runs a restaurant, rents rooms, sells its own produce, and hosts events and school trips. They came to me from an old WordPress site that was slow, hard to edit, and expensive to keep online - the kind of slow that costs bookings: it shipped 21 MB to every phone and took 16 seconds before a visitor could actually tap anything.

The ask was simple to state and broad in scope: rebuild the whole thing so that

  • the owners can edit any page themselves, in Italian and English, without touching code;
  • guests can book rooms and events natively, on the site, instead of over the phone;
  • it loads fast on a phone in a field with weak signal;
  • it costs almost nothing to run.

What it's built on

Astro (SSG)Strapi 5Cloudflare WorkersPostgreSQLReactTailwind v4EffectNotionResendTurnstile

What was achieved

Genuinely fast - 99 on mobile, every vital green

The site is fully static - every page is pre-rendered HTML served from Cloudflare's edge, so there's no server to wait on for content. On a throttled mobile Lighthouse run it scores 99, with every Core Web Vital comfortably in the green: the largest element paints in under two seconds, the main thread is never blocked (zero total blocking time), and nothing on the page ever shifts. This is the emulated-mobile-on-slow-4G number - the harsh case, not a fibre-desktop victory lap.

Performance

Performance score99Good
LCP1.9sGood
CLS0.00Good
FCP1.3sGood
TBT0msGood

Lighthouse 13, mobile with simulated 4G throttling - measured 2026-07-16. Lab snapshot, not field data; INP needs real interactions so TBT stands in for responsiveness.

From 16 seconds to under 2

The gap between the old WordPress site and the rebuild is the whole story in one table. Same content, same photos - a fraction of the weight, and interactive almost immediately instead of after a long, janky wait.

Before / after

Old WordPressRebuild
Performance score6999
Time to interactive16.3 s1.9 s
Speed Index10.7 s1.7 s
Page weight21 MB2.7 MB
Server response3.2 s50 ms

Both measured with Lighthouse 13, mobile + simulated 4G, 2026-07-16. Old: oasikadir.it · new: nuovo.oasikadir.it.

Editors publish in minutes, and the site can't go down

Content lives in a Strapi CMS. When an editor hits Publish, a webhook triggers a fresh build and deploy - the change is live in about three minutes, no developer involved. Because the delivered site is just static files, a broken build simply leaves the previous version serving: the site can go stale, but it can't go down.

CMS → live

Editor hits Publish
Strapi webhook
Cloudflare build
Static rebuild
Live at the edge

End to end: ~3 minutes

Builds stay fast even though every image URL changes

Media lives in a private bucket, so Strapi hands back presigned URLs whose signatures change on every build - which naively means re-downloading and re-transforming ~1,300 images each time. A two-layer, content-hash-keyed cache fixes that: originals and optimized variants are keyed by the file's content, so nothing re-processes unless the media actually changed. Cold builds run ~8 minutes; warm builds land at 2–3.

Build time

Cold
8 min
Warm
~2.5 min

Content-hash cache over ~1,300 image transforms - a variant only re-processes when the underlying file changes, not when its presigned URL rotates.

Native bookings, without a backend to babysit

Booking is the one genuinely dynamic thing on the site, so it's the one place with a server: a single Cloudflare Worker handles create / modify / cancel with real availability and capacity checks. Reservations land in a Notion database the owners already use, confirmation and manage-booking emails go out through Resend, and a Turnstile check keeps bots out - all from the edge, with no always-on server to pay for or patch.

Bilingual, top to bottom

Italian at the root, English under /en, every page and every CMS entry localized - including the events, the shop, and the room detail pages.

By the numbers

21CMS content types
2languages, fully mirrored
~24klines of app + UI code
~3 modesign to launch

It's cheap to run

The front end is on Cloudflare's free tier; the CMS and database sit on a small hobby plan. Static-where-possible, dynamic-only-where-needed keeps the whole thing running for a few dollars a month - and nightly off-provider backups mean the data is safe even if a provider isn't.

What the client said

Working with Daniil was a great experience from start to finish. What impressed me most is that he kept finding and fixing problems I didn't even know we had, and he always came with the solution already worked out and clearly explained. He treated the project like it was his own. I will definitely work with him again and recommend him without hesitation.
Ashraf · Oasi Kadir