> ## Documentation Index
> Fetch the complete documentation index at: https://docs.postiz.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Development Environment

> Set up Postiz for local development

This article guides you for local development on  Postiz. If you're only looking to self-host, docker-compose is the recommended method.
[Docker-Compose](/installation/docker-compose) is the recommended method and now includes the Temporal stack for workflow processing.

<Warning>
  <strong>Important:</strong> Postiz uses Temporal for background workflows. If you are upgrading from v2.11.2 to v2.12.0 or later, follow the migration guide at [/installation/migration](/installation/migration) and use the maintained Docker Compose repository which includes the Temporal stack: [/installation/docker-compose](/installation/docker-compose).
</Warning>

## Tested configurations

* MacOS
* Linux (Fedora 40)

Naturally you can use these instructions to setup a development environment on any platform, but there may not be much experience in the community to help you with any issues you may encounter.

### Warning about Windows

Several users using Windows (and WSL) have reported issues with the setup. This is not well tested as the main developers of the project do not use Windows/WSL for development. If you are using Windows and encounter issues, please do not try to get support, as we aren't able to support you.

<Snippet file="installation-pre-reqs.mdx" />

### Prerequisite Local Services

* **Node.js** - for running the code! (version 18+)
* **PostgreSQL** - or any other SQL database (instructions below suggest Docker)
* **Redis** - for handling worker queues (instructions below suggest Docker)
* **Temporal** - runs as a separate stack (Postgres + Elasticsearch + Temporal services). For local development run the Temporal stack via the `postiz-docker-compose` repository described in [/installation/docker-compose](/installation/docker-compose). Set `TEMPORAL_ADDRESS` in your `.env` to point at the Temporal service (example below).

We have some messages from users who are using Windows, which should work, but they are not tested well yet.

## Installation Instructions

### NodeJS (version 18+)

A complete guide of how to install NodeJS can be found [here](https://nodejs.org/en/download/).

### PostgreSQL (or any other SQL database) & Redis

You can choose **Option A** to **Option B** to install the database.

#### Option A) Postgres and Redis as Single containers

You can install [Docker](https://www.docker.com/products/docker-desktop) and run:

```bash theme={null}
docker run -e POSTGRES_USER=root -e POSTGRES_PASSWORD=your_password --name postgres -p 5432:5432 -d postgres
docker run --name redis -p 6379:6379 -d redis
```

#### Option B) Postgres and Redis as docker-compose

Download the [docker-compose.yaml file here](https://raw.githubusercontent.com/gitroomhq/postiz-app/main/docker-compose.dev.yaml),
or grab it from the repository in the next step.

```bash theme={null}
docker compose -f "docker-compose.dev.yaml" up
```

To run Temporal locally, clone the maintained Docker Compose repository which includes the Temporal stack and follow the instructions in [/installation/docker-compose](/installation/docker-compose). See [/installation/migration](/installation/migration) for migration steps when moving data to the Temporal-enabled setup.

## Build Postiz

<Steps>
  <Step title="Clone the repository">
    ```bash theme={null}
    git clone https://github.com/gitroomhq/postiz-app.git
    ```
  </Step>

  <Step title="Set environment variables">
    Copy the `.env.example` file to `.env` and fill in the values

    ```bash theme={null}
    # Required Settings
    DATABASE_URL="postgresql://postiz-user:postiz-password@localhost:5432/postiz-db-local"
    REDIS_URL="redis://localhost:6379"
    JWT_SECRET="random string for your JWT secret, make it long"
    FRONTEND_URL="http://localhost:4200"
    NEXT_PUBLIC_BACKEND_URL="http://localhost:3000"
    BACKEND_INTERNAL_URL="http://localhost:3000"
    TEMPORAL_ADDRESS="localhost:7233"

    # Optional. Your upload directory path if you host your files locally.
    UPLOAD_DIRECTORY="/opt/postiz/uploads/"

    # Optional: your upload directory slug if you host your files locally.
    NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY=""

    # Your email provider, optional
    EMAIL_PROVIDER="resend|nodemailer"
    RESEND_API_KEY="re_1234567890" # api key if you choose resend
    EMAIL_HOST="smtp.gmail.com" # smtp host if you choose nodemailer
    EMAIL_PORT="465" # smtp port if you choose nodemailer
    EMAIL_SECURE="true" # smtp secure if you choose nodemailer
    EMAIL_USER="user" # smtp user if you choose nodemailer
    EMAIL_PASS="pass" # smtp pass if you choose nodemailer

    ## These are dummy values, you must create your own from Cloudflare.
    ## Remember to set your public internet IP address in the allow-list for the API token.
    CLOUDFLARE_ACCOUNT_ID="QhcMSXQyPuMCRpSQcSYdEuTYgHeCXHbu"
    CLOUDFLARE_ACCESS_KEY="dcfCMSuFEeCNfvByUureMZEfxWJmDqZe"
    CLOUDFLARE_SECRET_ACCESS_KEY="zTTMXBmtyLPwHEdpACGHgDgzRTNpTJewiNriLnUS"
    CLOUDFLARE_BUCKETNAME="postiz"
    CLOUDFLARE_BUCKET_URL="https://QhcMSXQyPuMCRpSQcSYdEuTYgHeCXHbu.r2.cloudflarestorage.com/"
    CLOUDFLARE_REGION="auto"

    # Social Media API Settings
    X_API_KEY="Twitter API key for normal oAuth not oAuth2"
    X_API_SECRET="Twitter API secret for normal oAuth not oAuth2"
    LINKEDIN_CLIENT_ID="Linkedin Client ID"
    LINKEDIN_CLIENT_SECRET="Linkedin Client Secret"
    REDDIT_CLIENT_ID="Reddit Client ID"
    REDDIT_CLIENT_SECRET="Linkedin Client Secret"
    GITHUB_CLIENT_ID="GitHub Client ID"
    GITHUB_CLIENT_SECRET="GitHub Client Secret"

    # AI
    OPENAI_API_KEY="OpenAI API key"

    # Developer Settings
    NX_ADD_PLUGINS=false
    IS_GENERAL="true" # required for now
    ```
  </Step>

  <Step title="Install the dependencies">
    ```bash theme={null}
    pnpm install
    ```
  </Step>

  <Step title="Generate the prisma client and run the migrations">
    ```bash theme={null}
    pnpm run prisma-db-push
    ```
  </Step>

  <Step title="Run the project">
    ```bash theme={null}
    pnpm run dev
    ```
  </Step>
</Steps>

If everything is running successfully, open [http://localhost:4200](http://localhost:4200) in your browser!

If everything is not running - you had errors in the steps above, please head over to our [support](/support) page.

## Next Steps

<CardGroup cols={2}>
  <Card title="Configure uploads" icon="cloud-arrow-up" href="/configuration/r2">
    Set up R2 for file storage
  </Card>

  <Card title="Architecture" icon="diagram-project" href="/howitworks">
    Learn the architecture of the project
  </Card>

  <Card title="Email notifications" icon="envelope" href="/configuration/emails">
    Set up email for notifications
  </Card>

  <Card title="Providers" icon="plug" href="/providers/overview">
    Set up providers such as LinkedIn, X and Reddit
  </Card>
</CardGroup>
