An appointment booking marketplace for Uzbekistan
Bronjoy is an online appointment booking marketplace for service businesses in Uzbekistan: barbershops, hair and nail salons, cosmetology and dental clinics, massage studios, gyms and car services. Customers find a venue on a map, compare services and prices in so'm, and book a time without a phone call. Businesses get a calendar, client list, staff schedules and reviews in one dashboard.
It is our own product, designed, built and operated by our team, from the pipeline that seeded the catalog to the Telegram bots owners use to confirm bookings. bronjoy.com went live on August 27, 2026, and in September 2026 the site listed 23,727 venues across Tashkent, Samarkand, Bukhara and other cities.
Key features
- Map-first search — venues cluster on a map of Uzbekistan, with list and photo-grid views and filters for category, price and rating.
- Venue pages built for search — every venue has its own page under a city and category URL, with services, opening hours, directions and staff profiles.
- Verified online booking — a guest enters a one-time code sent to their phone or email before the appointment exists, so businesses do not get bookings from numbers nobody answers.
- Business dashboard — appointments, calendar, staff schedules, services, clients, waitlist, reviews, referrals and multiple branches, with two-way Google Calendar sync.
- Claim your listing — owners of pre-listed businesses claim their profile with a registration or tax certificate, and an AI check reads each document before a person reviews it.
- Telegram throughout — a customer bot and Mini App for booking, a staff bot for running the business from chat, and a support bot with human escalation.
- An AI assistant for owners — in the dashboard and in Telegram, it books and moves appointments, manages clients, services and schedules, and answers questions about revenue.
- MCP servers — AI assistants such as Claude can search the public catalog and book, and a business can connect its own assistant to its calendar.
- Three languages — Russian, Uzbek and English across both apps and every bot.
Architecture and tech stack
Backend
The backend is an API-only Laravel 12 application on PHP 8.4, served by Laravel Octane on Swoole, with PostgreSQL and PostGIS, Redis, Horizon queues and Meilisearch through Laravel Scout. Routes fall into public, customer and organization groups with separate guards, and organization endpoints run inside a tenant context enforced by a BelongsToTenant trait on every tenant model. Controllers stay thin and business logic lives in services. Payments sit behind a driver interface with Stripe Checkout, Click and Payme implementations. The only server-rendered UI is the Filament admin panel, where our team reviews claims, support threads and AI agent activity.
Frontend
A pnpm monorepo holds two Nuxt 4 apps: the server-rendered customer marketplace and a single-page provider dashboard. Both use a TypeScript API client generated from the backend's OpenAPI spec, which Scramble produces. The spec is committed, so the frontend type-checks and builds in CI without a running backend. The UI uses Tailwind CSS v4, shadcn-vue on reka-ui, Pinia, VeeValidate with Zod, and Leaflet with supercluster for the map.
Infrastructure
Production runs in Docker Compose on a self-managed server behind Cloudflare, with Full (Strict) TLS and Authenticated Origin Pulls. The Octane container is never published to the host; nginx reaches it over an internal Docker network. A deploy fails before migrating if a production secret is missing, and the database is backed up nightly. A trilingual Docus site at docs.bronjoy.com covers the API, integrations and guides for owners.
SEO and localization
The customer app is built as a search surface. City, category and venue pages are server-rendered in Russian, Uzbek and English. A shared SEO composable adds WebSite with SearchAction, breadcrumb and FAQ markup; city and category listings carry ItemList entries of LocalBusiness with addresses, coordinates and ratings; venue pages add review markup. Sitemaps and robots rules come from the Nuxt SEO modules, and venues keep a slug history, so an old URL still resolves to the current page after a rename.
Localization is a product rule: every interface string exists in all three locales, and English leaking onto a Russian or Uzbek page is treated as a bug. Directory vocabulary such as services, amenities, payment methods and landmarks is translated once into a shared dictionary and resolved per request, rather than stored per venue.
Operations
Scheduled jobs send appointment reminders, cancel expired unpaid bookings, expire waitlist offers, sync calendars, deliver Telegram digests and check search health, and heartbeats feed a health endpoint. One production incident is recorded in the scheduler itself: per-minute commands, each forking a PHP process of about 200 MB, overlapped in a 512 MB container and were OOM-killed, and every killed run left a 24-hour overlap lock behind. We moved those commands to five-minute background runs with short lock expiries, so a killed run now costs one missed heartbeat rather than a day of red health checks.
Our role
We own Bronjoy end to end: product design, the Laravel API, both Nuxt apps, the Python data pipeline, the Telegram bots, AI features, documentation, deployment and operations. Backend development started in October 2025, and the frontend monorepo followed in November.
Several parts have their own case studies: the business directory pipeline, the Telegram booking bot and Mini App, the staff bot for business owners, the multilingual help bot, the MCP servers and the AI voice receptionist, which works as a demo but is not yet switched on in production.
Related work
Bronjoy draws on our web app development, Telegram bot development and AI integration and automation services. For another product we build and run ourselves, see BiliMind.



