Skip to the article
Aniq-UI

HollinaRun the booking business locally

Run the booking business locally

Install and start each app with Node.js and Yarn, one terminal per app.

For the Full Stack package

Before you start: install Node.js 22 or newer and run corepack enable once (on Node.js 25 and newer, which leave Corepack out, run npm install -g corepack first). No database server is needed.

View requirements

Open every terminal where the commands below expect it: inside hollina-vacation-rental-full-stack for the full stack, or next to the app's folder for a single-app package.

AppFolderAddress
APIback-endlocalhost:8000Local
Stays websitestorefrontlocalhost:3030Local
Booking dashboardadmin-dashboardlocalhost:3031Local

Start the API first: both frontends read all of their data from it.

Start the API

  1. Install and configure

    .env.example works as it is for local development: SQLite on port 8000, and no payment keys, so the shipped simulator takes every card and PayPal booking.

    Terminal
    corepack enable
    cd back-end
    yarn install
    cp .env.example .env
    Having trouble?
  2. Create the database

    yarn seed checks that every seeded photograph is present, then creates database.sqlite, its tables and the demo company: 32 permissions, the Super Admin and Manager roles, the two accounts, 15 company settings, 18 amenities, 6 destinations, 14 stays (12 published, 2 drafts) with 42 photographs, 6 home page questions, 60 bookings, 8 blocked ranges, 12 inquiries and 24 reviews. Dates are stored as offsets from the day you seed, so there are always arrivals today.

    Terminalin back-end
    yarn seed
  3. Start the server

    Terminalin back-end
    yarn dev

    Expected result: localhost:8000/api/healthLocal answers with "status":"ok" and "database":"up".

    Having trouble?

Start the API

  1. Install and configure

    .env.example works as it is for local development: SQLite on port 8000, and no payment keys, so the shipped simulator takes every card and PayPal booking.

    Terminal
    corepack enable
    cd hollina-backend
    yarn install
    cp .env.example .env
    Having trouble?
  2. Create the database

    yarn seed checks that every seeded photograph is present, then creates database.sqlite, its tables and the demo company: 32 permissions, the Super Admin and Manager roles, the two accounts, 15 company settings, 18 amenities, 6 destinations, 14 stays (12 published, 2 drafts) with 42 photographs, 6 home page questions, 60 bookings, 8 blocked ranges, 12 inquiries and 24 reviews. Dates are stored as offsets from the day you seed, so there are always arrivals today.

    Terminalin hollina-backend
    yarn seed
  3. Start the server

    Terminalin hollina-backend
    yarn dev

    Expected result: localhost:8000/api/healthLocal answers with "status":"ok" and "database":"up".

    Having trouble?

Running the seed again

It puts the demo rows back

yarn seed matches every row it ships by a stable key (a stay's S001, a booking's B0001, a setting's name). Running it again adds nothing twice and never resets a password, but it writes every shipped stay, destination, booking, block, inquiry, review, home page question and company setting back to its shipped values, with the dates moved to the new day, so your company name, contact details and any change to a demo stay are replaced. Stays, bookings and everything else you created yourself are kept. Run it once on a new database, not on one you have made your own.

Start the stays website

In a second terminal:

  1. Install and configure

    The copied .env points the website at the API on port 8000.

    Terminal
    cd storefront
    yarn install
    cp .env.example .env
  2. Start it

    yarn dev first copies the map library's worker into public/maplibre/, then starts the website.

    Terminalin storefront
    yarn dev

    Expected result: localhost:3030Local opens the website in English with the demo stays; Arabic is at /ar.

    Having trouble?

Start the stays website

The API is not part of this package. Start it first; the copied .env expects it at http://localhost:8000/api.

  1. Install and configure

    If your API runs somewhere else, set NEXT_PUBLIC_API_BASE_URL in .env to its address, including /api.

    Terminal
    corepack enable
    cd hollina-website
    yarn install
    cp .env.example .env
    Having trouble?
  2. Start it

    yarn dev first copies the map library's worker into public/maplibre/, then starts the website.

    Terminalin hollina-website
    yarn dev

    Expected result: localhost:3030Local opens the website with the stays from your API; Arabic is at /ar.

    Having trouble?

Start the booking dashboard

In a third terminal:

  1. Install and configure

    The copied .env points the dashboard at the API and its live notifications on port 8000.

    Terminal
    cd admin-dashboard
    yarn install
    cp .env.example .env
  2. Start it and sign in

    Terminalin admin-dashboard
    yarn dev

    Expected result: localhost:3031Local opens the sign-in form. Sign in with admin@hollina.example and the password Admin@123.

    Having trouble?

Start the booking dashboard

The API is not part of this package. Start it first; the copied .env expects it at http://localhost:8000/api.

  1. Install and configure

    If your API runs somewhere else, set NEXT_PUBLIC_API_BASE_URL (with /api) and NEXT_PUBLIC_WEBSOCKET_BASE_URL (without it) in .env to its address.

    Terminal
    corepack enable
    cd hollina-booking-dashboard
    yarn install
    cp .env.example .env
    Having trouble?
  2. Start it and sign in

    Terminalin hollina-booking-dashboard
    yarn dev

    Expected result: localhost:3031Local opens the sign-in form. Sign in with admin@hollina.example and the password Admin@123, which a seeded API accepts.

    Having trouble?

Other ports

Without Docker the ports are fixed in the files. The website's dev and start scripts in package.json pass -p 3030, and the dashboard's pass -p 3031: change the number there to move one, then add the new address to CORS_ORIGIN in the API's .env; for the dashboard set FRONTEND_URL there to it too, and for the website SITE_URL. To move the API, set PORT and PUBLIC_MEDIA_URL in its .env to the same number, and NEXT_PUBLIC_API_BASE_URL in both frontends (the dashboard's NEXT_PUBLIC_WEBSOCKET_BASE_URL too).

Production build

The same folders, built once and then started. First set the API's .env for production: with NODE_ENV=production the API never changes the tables on start, and it refuses to start while JWT_SECRET is empty or still the example value, or while CORS_ORIGIN is empty.

The API's .env
NODE_ENV=production
JWT_SECRET=paste-the-generated-secret-here
CORS_ORIGIN=http://localhost:3030,http://localhost:3031
FRONTEND_URL=http://localhost:3031
SITE_URL=http://localhost:3030
PUBLIC_MEDIA_URL=http://localhost:8000/media

Generate the secret with node -e "console.log(require('crypto').randomBytes(48).toString('hex'))". Then, in the API's folder, build it, create its tables once, and start it. yarn seed:prod adds the demo company and its accounts; yarn db:sync:prod in its place creates empty tables with no accounts.

Terminal
yarn build
yarn seed:prod
yarn start:prod

Production build of the frontends

In each frontend's folder, build once and start. The website serves on 3030 and the dashboard on 3031.

Terminal
yarn build
yarn start

The frontends compile their .env in at build time, so run yarn build again after changing it. Before you deploy anywhere public, read the deployment guide.

Start over with fresh demo data

Stop the API, then delete the database file and seed it again, in the API's folder. This deletes everything you created.

Terminal
rm -f database.sqlite* && yarn seed

In PowerShell:

Terminal
Remove-Item database.sqlite*; yarn seed

Next

Was this helpful?

Checked against the 2026-10-16 release

Stuck on a step?

Find a fix before you start over.

Troubleshooting

Cookie Preferences

We use cookies to enhance your browsing experience, analyze site traffic, and personalize content. By clicking "Accept All", you consent to our use of cookies for analytics and personalized advertising.