{
  "schema_version": 1,
  "generated_at": "2026-10-23T00:00:00.000Z",
  "canonical_url": "https://openlogs.fyi/tools/firefly-iii",
  "slug": "firefly-iii",
  "name": "Firefly III",
  "tagline": "Personal finance manager for tracking income, expenses and budgets.",
  "replaces": {
    "summary": "Paid budgeting services, such as Mint.",
    "products": [
      {
        "slug": "mint",
        "name": "Mint",
        "vendor": "Intuit",
        "url": "https://openlogs.fyi/alternatives/mint"
      }
    ]
  },
  "stack": [
    {
      "kind": "language",
      "name": "PHP"
    },
    {
      "kind": "database",
      "name": "MariaDB"
    }
  ],
  "deployment_methods": [
    "docker_compose"
  ],
  "requirements": {
    "min_ram_mb": null,
    "min_cpu_cores": null,
    "source_url": null
  },
  "license": {
    "spdx": "AGPL-3.0",
    "class": "osi",
    "source_url": "https://github.com/firefly-iii/firefly-iii/blob/b9c31006e8d3008df3d12e23de86b66088c9480e/LICENSE"
  },
  "business_model": {
    "value": "unknown",
    "notes": "The README at the pinned commit does not state a business model, so it stays unknown.",
    "source_url": "https://github.com/firefly-iii/firefly-iii/blob/b9c31006e8d3008df3d12e23de86b66088c9480e/readme.md",
    "checked_at": "2026-10-22"
  },
  "difficulty": {
    "value": "medium",
    "reason": "3 services (1 database or broker: mariadb), 2 volume mounts, 1 env value to set, no elevated host access. Heuristic score 4 of 11: medium."
  },
  "repository": {
    "owner": "firefly-iii",
    "name": "firefly-iii",
    "url": "https://github.com/firefly-iii/firefly-iii"
  },
  "compose_check": {
    "status": "config_ok",
    "validated_at": "2026-10-22",
    "summary": "config_ok on 2026-10-22"
  },
  "recipe": {
    "version": 1,
    "source_path": "docker-compose.yml",
    "source_repo": "firefly-iii/docker",
    "source_commit_sha": "841e328345ce10ca8eaebbda4d3a42c628bc0dc2",
    "source_kind": "packaging_repo",
    "source_url": "https://github.com/firefly-iii/docker/blob/841e328345ce10ca8eaebbda4d3a42c628bc0dc2/docker-compose.yml"
  },
  "install_steps": [
    {
      "order": 1,
      "kind": "prerequisite",
      "language": "text",
      "label": "Docker with the Compose plugin",
      "body": "A host with Docker and the Docker Compose plugin. This entry runs from a compose file.",
      "source_url": "https://github.com/firefly-iii/docs/blob/7c54c4bd43f9dd5297899ceb9584d8bb047788ef/docs/docs/how-to/firefly-iii/installation/docker.md",
      "validation_status": "unvalidated"
    },
    {
      "order": 2,
      "kind": "compose",
      "language": "yaml",
      "label": "Save the compose file as docker-compose.yml",
      "body": "services:\n  app:\n    image: fireflyiii/core:latest\n    hostname: app\n    container_name: firefly_iii_core\n    restart: always\n    volumes:\n      - firefly_iii_upload:/var/www/html/storage/upload\n    env_file: .env\n    networks:\n      - firefly_iii\n    ports:\n      - 80:8080\n    depends_on:\n      - db\n  db:\n    image: mariadb:lts\n    hostname: db\n    container_name: firefly_iii_db\n    restart: always\n    env_file: .db.env\n    networks:\n      - firefly_iii\n    volumes:\n      - firefly_iii_db:/var/lib/mysql\n  cron:\n    #\n    # To make this work, set STATIC_CRON_TOKEN in your .env file or as an environment variable\n    # The STATIC_CRON_TOKEN must be *exactly* 32 characters long\n    # Use this URL for inspiration: https://www.random.org/strings/?num=1&len=32&digits=on&upperalpha=on&loweralpha=on&unique=on&format=html&rnd=new\n    #\n    image: alpine\n    restart: always\n    container_name: firefly_iii_cron\n    env_file: .env\n    command: [\"sh\", \"-c\", \"apk add tzdata && \\\n      (ln -s /usr/share/zoneinfo/$$TZ /etc/localtime || true) && \\\n      echo \\\"0 3 * * * wget -qO- http://app:8080/api/v1/cron/$$STATIC_CRON_TOKEN;echo\\\" \\\n      | crontab - && \\\n      crond -f -L /dev/stdout\"]\n    networks:\n      - firefly_iii\n    depends_on:\n      - app\n\nvolumes:\n   firefly_iii_upload:\n   firefly_iii_db:\n\nnetworks:\n  firefly_iii:\n    driver: bridge\n",
      "source_url": "https://github.com/firefly-iii/docker/blob/841e328345ce10ca8eaebbda4d3a42c628bc0dc2/docker-compose.yml",
      "validation_status": "config_ok"
    },
    {
      "order": 3,
      "kind": "env",
      "language": "dotenv",
      "label": "Save as .env next to the compose file",
      "body": "# You can leave this on \"local\". If you change it to production most console commands will ask for extra confirmation.\n# Never set it to \"testing\".\nAPP_ENV=production\n\n# Set to true if you want to see debug information in error screens.\nAPP_DEBUG=false\n\n# This should be your email address.\n# If you use Docker or similar, you can set this variable from a file by using SITE_OWNER_FILE\n# The variable is used in some errors shown to users who aren't admin.\nSITE_OWNER=mail@example.com\n\n# The encryption key for your sessions. Keep this very secure.\n# Change it to a string of exactly 32 chars or use something like `php artisan key:generate` to generate it.\n# If you use Docker or similar, you can set this variable from a file by using APP_KEY_FILE\n#\n# Try to avoid special characters like #, < and > in your app key. This string does not need full entropy\n# When in doubt, follow the link below and pick one.\n#\n# https://www.random.org/strings/?num=5&len=32&digits=on&upperalpha=on&loweralpha=on&unique=on&format=html&rnd=new\n#\n# If you are a fancy linux nerd like me, use this command:\n#\n# head /dev/urandom | LC_ALL=C tr -dc 'A-Za-z0-9' | head -c 32 && echo\n#\n#\nAPP_KEY=SomeRandomStringOf32CharsExactly\n\n# Firefly III will launch using this language (for new users and unauthenticated visitors)\n# For a list of available languages: https://github.com/firefly-iii/firefly-iii/blob/main/config/firefly.php#L123\n#\n# If text is still in English, remember that not everything may have been translated.\nDEFAULT_LANGUAGE=en_US\n\n# The locale defines how numbers are formatted.\n# by default this value is the same as whatever the language is.\nDEFAULT_LOCALE=equal\n\n# Change this value to your preferred time zone.\n# Example: Europe/Amsterdam\n# For a list of supported time zones, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\nTZ=Europe/Amsterdam\n\n# TRUSTED_PROXIES is a useful variable when using Docker and/or a reverse proxy.\n# Set it to ** and reverse proxies work just fine.\nTRUSTED_PROXIES=\n\n# The log channel defines where your log entries go to.\n# Several other options exist. You can use 'single' for one big fat error log (not recommended).\n# Also available are 'syslog', 'errorlog' and 'stdout' which will log to the system itself.\n# A rotating log option is 'daily', creates 5 files that (surprise) rotate.\n# A cool option is 'papertrail' for cloud logging\n# Default setting 'stack' will log to 'daily' and to 'stdout' at the same time.\nLOG_CHANNEL=stack\n\n# Log level. You can set this from least severe to most severe:\n# debug, info, notice, warning, error, critical, alert, emergency\n# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably\n# nothing will get logged, ever.\nAPP_LOG_LEVEL=notice\n\n# Audit log level.\n# The audit log is used to log notable Firefly III events on a separate channel.\n# These log entries may contain sensitive financial information.\n# The audit log is disabled by default.\n#\n# To enable it, set AUDIT_LOG_LEVEL to \"info\"\n# To disable it, set AUDIT_LOG_LEVEL to \"emergency\"\nAUDIT_LOG_LEVEL=emergency\n\n#\n# If you want, you can redirect the audit logs to another channel.\n# Set 'audit_stdout', 'audit_syslog', 'audit_errorlog' to log to the system itself.\n# Use audit_daily to log to a rotating file.\n# Use audit_papertrail to log to papertrail.\n#\n# If you do this, the audit logs may be mixed with normal logs because the settings for these channels\n# are often the same as the settings for the normal logs.\nAUDIT_LOG_CHANNEL=\n\n#\n# Used when logging to papertrail:\n# Also used when audit logs log to papertrail:\n#\nPAPERTRAIL_HOST=\nPAPERTRAIL_PORT=\n\n# Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III\n# For other database types, please see the FAQ: https://docs.firefly-iii.org/references/faq/install/#i-want-to-use-sqlite\n# If you use Docker or similar, you can set these variables from a file by appending them with _FILE\n# Use \"pgsql\" for PostgreSQL\n# Use \"mysql\" for MySQL and MariaDB.\n# Use \"sqlite\" for SQLite.\nDB_CONNECTION=mysql\nDB_HOST=db\nDB_PORT=3306\nDB_DATABASE=firefly\nDB_USERNAME=firefly\nDB_PASSWORD=secret_firefly_password\n# leave empty or omit when not using a socket connection\nDB_SOCKET=\n\n# MySQL supports SSL. You can configure it here.\n# If you use Docker or similar, you can set these variables from a file by appending them with _FILE\nMYSQL_USE_SSL=false\nMYSQL_SSL_VERIFY_SERVER_CERT=true\n# You need to set at least of these options\nMYSQL_SSL_CAPATH=/etc/ssl/certs/\nMYSQL_SSL_CA=\nMYSQL_SSL_CERT=\nMYSQL_SSL_KEY=\nMYSQL_SSL_CIPHER=\n\n# PostgreSQL supports SSL. You can configure it here.\n# If you use Docker or similar, you can set these variables from a file by appending them with _FILE\nPGSQL_SSL_MODE=prefer\nPGSQL_SSL_ROOT_CERT=null\nPGSQL_SSL_CERT=null\nPGSQL_SSL_KEY=null\nPGSQL_SSL_CRL_FILE=null\n\n# For postgresql 15 and up, setting this to public will no longer work as expected, becasuse the\n# 'public' schema is without grants. This can be worked around by having a super user grant those\n# necessary privileges, but in security conscious setups that's not viable.\n# You will need to set this to the schema you want to use.\nPGSQL_SCHEMA=public\n\n# If you're looking for performance improvements, you could install memcached or redis\nCACHE_STORE=file\nSESSION_DRIVER=file\n\n# If you set either of the options above to 'redis', you might want to update these settings too\n# If you use Docker or similar, you can set REDIS_HOST_FILE, REDIS_PASSWORD_FILE or\n# REDIS_PORT_FILE to set the value from a file instead of from an environment variable\n\n# can be tcp or unix. http is not supported\nREDIS_SCHEME=tcp\n\n# use only when using 'unix' for REDIS_SCHEME. Leave empty otherwise.\nREDIS_PATH=\n\n# use only when using 'tcp' or 'http' for REDIS_SCHEME. Leave empty otherwise.\nREDIS_HOST=127.0.0.1\nREDIS_PORT=6379\n\n# Use only with Redis 6+ with proper ACL set. Leave empty otherwise.\nREDIS_USERNAME=\nREDIS_PASSWORD=\n\n# always use quotes and make sure redis db \"0\" and \"1\" exists. Otherwise change accordingly.\nREDIS_DB=\"0\"\nREDIS_CACHE_DB=\"1\"\n\n# Cookie settings. Should not be necessary to change these.\n# If you use Docker or similar, you can set COOKIE_DOMAIN_FILE to set\n# the value from a file instead of from an environment variable\n# Setting samesite to \"strict\" may give you trouble logging in.\nCOOKIE_PATH=\"/\"\nCOOKIE_DOMAIN=\nCOOKIE_SECURE=false\nCOOKIE_SAMESITE=lax\n\n# If you want Firefly III to email you, update these settings\n# For instructions, see: https://docs.firefly-iii.org/how-to/firefly-iii/advanced/notifications/#email\n# If you use Docker or similar, you can set these variables from a file by appending them with _FILE\nMAIL_MAILER=log\nMAIL_HOST=null\nMAIL_PORT=2525\nMAIL_FROM=changeme@example.com\nMAIL_USERNAME=null\nMAIL_PASSWORD=null\nMAIL_ENCRYPTION=null\nMAIL_SENDMAIL_COMMAND=\n\n#\n# If you use self-signed certificates for your SMTP server, you can use the following settings.\n#\nMAIL_ALLOW_SELF_SIGNED=false\nMAIL_VERIFY_PEER=true\nMAIL_VERIFY_PEER_NAME=true\n\n# Other mail drivers:\n# If you use Docker or similar, you can set these variables from a file by appending them with _FILE\nMAILGUN_DOMAIN=\nMAILGUN_SECRET=\n\n# If you are on EU region in mailgun, use api.eu.mailgun.net, otherwise use api.mailgun.net\n# If you use Docker or similar, you can set this variable from a file by appending it with _FILE\nMAILGUN_ENDPOINT=api.mailgun.net\n\n# If you use Docker or similar, you can set these variables from a file by appending them with _FILE\nMANDRILL_SECRET=\nSPARKPOST_SECRET=\nMAILERSEND_API_KEY=\n\n# Firefly III can send you the following messages.\nSEND_ERROR_MESSAGE=true\n\n# The map will default to this location:\nMAP_DEFAULT_LAT=51.983333\nMAP_DEFAULT_LONG=5.916667\nMAP_DEFAULT_ZOOM=6\n\n#\n# Firefly III authentication settings\n#\n\n#\n# Firefly III supports a few authentication methods:\n# - 'web' (default, uses built in DB)\n# - 'remote_user_guard' for Authelia etc\n# Read more about these settings in the documentation.\n# https://docs.firefly-iii.org/how-to/firefly-iii/advanced/authentication/\n#\n# LDAP is no longer supported :(\n#\nAUTHENTICATION_GUARD=web\n\n#\n# Remote user guard settings\n#\nAUTHENTICATION_GUARD_HEADER=REMOTE_USER\nAUTHENTICATION_GUARD_EMAIL=\n\n#\n# Firefly III generates a basic keypair for your OAuth tokens.\n# If you want, you can overrule the key with your own (secure) value.\n# It's also possible to set PASSPORT_PUBLIC_KEY_FILE or PASSPORT_PRIVATE_KEY_FILE\n# if you're using Docker secrets or similar solutions for secret management\n#\nPASSPORT_PRIVATE_KEY=\nPASSPORT_PUBLIC_KEY=\n\n#\n# Extra authentication settings\n#\nCUSTOM_LOGOUT_URL=\n\n# You can disable the X-Frame-Options header if it interferes with tools like\n# Organizr. This is at your own risk. Applications running in frames run the risk\n# of leaking information to their parent frame.\nDISABLE_FRAME_HEADER=false\n\n# You can disable the Content Security Policy header when you're using an ancient browser\n# or any version of Microsoft Edge / Internet Explorer (which amounts to the same thing really)\n# This leaves you with the risk of not being able to stop XSS bugs should they ever surface.\n# This is at your own risk.\nDISABLE_CSP_HEADER=false\n\n# If you wish to track your own behavior over Firefly III, set valid analytics tracker information here.\n# Nobody uses this except for me on the demo site. But hey, feel free to use this if you want to.\n# Do not prepend the TRACKER_URL with http:// or https://\n# The only tracker supported is Matomo.\n# You can set the following variables from a file by appending them with _FILE:\nTRACKER_SITE_ID=\nTRACKER_URL=\n\n#\n# The static cron job token can be useful when you use Docker and wish to manage cron jobs.\n# 1. Set this token to any 32-character value (this is important!).\n# 2. Use this token in the cron URL instead of a user's command line token that you can find in /profile\n#\n# For more info: https://docs.firefly-iii.org/how-to/firefly-iii/advanced/cron/\n#\n# You can set this variable from a file by appending it with _FILE\n#\nSTATIC_CRON_TOKEN=PLEASE_REPLACE_WITH_32_CHAR_CODE\n\n# You can fine tune the start-up of a Docker container by editing these environment variables.\n# Use this at your own risk. Disabling certain checks and features may result in lots of inconsistent data.\n# However if you know what you're doing you can significantly speed up container start times.\n# Set each value to true to enable, or false to disable.\n\n# Check if the SQLite database exists. Can be skipped if you're not using SQLite.\n# Won't significantly speed up things.\nDKR_CHECK_SQLITE=true\n\n# Leave the following configuration vars as is.\n# Unless you like to tinker and know what you're doing.\nAPP_NAME=FireflyIII\nBROADCAST_DRIVER=log\nQUEUE_DRIVER=sync\nCACHE_PREFIX=firefly\nPUSHER_KEY=\nPUSHER_SECRET=\nPUSHER_ID=\nDEMO_USERNAME=\nDEMO_PASSWORD=\n\n#\n# Please make sure this URL matches the external URL of your Firefly III installation.\n# It is used to validate specific requests and to generate URLs in emails.\n#\nAPP_URL=http://localhost\n",
      "source_url": "https://github.com/firefly-iii/firefly-iii/blob/b9c31006e8d3008df3d12e23de86b66088c9480e/.env.example",
      "validation_status": "unvalidated"
    },
    {
      "order": 4,
      "kind": "env",
      "language": "dotenv",
      "label": "Save as .db.env next to the compose file",
      "body": "MYSQL_RANDOM_ROOT_PASSWORD=yes\nMYSQL_USER=firefly\nMYSQL_PASSWORD=secret_firefly_password\nMYSQL_DATABASE=firefly\n\n#\n# Remove the environment variables above, and replace them with the following if your using PostgreSQL\n#\n# \n# POSTGRES_USER=firefly\n# POSTGRES_DB=firefly\n# POSTGRES_PASSWORD=secret_firefly_password\n# POSTGRES_PASSWORD=secret_firefly_password\n",
      "source_url": "https://github.com/firefly-iii/docker/blob/841e328345ce10ca8eaebbda4d3a42c628bc0dc2/database.env",
      "validation_status": "unvalidated"
    },
    {
      "order": 5,
      "kind": "note",
      "language": "text",
      "label": "What the compose file check ran with",
      "body": "The compose file check ran together with database.env (saved as .db.env) from the same commit and .env.example from firefly-iii/firefly-iii at commit b9c3100 (saved as .env). The folder held only these files. The installation guide tells the reader to download docker-compose.yml, the Firefly III variables file as .env and database.env as .db.env into one folder, set the passwords and run docker compose up -d.",
      "source_url": "https://github.com/firefly-iii/docs/blob/7c54c4bd43f9dd5297899ceb9584d8bb047788ef/docs/docs/how-to/firefly-iii/installation/docker.md",
      "validation_status": "unvalidated"
    },
    {
      "order": 6,
      "kind": "shell",
      "language": "bash",
      "label": "Start it",
      "body": "docker compose up -d",
      "source_url": "https://github.com/firefly-iii/docs/blob/7c54c4bd43f9dd5297899ceb9584d8bb047788ef/docs/docs/how-to/firefly-iii/installation/docker.md",
      "validation_status": "unvalidated"
    },
    {
      "order": 7,
      "kind": "verify",
      "language": "text",
      "label": "Open the app",
      "body": "Open http://localhost:80. The compose file publishes host port 80 for the app service.",
      "source_url": "https://github.com/firefly-iii/docker/blob/841e328345ce10ca8eaebbda4d3a42c628bc0dc2/docker-compose.yml",
      "validation_status": "unvalidated"
    }
  ],
  "notes": [
    {
      "kind": "gotcha",
      "title": "Some images use the latest tag or no tag",
      "body": "Images without a pinned version: app: fireflyiii/core:latest, cron: alpine (no tag). A later pull can get a different version.",
      "source_url": "https://github.com/firefly-iii/docker/blob/841e328345ce10ca8eaebbda4d3a42c628bc0dc2/docker-compose.yml",
      "checked_at": "2026-10-22"
    },
    {
      "kind": "gotcha",
      "title": "The compose file publishes host ports",
      "body": "Host ports: 80 (app). A port without a host address listens on all host network interfaces.",
      "source_url": "https://github.com/firefly-iii/docker/blob/841e328345ce10ca8eaebbda4d3a42c628bc0dc2/docker-compose.yml",
      "checked_at": "2026-10-22"
    },
    {
      "kind": "gotcha",
      "title": "The example env file .env.example has placeholder values",
      "body": "The example env file sets placeholder text for: MAIL_FROM. Replace them before you rely on the install.",
      "source_url": "https://github.com/firefly-iii/firefly-iii/blob/b9c31006e8d3008df3d12e23de86b66088c9480e/.env.example",
      "checked_at": "2026-10-22"
    }
  ],
  "signals": {
    "captured_at": "2026-10-22",
    "stars": 24968,
    "forks": 2347,
    "open_issues": 166,
    "last_push": "2026-10-21",
    "days_since_push": 1,
    "latest_release": "v6.7.9",
    "latest_release_date": "2026-10-11",
    "days_since_release": 11
  },
  "links": {
    "html": "https://openlogs.fyi/tools/firefly-iii",
    "markdown": "https://openlogs.fyi/tools/firefly-iii.md",
    "json": "https://openlogs.fyi/tools/firefly-iii.json"
  },
  "updated_at": "2026-10-22"
}
