Skip to the article
Aniq-UI

KinoraRun Kinora locally

Run Kinora 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 kinora-fitness-full-stack-main-….zip is in your downloads.

  2. Unzip and open the folder

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

    Terminal
    unzip kinora-fitness-full-stack-*.zip
    cd kinora-fitness-full-stack

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

    Having trouble?
  3. Start the apps

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

    Terminalin kinora-fitness-full-stack
    docker compose up --build

    A port is already in use?

    If the start stops with ports are not available ... address already in use, another program uses 3030 or 8000. Either stop it, or create a file named .env in the kinora-fitness-full-stack folder with the port you need, such as DASHBOARD_PORT=3040 (API_PORT for the API). Run docker compose up --build again and open the dashboard on its new port.

    A port is already in use

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

    Having trouble?
  4. Sign in as the coach

    Open localhost:3030Local. The sign-in form is filled in with the Head Coach, headcoach@example.com with the password Coach@123. Arabic is at /ar.

    Expected result: The coach overview opens: the roster, the clients who went quiet, the check-ins waiting for a reply and today's assigned work.

    Having trouble?
  5. Sign in as the member

    Sign out, then open localhost:3030/en/auth/login?as=clientLocal. The form is filled in with the member, member@example.com with the password Member@123.

    Expected result: The member's overview opens, with rings, calories, sleep, heart rate and the week's workouts.

    Having trouble?

Take a tour

What the demo looks like once everything runs.

AccountEmailPasswordWhat it sees
Head Coachheadcoach@example.comCoach@123Every staff screen, with the fullest roster
Membermember@example.comMember@123The training pages, coached by the Head Coach
Personal Trainertrainer@example.comTrainer@123Their own roster of clients and the content catalogues

Eleven more staff accounts exist at @staff.com with the password staff123, as a Coach, Personal Trainer, Gym Manager, Editor or Viewer. More members exist at @example.com with password123. These are local demo accounts only: change the passwords before anything goes public.

The sign-in form fills itself in: /en/auth/login?as=coach (also the default) for the Head Coach and /en/auth/login?as=client for the member.

Stop and start again

Press Ctrl+C in the terminal to stop the apps, or run this from the kinora-fitness-full-stack folder. Your data is kept in the kinora-data volume.

Terminalin kinora-fitness-full-stack
docker compose down

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

Terminalin kinora-fitness-full-stack
docker compose up

Keep your data

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

Run the dashboard

This package is the dashboard on its own. Without an API it runs on built-in sample data in the browser: you can sign in, log a workout, create a member and edit a role, and your changes are kept in the browser. The API is a separate package and is not in this download.

  1. Download your template

    Open My templates and download the Dashboard ZIP.

  2. Unzip and open the folder

    Terminal
    unzip kinora-fitness-dashboard-*.zip
    cd kinora-fitness-dashboard

    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. Leave them out to run on the sample data; to use the template's API, pass its address and its WebSocket address (the same server without /api).

    Terminalin kinora-fitness-dashboard
    docker build -t kinora-dashboard .

    With your own API:

    Terminalin kinora-fitness-dashboard
    docker build -t kinora-dashboard --build-arg NEXT_PUBLIC_API_BASE_URL=http://localhost:8000/api --build-arg NEXT_PUBLIC_WEBSOCKET_BASE_URL=http://localhost:8000 .
    Having trouble?
  4. Start it and sign in

    If port 3030 is taken, change the number on the left of -p, for example -p 3040:3030, and open that port instead.

    Terminalin kinora-fitness-dashboard
    docker run -p 3030:3030 kinora-dashboard

    Expected result: localhost:3030Local opens the sign-in form, filled in with the Head Coach. A "Sample data" notice at the bottom says no API is connected. The password is not checked on the sample data: member@example.com signs in as the member, and an email the sample data does not know signs in as the Head Coach.

    Having trouble?

Run the API

This package is the NestJS API on its own, on a SQLite file kept in a Docker volume. The dashboard is a separate package and is not in this download.

  1. Download your template

    Open My templates and download the Backend ZIP.

  2. Unzip and create the environment file

    .env.example works as it is for a local run. The .env copy is where your own keys go later.

    Terminal
    unzip kinora-fitness-backend-*.zip
    cd kinora-fitness-backend
    cp .env.example .env
    Having trouble?
  3. Build the image

    Terminalin kinora-fitness-backend
    docker build -t kinora-api .
    Having trouble?
  4. Start it with the demo data

    A fresh volume gets empty tables unless you ask for the demo data. The volume keeps the database between runs. If port 8000 is taken, change the number on the left of -p, for example -p 8010:8000, and the API answers on http://localhost:8010/api instead.

    Terminalin kinora-fitness-backend
    docker run -p 8000:8000 -v kinora-data:/data -e SEED_DEMO_DATA=true kinora-api

    Expected result: localhost:8000/api/healthLocal answers {"status":"ok"}.

    Having trouble?

The container reads your .env only when you add --env-file .env to docker run; that is how your storage, AI and MCP keys reach it. 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 allows browser calls from http://localhost:3030. For a dashboard on another address, pass -e CORS_ORIGIN= and -e FRONTEND_URL= with that address.

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.