---
title: 'Quickstart'
sidebar_position: 2
---

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

This guide will get you up and running with multi-scrobbler using [Docker](https://www.docker.com/) and [`docker compose`](https://docs.docker.com/compose/). At the end of the guide you will have:

* the dashboard served on port `9078` of a host machine which has an IP of `192.168.0.100`
* data saved to the same directory as the `docker-compose.yml` file
* multi-scrobbler monitoring [Spotify](/configuration/sources/spotify) and/or [Jellyfin](/configuration/sources/jellyfin) for listening activity
* multi-scrobbler scrobbling to [Lastfm](/configuration/clients/lastfm) and/or [Maloja](/configuration/clients/maloja)

:::note

If the multi-scrobbler container is on the same machine you will be viewing the dashboard from (IE `localhost`) you can remove and ignore `BASE_URL` usage below. Additionally, replace usage of `192.168.0.100` with `localhost`.

:::

## Create Docker Compose File

Create a new folder for multi-scrobbler related data and then create `docker-compose.yml` with this content:

```yaml title="~/msData/docker-compose.yml"
services:
  multi-scrobbler:
    image: foxxmd/multi-scrobbler
    container_name: multi-scrobbler
    environment:
      - TZ=Etc/GMT # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
      - BASE_URL=http://192.168.0.100:9078
      # all Environmental Variables in below examples go here!

    volumes:
      - "./config:/config"
    ports:
      - "9078:9078"
    restart: unless-stopped
```

## Setup Sources

[**Sources**](/configuration/sources) are the services/music players multi-scrobbler monitors to look for listening activity.

<Tabs>
    <TabItem value="jellyfin" label="Jellyfin">
        Follow the Jellyfin configuration [instructions for setting up an **API Key**.](/configuration/sources/jellyfin)

        Then, add these values to the `environment` section in the [`docker-compose.yml` you created.](#create-docker-compose-file)

        ```yaml title="~/msData/docker-compose.yml"
        - JELLYFIN_URL=192.168.0.110:8096 # URL to Jellyfin UI
        - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b # Api Key created in previous step
        - JELLYFIN_USER=MyUser # Your username in Jellyfin
        ```
    </TabItem>
    <TabItem value="spotify" label="Spotify">
        To access your Spotify activity you must [create a Spotify App](https://developer.spotify.com/dashboard) to get a
        **Client ID/Secret** and set a valid **Redirect URI**.
        
        Refer to the [Spotify Authentication instructions in the docs.](/configuration/sources/spotify#authenticate-spotify-with-multi-scrobbler)

        Assuming you used the **HTTPS** method for your **Redirect URI** from the instructions above...after the application is created add these values to the `environment` section in the [`docker-compose.yml` you created.](#create-docker-compose-file)

        ```yaml title="~/msData/docker-compose.yml"
        - SPOTIFY_CLIENT_ID=yourClientId
        - SPOTIFY_CLIENT_SECRET=yourClientSecret
        - SPOTIFY_REDIRECT_URI=https://multi-scrobbler.mydomain.com/callback
        ```

        Later, after [starting multi-scrobbler](#start-multi-scrobbler), visit the dashboard at `http://192.168.0.100:9078` and click **(Re)authenticate** on the Spotify card to authorize multi-scrobbler to use your account. Monitoring will begin automatically after authorization is complete.
    </TabItem>
</Tabs>

## Setup Clients

[**Clients**](/configuration/clients) are services that store scrobbles. Multi-scrobbler will scrobble all listening activity from the **Sources** you configured to all **Clients** you configure here.

<Tabs>
    <TabItem value="maloja" label="Maloja">
        Setup a [Maloja server](https://github.com/krateng/maloja?tab=readme-ov-file#how-to-install) if you have not already done this.

        <details>

            <summary>Maloja Setup Intructions</summary>

            Using Maloja's example `docker-compose.yml`:

            ```yaml reference title="~/malojaData/docker-compose.yml"
            https://github.com/krateng/maloja/blob/master/example-compose.yml
            ```

            Uncomment `environment` and add `MALOJA_FORCE_PASSWORD=CHANGE_ME` to set an admin password

            Start the container:

            ```shell title="~/malojaData"
            docker compose up -d
            ```
        </details>

        * Navigate to the Admin Panel (Cog in upper-right corner) -> API Keys (or at http://192.168.0.100:42010/admin_apikeys)
          * Create a **New Key** and then copy the generated key value

        Finally, add these values to the `environment` section in the [`docker-compose.yml` you created for multi-scrobbler earlier.](#create-docker-compose-file)

        ```yaml title="~/msData/docker-compose.yml"
        - MALOJA_URL=http://192.168.0.100:42010
        - MALOJA_API_KEY=myApiKey
        ```
    </TabItem>
    <TabItem value="lastfm" label="Last.fm">
        [Register for an API account at Last.fm.](https://www.last.fm/api/account/create)

        Use the following for **Callback URL**:

        ```
        http://192.168.0.100:9078/lastfm/callback
        ```

        After account creation use the displayed information and add these values to the `environment` section in the [`docker-compose.yml` you created for multi-scrobbler earlier.](#create-docker-compose-file)

        ```yaml title="~/msData/docker-compose.yml"
        - LASTFM_API_KEY=myApiKey
        - LASTFM_SECRET=myApiSecret
        ```
    </TabItem>
    <TabItem value="koito" label="Koito">
        Setup a [Koito server](https://koito.io/guides/installation/) if you have not already done this.

        * [Create (or get) an API Key](https://koito.io/guides/scrobbler/)
          * From your Koito server dashboard navigate to **Settings** (bottom-left icon) => **API Keys**
          * Create a new Key (or use an existing) and Copy the key using the copy icon to the right of the key
            * EX `pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL`
        * Take note of your Koito username (used below as `myUser`)
        * Determine your Koito URL
          * This is the URL you use to access your Koito dashboard OR whatever URL is accessible from your multi-scrobbler instance.
          * EX dashboard at `http://192.168.0.100:4110` => replace `myURL` below with `http://192.168.0.100:4110`
          * [More info on the URL to use is the full docs](/configuration/clients/koito)

        Add/Substitute values above into these examples values and add them to the `environment` section in the [`docker-compose.yml` you created for multi-scrobbler earlier.](#create-docker-compose-file)

        ```yaml title="~/msData/docker-compose.yml"
        - KOTIO_TOKEN=myToken
        - KOTIO_USER=myUser
        - KOITO_URL=myURL
        ```

        :::tip

        Ensure that Koito is configured to allow requests from multi-scrobbler! In Koito config set [`KOITO_ALLOWED_HOSTS`](https://koito.io/reference/configuration/#koito_allowed_hosts) to the IP the multi-scrobbler dashboard is accessible from.

        :::

    </TabItem>
</Tabs>

## Start Multi-Scrobbler

:::tip

If you are running your multi-scrobbler container on a Linux host see [these instructions for setting proper file permissions.](/installation#linux-host)

:::

From the same directory as the [`docker-compose.yml` you created earlier](#create-docker-compose-file) start the container:

```shell title="~/msData"
docker compose up -d
```

You're done! Multi-scrobbler is now running. It will monitor the sources you configured and scrobble to clients you set up.

Visit `http://192.168.0.100:9078` to see the dashboard where

* configured Sources/Clients
  * show current status and authentication options
  * display statistics about discovered/scrobbled tracks and Now Playing status
* a real-time log shows multi-scrobbler's activity

## Next Steps

* See more advanced docker options as well as other install methods in the [**Installation**](/installation#docker) docs
* Review the [**Configuration**](/configuration) docs
  * Learn about how to configure multi-scrobbler using files for more complicated Source/Client scenarios
  * See all available [**Sources**](/configuration/sources) and [**Clients**](/configuration/clients) alongside configuration examples
  * Learn how to set up [notification webhooks](/configuration#webhook-configurations)
  * Check out the [kitchensink example](/configuration/kitchensink)
* Consult the [**FAQ**](/FAQ) for solutions to common problems
