Static room-rental marketplace for students near Università Cattolica and Policlinico Gemelli in Rome, with map search and a no-backend CMS.

Home: search by room type, zone, and budget

Listings: filter by type, zone, and price

Listing: photos and one-tap WhatsApp contact

Map: listings around Cattolica and Gemelli
// OVERVIEW
I rebuilt two 10k-member Facebook groups into a searchable site so students could stop scrolling feeds to find a room near Cattolica and the Gemelli hospital. The whole thing is static, with no database or server behind it. Listings live as Markdown files in the repo and the site rebuilds on every edit through Cloudflare Pages.
The owner manages everything from a browser. I wired Decap CMS to a GitHub backend with Italian field labels and two custom widgets I wrote: one that geocodes an address through Nominatim and drops a draggable map pin, another that auto-generates a UUID magic-token per listing. Every listing title, URL slug, meta description, and Schema.org block is generated from the structured fields. The Zod content schema coerces empty Decap fields to undefined, so one blank optional value can't fail the build and block a publish.
Landlords' phone numbers never touch the HTML or the JSON feed. I split each number into three base64 fragments stored in data attributes and reassemble the wa.me link only in the click handler, so a view-source or a phone-number scrape finds nothing. Photos get a centered, semi-transparent watermark applied at build time only, in a post-build Sharp pass, leaving the repo originals untouched.
It's live at cameregemelli.it with 18 listings, scoring 98 on mobile and 100 on desktop in PageSpeed. Leaflet loads lazily, photos ship as WebP, and there's almost no client JS, so the map-and-search page stays fast on a phone.
// KEY FEATURES
Title, slug, meta description, and Schema.org JSON-LD all derive from 24 structured fields per listing, including an Italian-aware title-caser that keeps prepositions like "dei" lowercase.
Phone numbers are base64-split into data attributes and reassembled only on click, kept out of both the HTML source and the public /api/annunci.json feed.
Decap on a GitHub OAuth backend with Italian labels and custom Nominatim geocoding and UUID widgets, so the owner publishes without a terminal.
A Leaflet/OpenStreetMap view with per-listing pins backed by a static JSON feed, lazy-loaded to keep the page light.
Sharp resizes photos, writes WebP, and stamps a watermark on the build output only; an orphan-photo cleanup step prunes images for deleted listings.
// CLIENT REVIEW
Nurpais did a fantastic job on our project. We needed a fast custom portal built on Astro and Cloudflare Pages with Decap CMS, and he delivered exactly to the spec. He is incredibly fast. Usually development speed means sloppy code, but his work was rock solid and our mobile PageSpeed scores hit the 90s right away. Communication was straightforward and he even handled a couple of minor layout tweaks without any fuss. If you need a developer who actually understands modern static stacks and just gets the job done on time, hire him.
// RELATED WORK