# Ghostfolio

Wealth management app that tracks stocks, ETFs and cryptocurrency holdings.

- Replaces: [Mint](https://openlogs.fyi/alternatives/mint)
- Summary: Paid portfolio tracking services, such as Mint.
- Stack: TypeScript (language), PostgreSQL (database), Redis (database)
- Deployment: docker_compose
- License: AGPL-3.0 (osi) [source](https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/LICENSE)
- Business model: unknown. The README at the pinned commit does not state a business model, so it stays unknown. ([source](https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/README.md), read 2026-10-22)
- Difficulty: medium. 3 services (2 database or broker: postgres, redis), 1 volume mount, 1 env value to set, host access: cap_add. Heuristic score 5 of 11: medium. A source checkout is needed, so the rating is at least medium.
- Requirements: not stated
- Repository: [ghostfolio/ghostfolio](https://github.com/ghostfolio/ghostfolio)

## Install

1. Docker with the Compose plugin and git ([source](https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/README.md))

   ```text
   A host with Docker, the Docker Compose plugin and git. This entry needs a checkout of the project repository.
   ```

2. Get the source at commit 0d58df7 ([source](https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/README.md))

   ```bash
   git init ghostfolio
   cd ghostfolio
   git remote add origin https://github.com/ghostfolio/ghostfolio.git
   git sparse-checkout init --cone
   git sparse-checkout set docker
   git fetch --depth 1 --filter=blob:none origin 0d58df7ce77acaddb657216a03782c9fed2d935d
   git checkout FETCH_HEAD
   ```

3. The compose file in the checkout: docker/docker-compose.yml (shown here for reading) ([source](https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/docker/docker-compose.yml))

   ```yaml
   name: ghostfolio
   services:
     ghostfolio:
       image: docker.io/ghostfolio/ghostfolio:latest
       container_name: ghostfolio
       restart: unless-stopped
       init: true
       stop_grace_period: 1m
       cap_drop:
         - ALL
       security_opt:
         - no-new-privileges:true
       env_file:
         - ../.env
       ports:
         - 3333:3333
       depends_on:
         postgres:
           condition: service_healthy
         redis:
           condition: service_healthy
       healthcheck:
         test: ['CMD-SHELL', 'curl -f http://localhost:3333/api/v1/health']
         interval: 10s
         timeout: 5s
         retries: 5
   
     postgres:
       image: docker.io/library/postgres:15-alpine
       container_name: gf-postgres
       restart: unless-stopped
       cap_drop:
         - ALL
       cap_add:
         - CHOWN
         - DAC_READ_SEARCH
         - FOWNER
         - SETGID
         - SETUID
       security_opt:
         - no-new-privileges:true
       env_file:
         - ../.env
       healthcheck:
         test:
           ['CMD-SHELL', 'pg_isready -d "$${POSTGRES_DB}" -U $${POSTGRES_USER}']
         interval: 10s
         timeout: 5s
         retries: 5
       volumes:
         - postgres:/var/lib/postgresql/data
   
     redis:
       image: docker.io/library/redis:alpine
       container_name: gf-redis
       restart: unless-stopped
       user: '999:1000'
       cap_drop:
         - ALL
       security_opt:
         - no-new-privileges:true
       env_file:
         - ../.env
       command:
         - /bin/sh
         - -c
         - redis-server --requirepass "$${REDIS_PASSWORD:?REDIS_PASSWORD variable is not set}"
       healthcheck:
         test:
           ['CMD-SHELL', 'redis-cli --pass "$${REDIS_PASSWORD}" ping | grep PONG']
         interval: 10s
         timeout: 5s
         retries: 5
   
   volumes:
     postgres:
   ```

4. Copy .env.example to .env ([source](https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/README.md))

   ```bash
   cp .env.example .env
   ```

5. What the compose file check ran with ([source](https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/README.md))

   ```text
   The compose file check ran in a checkout of ghostfolio/ghostfolio at 0d58df7ce77acaddb657216a03782c9fed2d935d (a sparse checkout: the top-level files and the folder docker), after .env.example was copied to .env. The README tells the reader to clone the repository, copy .env.example to .env and run docker compose -f docker/docker-compose.yml up -d from the root folder.
   ```

6. Start it ([source](https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/README.md))

   ```bash
   docker compose -f docker/docker-compose.yml up -d
   ```

7. Open the app ([source](https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/docker/docker-compose.yml))

   ```text
   Open http://localhost:3333. The compose file publishes host port 3333 for the ghostfolio service. The README says to open this address and create the first user.
   ```

Compose file check: config_ok on 2026-10-22.

## Gotchas and maintenance

### Gotchas

- Some images use the latest tag or no tag: Images without a pinned version: ghostfolio: docker.io/ghostfolio/ghostfolio:latest. A later pull can get a different version. ([source](https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/docker/docker-compose.yml), checked 2026-10-22)
- The compose file publishes host ports: Host ports: 3333 (ghostfolio). A port without a host address listens on all host network interfaces. ([source](https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/docker/docker-compose.yml), checked 2026-10-22)
- Some services get elevated host access: postgres adds Linux capabilities. ([source](https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/docker/docker-compose.yml), checked 2026-10-22)

### Signals

Computed from a GitHub snapshot taken 2026-10-22.

- Open issues and pull requests: 337
- Stars: 9554, forks: 1386
- Last push: 2026-10-22 (0 days ago)
- Latest release: 3.90.0 on 2026-10-21 (1 days ago)

## Sources

- [Repository: https://github.com/ghostfolio/ghostfolio](https://github.com/ghostfolio/ghostfolio)
- [License: https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/LICENSE](https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/LICENSE)
- [Business model: https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/README.md](https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/README.md)
- [Compose file: https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/docker/docker-compose.yml](https://github.com/ghostfolio/ghostfolio/blob/0d58df7ce77acaddb657216a03782c9fed2d935d/docker/docker-compose.yml)

---
Canonical: https://openlogs.fyi/tools/ghostfolio  
Last updated: 2026-10-22
