DEV Community

Sardar Dilshad
Sardar Dilshad

Posted on

Building a trilingual, multi-tenant hotel management SaaS for the Kurdistan Region

A few months ago I shipped tourism.krd — first-party hotel and motel management software built specifically for property owners in the Kurdistan Region: Duhok, Erbil, Slemani and Zakho. This post is about the engineering decisions behind it, and why building for a local, underserved, right-to-left, multilingual market turned out to be a genuinely interesting problem.

The problem

Most small hotels and motels in the region still run on paper ledgers or scattered WhatsApp chats. The result is predictable: double-bookings, lost income records, and no clear view of occupancy or revenue. The few digital options that exist are global OTA platforms that take a commission on every booking and assume English-only, left-to-right staff. Nobody had built management software that speaks the local languages and leaves every booking — and every dinar — with the owner.

Why multi-tenant, subdomain per property

Every property runs on its own subdomain — yourmotel.tourism.krd — with its data fully isolated. I went with a single database and row-level multi-tenancy rather than a database per tenant: every row carries a tenant_id, and a host-to-tenant lookup in middleware resolves the subdomain to that ID on each request.

Postgres Row Level Security is the backbone. Reads and writes are scoped by a current_tenant_id() function so a query can never leak across tenants, even if application code has a bug:

create policy tenant_isolation on bookings
  using (tenant_id = public.current_tenant_id());
Enter fullscreen mode Exit fullscreen mode

The trilingual / RTL challenge

The admin works fully in English, Arabic and Kurdish (Bahdini, written in Arabic script), with correct right-to-left mirroring. The hard part isn't translation — it's that every piece of content is multilingual. Room names, taglines, landing-page copy: each is stored as a small object rather than a single string.

type Localized = { en: string; ar: string; ku: string };
Enter fullscreen mode Exit fullscreen mode

Layout direction flips based on locale, and the whole UI mirrors so Arabic and Kurdish read naturally. Getting RTL right across a real dashboard — calendars, tables, forms — is far more work than wrapping things in dir="rtl".

The stack

  • Next.js (App Router, React Server Components) for the admin and the public site
  • Supabase — Auth, Postgres, Storage, and RLS — accessed SSR
  • Tailwind for styling, with a dedicated palette per surface
  • Cloudflare Workers for deployment, so it's fast and cheap to run regionally

What I learned

Building for an underserved local market is its own kind of constraint. There's no off-the-shelf component library tuned for Bahdini RTL, no Stripe support for local payment rails, and the users aren't developers — so the bar for "obvious and calm" UI is high. Those constraints made the product sharper, not weaker.

Try it

If you run a hotel or motel in the Kurdistan Region, it's live and first-party at tourism.krd — 0% commission, trilingual, your software. Feedback from other builders very welcome.

Top comments (0)