Skip to the article
Aniq-UI

Food StudioRun the restaurant locally

Run the restaurant locally

Get your package running on your computer, with Docker.

For the Full Stack package

Before you start: install and open Docker Desktop, or Docker Engine with Compose.

View requirements
  1. Download your template

    Open My templates and download the ZIP for your package.

    Expected result: A file named like food-studio-full-stack-main-….zip is in your downloads.

  2. Unzip and open the folder

    Extract the ZIP and open a terminal in the food-studio-full-stack folder. On Windows, extract it in File Explorer, then open a terminal in the folder.

    Terminal
    unzip food-studio-full-stack-*.zip
    cd food-studio-full-stack

    Expected result: The folder lists admin-dashboard, back-end, storefront and docker-compose.yml.

    Having trouble?
  3. Start the apps

    Build and start the API, the ordering website and the staff dashboard. Nothing has to be configured first. The first start builds three images and fills the database with the demo restaurant, which takes a few minutes; later starts take seconds.

    Terminalin food-studio-full-stack
    docker compose up --build

    A port is already in use?

    If the start stops with address already in use or port is already allocated, another program uses 3030, 3031 or 8000. Either stop it, or create a file named .env in the food-studio-full-stack folder, beside docker-compose.yml, with the port you need, such as ADMIN_PORT=3041 (SITE_PORT for the website, API_PORT for the API). Run docker compose up --build again and open the app on its new port.

    A port is already in use

    Expected result: The three services keep running and the log stops scrolling. Leave this terminal open.

    Having trouble?
  4. Open the ordering website

    Open localhost:3030Local. To sign in as the demo customer, use sam@foodstudio.example with the password FoodDemo2026!. Arabic is at /ar.

    Expected result: The website opens on its home page with the demo menu and its pictures.

    Having trouble?
  5. Sign in to the staff dashboard

    Open localhost:3031Local. Sign in with owner@foodstudio.example and the password FoodDemo2026!. For the manager or the kitchen, type manager@foodstudio.example or kitchen@foodstudio.example with the same password. Change these passwords before the restaurant is reachable from the internet.

    Expected result: The dashboard opens on its overview, with today's orders and the kitchen's queue.

    Having trouble?

Take a tour

What the demo restaurant looks like once everything runs.

AccountSigns in atEmailPassword
Owner: everything, including team and rolesStaff dashboardowner@foodstudio.exampleFoodDemo2026!
Manager: everything except team and rolesStaff dashboardmanager@foodstudio.exampleFoodDemo2026!
Kitchen: the Central kitchen's orders, with no pricesStaff dashboardkitchen@foodstudio.exampleFoodDemo2026!
Customer, with reward points from past ordersOrdering websitesam@foodstudio.exampleFoodDemo2026!

The seed also adds two more managers (rami.manager@foodstudio.example and nina.manager@foodstudio.example) and a kitchen account for each of the other three kitchens (riverside.kitchen@, uptown.kitchen@ and harbor.kitchen@, all at foodstudio.example), with the same password. These are local demo accounts only.

Stop and start again

Press Ctrl+C in the terminal to stop the apps, or run this from the food-studio-full-stack folder. Your data, the database and the uploads, is kept in the food-studio-data volume.

Terminalin food-studio-full-stack
docker compose down

Start again with the same command as step 3. Without --build it reuses the images you already built.

Terminalin food-studio-full-stack
docker compose up

Keep your data

docker compose down -v also deletes the data volume. The next start seeds a fresh copy of the demo restaurant, and everything you created is gone.

Run the ordering website

This package is the ordering website on its own. It reads everything from the template's API, so start the API first. Unless you build it with another address, the website expects the API at http://localhost:8000. The API is a separate package and is not in this download.

  1. Download your template

    Open My templates and download the Ordering Website ZIP.

  2. Unzip and open the folder

    Terminal
    unzip food-studio-website-*.zip
    cd food-studio-website

    Expected result: The folder has a Dockerfile and a package.json.

    Having trouble?
  3. Build the image

    The NEXT_PUBLIC_* values are compiled into the JavaScript the browser loads, so they are build arguments. Without any, the website uses the API at http://localhost:8000/api. For an API somewhere else, pass its address.

    Terminalin food-studio-website
    docker build -t foodstudio-site .

    With your own API:

    Terminalin food-studio-website
    docker build -t foodstudio-site --build-arg NEXT_PUBLIC_API_BASE_URL=https://api.your-domain.com/api --build-arg NEXT_PUBLIC_MEDIA_HOSTNAME=media.your-domain.com .
    Having trouble?
  4. Start it

    If port 3030 is taken, change the number on the left of -p, for example -p 3041:3030, open that port instead, and add the new address to the API's CORS_ORIGIN.

    Terminalin food-studio-website
    docker run -p 3030:3030 foodstudio-site

    Expected result: localhost:3030Local opens the website with the menu from your API. English is at /en, Arabic at /ar.

    Having trouble?

Run the staff dashboard

This package is the staff dashboard on its own. Every screen reads the template's API, so start the API first. Unless you build it with another address, the dashboard expects the API at http://localhost:8000. The API is a separate package and is not in this download.

  1. Download your template

    Open My templates and download the Staff Dashboard ZIP.

  2. Unzip and open the folder

    Terminal
    unzip food-studio-staff-dashboard-*.zip
    cd food-studio-staff-dashboard

    Expected result: The folder has a Dockerfile and a package.json.

    Having trouble?
  3. Build the image

    Without build arguments the dashboard uses the API at http://localhost:8000/api. For an API somewhere else, pass its address, its address without /api for the live notifications, and the website's address for the "View storefront" link.

    Terminalin food-studio-staff-dashboard
    docker build -t foodstudio-admin .

    With your own API:

    Terminalin food-studio-staff-dashboard
    docker build -t foodstudio-admin --build-arg NEXT_PUBLIC_API_BASE_URL=https://api.your-domain.com/api --build-arg NEXT_PUBLIC_WEBSOCKET_BASE_URL=https://api.your-domain.com --build-arg NEXT_PUBLIC_STOREFRONT_URL=https://your-domain.com .
    Having trouble?
  4. Start it and sign in

    If port 3031 is taken, change the number on the left of -p, for example -p 3041:3031, open that port instead, and add the new address to the API's CORS_ORIGIN.

    Terminalin food-studio-staff-dashboard
    docker run -p 3031:3031 foodstudio-admin

    Expected result: localhost:3031Local opens the sign-in form. Sign in with the owner account owner@foodstudio.example and the password FoodDemo2026!, which a seeded API accepts.

    Having trouble?

Run the API

This package is the NestJS API on its own, on a SQLite file kept in a Docker volume with the uploads. The ordering website and the staff dashboard are separate packages and are not in this download.

  1. Download your template

    Open My templates and download the Backend API ZIP.

  2. Unzip and open the folder

    Terminal
    unzip food-studio-backend-*.zip
    cd food-studio-backend

    Expected result: The folder has a Dockerfile, a package.json and a .env.example.

    Having trouble?
  3. Build the image

    Terminalin food-studio-backend
    docker build -t foodstudio-api .
    Having trouble?
  4. Start it with the demo restaurant

    A new volume gets empty tables and no accounts unless you ask for the demo restaurant, so keep -e SEED_DEMO_DATA=true for a first start. The volume keeps the database and the uploads between runs. If port 8000 is taken, change the number on the left of -p, for example -p 8010:8000, and add -e PUBLIC_MEDIA_URL=http://localhost:8010/media so the picture addresses use it too. Your frontends must then point at http://localhost:8010/api.

    Terminalin food-studio-backend
    docker run -p 8000:8000 -v foodstudio-data:/data -e SEED_DEMO_DATA=true foodstudio-api

    Expected result: localhost:8000/api/healthLocal answers {"success":true,"data":{"status":"ok","database":"up"},"message":""}.

    Having trouble?

The container accepts the website on http://localhost:3030 and the dashboard on http://localhost:3031. On other addresses, set CORS_ORIGIN, FRONTEND_URL and STOREFRONT_URL with -e.

To give the container your own keys (payments, mail, R2, AI), create .env from .env.example with cp .env.example .env, fill it in, and add --env-file .env to docker run. Without a JWT_SECRET of your own, or with the example one, the container generates a secret and keeps it in the volume.

The image leaves out the background-removal model unless you ask for it. To include it, build with:

Terminalin food-studio-backend
docker build --build-arg FETCH_BG_MODEL=true -t foodstudio-api .

Next

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.