Full Code of allinurl/goaccess for AI

master 03618c2c3814 cached
135 files
3.1 MB
810.0k tokens
1324 symbols
1 requests
Download .txt
Showing preview only (3,238K chars total). Download the full file or copy to clipboard to get everything.
Repository: allinurl/goaccess
Branch: master
Commit: 03618c2c3814
Files: 135
Total size: 3.1 MB

Directory structure:
gitextract_ui100px0/

├── .codespellrc
├── .github/
│   ├── FUNDING.yml
│   └── workflows/
│       ├── build-test.yml
│       ├── deb-packaging-buildx.yml
│       ├── deb-packaging.yml
│       ├── docker-publish.yml
│       └── spelling.yml
├── .gitignore
├── AUTHORS
├── COPYING
├── ChangeLog
├── DOCKER.md
├── Dockerfile
├── Dockerfile.debian-12
├── Makefile.am
├── NEWS
├── README.md
├── SECURITY.md
├── TODO
├── build-dynamic.sh
├── config/
│   ├── browsers.list
│   ├── goaccess.conf
│   └── podcast.list
├── configure.ac
├── docker-compose/
│   ├── README.md
│   ├── configs/
│   │   ├── goaccess.traefik.conf
│   │   ├── goaccess.vanilla.conf
│   │   └── nginx.conf
│   ├── docker-compose.traefik.yaml
│   └── docker-compose.vanilla.yaml
├── goaccess.1
├── inlang.config.js
├── po/
│   ├── LINGUAS
│   ├── Makevars
│   ├── POTFILES.in
│   ├── de.po
│   ├── es.po
│   ├── fr.po
│   ├── goaccess.pot
│   ├── it.po
│   ├── ja.po
│   ├── ka.po
│   ├── ko.po
│   ├── pt_BR.po
│   ├── ru.po
│   ├── sv.po
│   ├── uk.po
│   └── zh_CN.po
├── resources/
│   ├── cities-10m.json
│   ├── countries-110m.json
│   ├── css/
│   │   └── app.css
│   ├── js/
│   │   ├── app.js
│   │   └── charts.js
│   └── tpls.html
├── snap/
│   └── snapcraft.yaml
└── src/
    ├── base64.c
    ├── base64.h
    ├── bin2c.c
    ├── bitmap.c
    ├── bitmap.h
    ├── browsers.c
    ├── browsers.h
    ├── color.c
    ├── color.h
    ├── commons.c
    ├── commons.h
    ├── csv.c
    ├── csv.h
    ├── dialogs.c
    ├── dialogs.h
    ├── error.c
    ├── error.h
    ├── fileio.c
    ├── fileio.h
    ├── gchart.c
    ├── gchart.h
    ├── gdashboard.c
    ├── gdashboard.h
    ├── gdns.c
    ├── gdns.h
    ├── geoip1.c
    ├── geoip1.h
    ├── geoip2.c
    ├── gholder.c
    ├── gholder.h
    ├── gkhash.c
    ├── gkhash.h
    ├── gkmhash.c
    ├── gkmhash.h
    ├── gmenu.c
    ├── gmenu.h
    ├── goaccess.c
    ├── goaccess.h
    ├── gslist.c
    ├── gslist.h
    ├── gstorage.c
    ├── gstorage.h
    ├── gwsocket.c
    ├── gwsocket.h
    ├── json.c
    ├── json.h
    ├── khash.h
    ├── labels.h
    ├── opesys.c
    ├── opesys.h
    ├── options.c
    ├── options.h
    ├── output.c
    ├── output.h
    ├── parser.c
    ├── parser.h
    ├── pdjson.c
    ├── pdjson.h
    ├── persistence.c
    ├── persistence.h
    ├── settings.c
    ├── settings.h
    ├── sha1.c
    ├── sha1.h
    ├── sort.c
    ├── sort.h
    ├── tpl.c
    ├── tpl.h
    ├── ui.c
    ├── ui.h
    ├── util.c
    ├── util.h
    ├── websocket.c
    ├── websocket.h
    ├── win/
    │   ├── mman.h
    │   └── mmap.c
    ├── wsauth.c
    ├── wsauth.h
    ├── xmalloc.c
    └── xmalloc.h

================================================
FILE CONTENTS
================================================

================================================
FILE: .codespellrc
================================================
[codespell]
skip=./.git,./po,./resources/js/*.min.js,./resources/css/*.min.css
check-hidden=
check-filenames=
builtin=clear,rare,informal,usage,code,names
ignore-words-list=master,thead,referer,cros,hastable,musl,stdio


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: allinurl
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']


================================================
FILE: .github/workflows/build-test.yml
================================================
name: C build and Test

on:
  push:
    branches:
      - "master"
  pull_request:
    branches:
      - "master"

jobs:
  build:
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-latest
          - macos-latest
          - macos-14
        config_params:
          - ""
          - "--enable-debug"
          - "--with-getline --enable-asan"
          - "--enable-utf8 --enable-debug --with-getline"
          - "--enable-utf8 --with-getline --enable-asan"
        include:
          - os: ubuntu-latest
            setup-env: |
              sudo apt-get update
              sudo apt-get install -y build-essential autoconf gettext autopoint libncursesw5-dev libssl-dev git libmaxminddb-dev jq
          - os: macos-latest
            setup-env: |
              brew install ncurses gettext autoconf automake libmaxminddb openssl@3 jq
          - os: macos-14
            setup-env: |
              brew update
              brew install ncurses gettext autoconf automake openssl@3 libmaxminddb jq

    runs-on: ${{ matrix.os }}
    steps:
      - name: Setup env.
        run: ${{ matrix.setup-env }}

      - uses: actions/checkout@v3

      - name: Check Architecture
        run: |
          echo "Running on $(uname -m) architecture"

      - name: autoreconf
        run: autoreconf -fiv

      - name: Configure
        run: ./configure ${{ matrix.config_params }}

      - name: Make
        run: sudo make

      - name: Make Check
        run: sudo make check

      - name: Make Distcheck
        run: sudo make distcheck

      - name: Define log
        run: |
          echo -e 'localhost:80 192.168.0.1 - - [01/Jul/2013:06:20:38 -0500] "GET / HTTP/1.1" 200 3829 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0"\
          google.com:80 ::1 - - [01/Jul/2013:06:25:11 -0500] "OPTIONS * HTTP/1.0" 200 136 "-" "Apache (internal dummy connection)"\
          bing.com:80 142.250.190.142 - - [01/Jul/2013:06:41:31 -0500] "-" 408 0 "-" "-"\
          yahoo.com:80 74.6.143.25 - - [01/Jul/2013:07:20:02 -0500] "HEAD / HTTP/1.1" 200 213 "-" "Wget/1.14 (linux-gnu)"' > access.log
          cat access.log

      - name: Set up output directory
        run: echo "output_dir=${GITHUB_WORKSPACE}/report" >> $GITHUB_ENV

      - name: Create output directory
        run: mkdir -p ${GITHUB_WORKSPACE}/report

      - name: Run goaccess single thread
        run: ./goaccess access.log --log-format=VCOMBINED -o ${output_dir}/report.html

      - name: Run goaccess multi-thread
        run: ./goaccess access.log --log-format='%v:%^ %h %^[%x] "%r" %s %b "%R" "%u"' --datetime-format='%d/%b/%Y:%H:%M:%S %z' -o ${output_dir}/report.html -j 2 -a --tz="Europe/Berlin"

      - name: Run goaccess multi-thread JSON output
        run: |
          ./goaccess access.log --log-format=VCOMBINED -o ${output_dir}/report.json -j 2 -a --json-pretty-print
          cat ${output_dir}/report.json | jq .

      - name: Make distclean
        run: sudo make distclean


================================================
FILE: .github/workflows/deb-packaging-buildx.yml
================================================
name: .deb packaging buildx

on:
  workflow_dispatch:

jobs:
  build_job:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        include:
          - arch: arm32v7
            distro: ubuntu22.04
          - arch: arm32v7
            distro: ubuntu24.04
          - arch: arm32v7
            distro: ubuntu25.10
          - arch: arm32v7
            distro: bullseye
          - arch: arm32v7
            distro: bookworm
          - arch: arm32v7
            distro: trixie
          - arch: aarch64
            distro: ubuntu22.04
          - arch: aarch64
            distro: ubuntu24.04
          - arch: aarch64
            distro: ubuntu25.10
          - arch: aarch64
            distro: bullseye
          - arch: aarch64
            distro: bookworm
          - arch: aarch64
            distro: trixie
          - arch: amd64
            distro: bullseye
          - arch: amd64
            distro: bookworm
          - arch: amd64
            distro: trixie
          - arch: i386
            distro: bullseye
          - arch: i386
            distro: bookworm
          - arch: amd64
            distro: ubuntu22.04
          - arch: amd64
            distro: ubuntu24.04
          - arch: amd64
            distro: ubuntu25.10

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Setup Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Setup QEMU
        uses: docker/setup-qemu-action@v2

      - name: Create artifacts directory
        run: mkdir -p "${GITHUB_WORKSPACE}/artifacts"

      - name: Build deb package
        run: |
          echo "Matrix arch: ${{ matrix.arch }}"
          echo "Matrix distro: ${{ matrix.distro }}"
          
          # Convert the matrix distro into a shell variable.
          MY_DISTRO="${{ matrix.distro }}"
          if [[ "$MY_DISTRO" == ubuntu* ]]; then
            # Remove the 'ubuntu' prefix to get the version tag.
            VERSION_TAG="${MY_DISTRO#ubuntu}"
            DEFAULT_IMAGE="ubuntu:${VERSION_TAG}"
          else
            DEFAULT_IMAGE="debian:${MY_DISTRO}"
          fi
          echo "Default IMAGE: ${DEFAULT_IMAGE}"
          
          # Determine the base image and platform based on the target architecture.
          case "${{ matrix.arch }}" in
            arm32v7)
              if [[ "$MY_DISTRO" == ubuntu* ]]; then
                BASE_IMAGE="arm32v7/ubuntu:${VERSION_TAG}"
              else
                BASE_IMAGE="arm32v7/debian:${MY_DISTRO}"
              fi
              PLATFORM="linux/arm/v7"
              ;;
            aarch64)
              if [[ "$MY_DISTRO" == ubuntu* ]]; then
                BASE_IMAGE="arm64v8/ubuntu:${VERSION_TAG}"
              else
                BASE_IMAGE="arm64v8/debian:${MY_DISTRO}"
              fi
              PLATFORM="linux/arm64"
              ;;
            i386)
              if [[ "$MY_DISTRO" == ubuntu* ]]; then
                BASE_IMAGE="i386/ubuntu:${VERSION_TAG}"
              else
                BASE_IMAGE="i386/debian:${MY_DISTRO}"
              fi
              PLATFORM="linux/386"
              ;;
            amd64)
              BASE_IMAGE="$DEFAULT_IMAGE"
              PLATFORM="linux/amd64"
              ;;
            *)
              echo "Unsupported architecture: ${{ matrix.arch }}"
              exit 1
              ;;
          esac
          echo "Using base image: ${BASE_IMAGE}"
          echo "Using platform: ${PLATFORM}"
          
          docker run --rm --platform "${PLATFORM}" \
            -v "${GITHUB_WORKSPACE}/artifacts:/artifacts" \
            "${BASE_IMAGE}" bash -c "\
              apt-get update && \
              apt-get install -y ca-certificates wget curl lsb-release && \
              cd /artifacts && \
              curl -O https://deb.goaccess.io/provision/provision.dpkg.sh && \
              chmod +x provision.dpkg.sh && \
              ./provision.dpkg.sh && \
              ls -lath && \
              echo 'Build Success'"
      
      - name: Test deb package installation
        run: |
          DEB_FILE=$(find "${GITHUB_WORKSPACE}/artifacts" -name "goaccess_*.deb")
          echo "Found deb package: $DEB_FILE"
          
          case "${{ matrix.distro }}" in
            bullseye) TEST_IMAGE="debian:bullseye" ;;
            bookworm) TEST_IMAGE="debian:bookworm" ;;
            trixie) TEST_IMAGE="debian:trixie" ;;
            ubuntu22.04) TEST_IMAGE="ubuntu:22.04" ;;
            ubuntu24.04) TEST_IMAGE="ubuntu:24.04" ;;
            ubuntu25.10) TEST_IMAGE="ubuntu:25.10" ;;
            *) echo "Unknown distro: ${{ matrix.distro }}" && exit 1 ;;
          esac
          echo "Using Docker image for testing: $TEST_IMAGE"
          
          case "${{ matrix.arch }}" in
            arm32v7) TEST_PLATFORM="linux/arm/v7" ;;
            aarch64) TEST_PLATFORM="linux/arm64" ;;
            i386) TEST_PLATFORM="linux/386" ;;
            amd64) TEST_PLATFORM="linux/amd64" ;;
            *) echo "Unsupported architecture: ${{ matrix.arch }}" && exit 1 ;;
          esac
          echo "Using platform for testing: $TEST_PLATFORM"
          
          docker run --rm --platform "$TEST_PLATFORM" \
            -v "${GITHUB_WORKSPACE}/artifacts:/artifacts" \
            "$TEST_IMAGE" bash -c "\
              apt-get update && \
              apt-get install -y /artifacts/$(basename $DEB_FILE) && \
              goaccess --version && \
              apt-get remove -y goaccess"
      
      - name: Upload deb package
        uses: actions/upload-artifact@v4
        with:
          name: deb-package-${{ matrix.distro }}-${{ matrix.arch }}
          path: artifacts/*.deb
          retention-days: 1


================================================
FILE: .github/workflows/deb-packaging.yml
================================================
name: .deb packaging

on:
  workflow_dispatch:

jobs:
  build_job:
    # The host should always be linux
    runs-on: ubuntu-latest
    name: Build on ${{ matrix.distro }} ${{ matrix.arch }}

    # Run steps on a matrix of arch/distro combinations
    strategy:
      matrix:
        include:
          - arch: arm32v7
            distro: ubuntu16.04
          - arch: arm32v7
            distro: ubuntu18.04
          - arch: arm32v7
            distro: ubuntu22.04
          - arch: arm32v7
            distro: ubuntu24.04
          - arch: arm32v7
            distro: ubuntu24.10            
          - arch: arm32v7
            distro: bullseye
          - arch: arm32v7
            distro: bookworm      
          - arch: aarch64
            distro: ubuntu18.04
          - arch: aarch64
            distro: ubuntu20.04
          - arch: aarch64
            distro: ubuntu22.04            
          - arch: aarch64
            distro: ubuntu24.04
          - arch: aarch64
            distro: ubuntu24.10            
          - arch: aarch64
            distro: buster
          - arch: aarch64
            distro: bullseye
          - arch: aarch64
            distro: bookworm
          - arch: amd64
            distro: buster
          - arch: i386
            distro: buster
          - arch: amd64
            distro: bullseye
          - arch: amd64
            distro: bookworm
          - arch: i386
            distro: bullseye
          - arch: i386
            distro: bookworm
          - arch: amd64
            distro: ubuntu16.04
          - arch: i386
            distro: ubuntu16.04
          - arch: amd64
            distro: ubuntu18.04
          - arch: i386
            distro: ubuntu18.04
          - arch: amd64
            distro: ubuntu20.04
          - arch: amd64
            distro: ubuntu22.04
          - arch: amd64
            distro: ubuntu24.04
          - arch: amd64
            distro: ubuntu24.10            

    steps:
      - uses: actions/checkout@v2.1.0

      - uses: allinurl/run-on-arch-action@master
        name: Build artifact
        id: build
        with:
          arch: ${{ matrix.arch }}
          distro: ${{ matrix.distro }}
          # Not required, but speeds up builds
          githubToken: ${{ github.token }}
          # Create an artifacts directory
          setup: |
            mkdir -p "${PWD}/artifacts"
          # Mount the artifacts directory as /artifacts in the container
          dockerRunArgs: |
            --volume "${PWD}/artifacts:/artifacts"
          # The shell to run commands with in the container
          shell: /bin/bash
          # Install some dependencies in the container.
          install: |
            case "${{ matrix.distro }}" in
              ubuntu*|jessie|stretch|buster|bullseye|bookworm)
                apt-get update && apt-get install -y ca-certificates wget curl lsb-release && apt-get clean all
                ;;
            esac
          # Produce a binary artifact and place it in the mounted volume
          run: |
            ls -lath "/artifacts"
            curl -O https://deb.goaccess.io/provision/provision.dpkg.sh
            chmod +x ./provision.dpkg.sh
            ./provision.dpkg.sh
            echo "Success!!"

      - name: Show the artifact
        run: |
          pwd
          ls -lath "${PWD}/artifacts"

      - name: Test deb package installation
        run: |
          # Find the generated deb package
          DEB_FILE=$(find "${PWD}/artifacts" -name "goaccess_*.deb")
          echo "Found deb package: $DEB_FILE"

          # Determine the correct Docker image for the distro
          case "${{ matrix.distro }}" in
            bookworm) IMAGE="debian:bookworm" ;;
            bullseye) IMAGE="debian:bullseye" ;;
            buster) IMAGE="debian:buster" ;;
            ubuntu16.04) IMAGE="ubuntu:16.04" ;;
            ubuntu18.04) IMAGE="ubuntu:18.04" ;;
            ubuntu20.04) IMAGE="ubuntu:20.04" ;;
            ubuntu22.04) IMAGE="ubuntu:22.04" ;;
            ubuntu24.04) IMAGE="ubuntu:24.04" ;;
            ubuntu24.10) IMAGE="ubuntu:24.10" ;;
            *) echo "Unknown distro: ${{ matrix.distro }}" && exit 1 ;;
          esac

          echo "Using Docker image: $IMAGE"

          # Run a container with the correct architecture and test the installation
          docker run --rm -v "${PWD}/artifacts:/artifacts" --platform linux/${{ matrix.arch }} "$IMAGE" bash -c "
            apt-get update &&
            apt-get install -y /artifacts/$(basename $DEB_FILE) &&
            goaccess --version &&
            apt-get remove -y goaccess"

      - name: Upload deb package
        uses: actions/upload-artifact@v4
        with:
          name: deb-package-${{ matrix.distro }}-${{ matrix.arch }}
          path: 'artifacts/*.deb'
          retention-days: 1


================================================
FILE: .github/workflows/docker-publish.yml
================================================
name: Docker
on:
  push:
    # Publish `master` as Docker `latest` image.
    branches:
      - master
    # Publish `v1.2.3` tags as releases.
    tags:
      - v*
  # Run tests for any PRs.
  pull_request:
env:
  IMAGE_NAME: ${{ github.repository }}
jobs:
  # Run tests.
  # See also https://docs.docker.com/docker-hub/builds/automated-testing/
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Run tests
        run: |
          if [ -f docker-compose.test.yml ]; then
            docker-compose --file docker-compose.test.yml build
            docker-compose --file docker-compose.test.yml run sut
          else
            docker build . --file Dockerfile
          fi
  # Push image to Docker Hub.
  # See also https://docs.docker.com/docker-hub/builds/
  push:
    # Ensure test job passes before pushing image.
    needs: test
    runs-on: ubuntu-latest
    if: github.event_name == 'push'

    steps:
      - uses: actions/checkout@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Build image
        run: docker build . --file Dockerfile --tag $IMAGE_NAME
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Push image
        run: |
          # Change all uppercase to lowercase
          IMAGE_ID=$(echo "${{ github.repository }}" | tr '[A-Z]' '[a-z]')

          # Strip git ref prefix from version
          VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')

          # Strip "v" prefix from tag name
          [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
          # Use Docker `latest` tag convention
          [ "$VERSION" == "master" ] && VERSION=latest

          echo IMAGE_ID=$IMAGE_ID
          echo VERSION=$VERSION

          docker buildx create --use
          docker buildx build --platform linux/amd64,linux/arm64 -t $IMAGE_ID:$VERSION --push .



================================================
FILE: .github/workflows/spelling.yml
================================================
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow

name: "Spelling"

on:
  workflow_dispatch:
# Add [skip ci] to commit message to skip CI.

permissions:
    contents: "read"

concurrency:
    group: "${{ github.workflow }}-${{ github.ref }}"
    cancel-in-progress: true

jobs:
    spell_check:
        name: "文A Spell check"
        runs-on: "ubuntu-22.04"
        timeout-minutes: 1
        steps:
        -
            name: "Checkout repository"
            uses: "actions/checkout@v3"
        -
            name: "Cache pip"
            uses: "actions/cache@v3"
            with:
                path: "~/.cache/pip"
                key: "${{ runner.os }}-pip-codespell"
        -
            name: "Install codespell"
            run: |
                pip install --user 'codespell>=2.2'
        -
            name: "Search for misspellings"
            run: |
                "$(python -m site --user-base)/bin/codespell"


================================================
FILE: .gitignore
================================================
#custom section
config.status
config.guess
config.sub
config.rpath
configure~
**/.deps/
/INSTALL
/Makefile
src/.dirstamp
src/config.h
src/config.h.in
src/config.h.in~
src/config.log
src/config.status
src/.deps/
src/stamp-h1
goaccess
bin2c
# font selection
selection.json
#merged from https://raw.github.com/github/gitignore/master/Autotools.gitignore
# http://www.gnu.org/software/automake

Makefile.in

# http://www.gnu.org/software/autoconf

/autom4te.cache
/aclocal.m4
/compile
/configure
/depcomp
/install-sh
/missing

# VIM
*.*.swp
*.log

# Object files
*.o
*.ko
*.obj
*.elf

# Precompiled Headers
*.gch
*.pch

# Libraries
*.lib
*.a
*.la
*.lo

# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib

# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex

# Vagrant
.vagrant

# M4 macros
/m4/*

# I18n stuff
/ABOUT-NLS
/po/*.gmo
/po/*.header
/po/*.mo
/po/*.sed
/po/*.sin
/po/Makefile.in.in
/po/Makevars.template
/po/POTFILES
/po/Rules-quot
/po/Makefile
/po/stamp-po

# compiled resources
/src/appcss.h
/src/appjs.h
/src/bootstrapcss.h
/src/chartsjs.h
/src/d3js.h
/src/facss.h
/src/hoganjs.h
/src/tpls.h
/src/countries110m.h
/src/cities10m.h
/src/topojsonjs.h

# intermediate resources
/resources/css/app.css.tmp
/resources/css/bootstrap.min.css.tmp
/resources/css/fa.min.css.tmp
/resources/js/app.js.tmp
/resources/js/charts.js.tmp
/resources/js/d3.v?.min.js.tmp
/resources/js/hogan.min.js.tmp
/resources/tpls.html.tmp
/resources/countries-110m.json.tmp
/resources/cities-10m.json.tmp
/resources/js/topojson.v3.min.js.tmp


================================================
FILE: AUTHORS
================================================
GoAccess was designed and developed by Gerardo Orellana <goaccess@prosoftcorp.com>

Special thanks to the following individuals for their great contributions:

  * 0bi-w6n-K3nobi <71027865+0bi-w6n-K3nob@users.noreply.github.com>
  * Aaditya Bagga <noreply@github.com>
  * abgit <francisco.j.azevedo@gmail.com>
  * Adam Monsen <haircut@gmail.com>
  * Adam Števko <adam.stevko@gmail.com>
  * Adam Weinberger <adamw@adamw.org>
  * Adrian <totcha@gazeta.pl>
  * Ainsley Ellis <ainsleymae@proton.me>
  * aishikoyo <aixxx033@umn.edu>
  * Alan Placidina <noreply@github.com>
  * Alexander Eifler <noreply@github.com>
  * Alexandre GUIOT--VALENTIN <contact@alexandregv.fr>
  * Alexandre Perrin <noreply@github.com>
  * Alexis Lefebvre <alexislefebvre+github@gmail.com>
  * Ali Homafar <home.isfar@gmail.com>
  * allofmex <allofmex@web.de>
  * Amos Hayes <ahayes@gcrc.carleton.ca>
  * A. Nackov <anackov@gmail.com>
  * Anders Johansson <47452862+tellustheguru@users.noreply.github.com>
  * Andreas Sommer <andreas.sommer@ppro.com>
  * Andreas Weigel <andreaswe@securepoint.de>
  * Andrew Kvalheim <Andrew@Kvalhe.im>
  * Andrew Minion <andrew@andrewrminion.com>
  * Antonio Terceiro <terceiro@softwarelivre.org>
  * Arnaud Rebillout <elboulangero@gmail.com>
  * Arnie97 <arnie97@gmail.com>
  * as0n <n.was.here@gmail.com>
  * Aslak Raanes <noreply@github.com>
  * Axel Wehner <mail@axelwehner.de>
  * azio7 <azio7@outlook.com>
  * bbbboom <bwdyxg@gmail.com>
  * Bbertatum <bertrand@2backup.fr>
  * Benjamin Bach <benjamin@overtag.dk>
  * Bjørnar Hansen <noreply@github.com>
  * Bob Black <git@riblack.com>
  * Bo Cai <charpty@gmail.com>
  * Brandon Coleman <metrix1978@gmail.com>
  * Branimir Ri\v{c}ko <rickobranimir@gmail.com>
  * Carlos Duelo <noreply@github.com>
  * Celso Providelo <celso.providelo@gmail.com>
  * ChangMo Yang <dcyang@unist.ac.kr>
  * Chang Zhao <noreply@github.com>
  * Chilledheart <rwindz0@gmail.com>
  * Chris Downs <noreply@github.com>
  * Christian Göttsche <cgzones@googlemail.com>
  * Christian Hermann <c.hermann@bitbeans.de>
  * Christian Moelders <christian.moelders@storeplus.de>
  * Christopher Meng <i@cicku.me>
  * Clément Hermann <nodens@nodens.org>
  * cristianpb <felipebrokate@gmail.com>
  * Cthulhux <github@tuxproject.de>
  * Daniel Aleksandersen <code@daniel.priv.no>
  * Daniel Aleksandersen <noreply@github.com>
  * Daniel (dmilith) Dettlaff <dmilith@me.com>
  * Danila Vershinin <noreply@github.com>
  * Danny Kirkham <danny@kirkham.dev>
  * Darek Kay <hello@darekkay.com>
  * David Carlier <devnexen@gmail.com>
  * David Geistert <d3f3kt@scripts4u.net>
  * d_dandrew <dragonandy@foxmail.com>
  * ElXreno <elxreno@gmail.com>
  * Enrique Becerra <kabeza@gmail.com>
  * evitalis <evitalis@users.noreply.github.com>
  * Felix Häberle <34959078+felixhaeberle@users.noreply.github.com>
  * Florian Forster <ff@octo.it>
  * forDream <noreply@github.com>
  * fqbuild <fqbuild@FutureQuest.net>
  * Frederic Cambus <fcambus@users.sourceforge.net>
  * Func <Funcer@outlook.com>
  * gemmaro <gemmaro.dev@gmail.com>
  * Genki Sugawara <sugawara@cookpad.com>
  * Gerald Combs <gerald@zing.org>
  * Geraldo Alves <junior.alves.2007@gmail.com>
  * gitqlt <noreply@github.com>
  * Hiroki Kamino <46459949+err931@users.noreply.github.com>
  * holys <chendahui007@gmail.com>
  * Izzy <izzy@qumran.org>
  * JackDesBwa <jackdesbwa@gmail.com>
  * Jannes Blobel <72493222+jannesblobel@users.noreply.github.com>
  * Jeffery Wilkins <goaccess@prosoftcorp.com>
  * Jeremy Burks <jeremy@zomgwat.com>
  * Jeremy Lin <jeremy.lin@gmail.com>
  * Joaquín de la Zerda <joaquin@itbaf.com>
  * Joe Groocock <me@frebib.net>
  * Joe Winett <noreply@github.com>
  * Jonas Kittner <jonas.kittner@rub.de>
  * Joona <joona.paivahonka@gmail.com>
  * Jordan Trask <jtrask@gmail.com>
  * Josh Briggs <josh@briggsdev.us>
  * Julian Xhokaxhiu <xhokaxhiujulian@gmail.com>
  * Justin Mills <justin.mills@utah.edu>
  * Kamino Hiroki <37243867+4f8p@users.noreply.github.com>
  * Kit Westneat <kit.westneat@gmail.com>
  * Koichiro Iwao <meta@vmeta.jp>
  * kokke <spam@rowdy.dk>
  * kyle sloan <kyle@ifsight.com>
  * LeoAttn <leo.massonnat@hotmail.fr>
  * lhywk <lhywkd22@gmail.com>
  * Linus Gasser <linus.gasser@epfl.ch>
  * Magnus Groß <magnus@mggross.com>
  * Maksim Losev <mlosev@beget.ru>
  * mario-donnarumma <mario.donnarumma.97@gmail.com>
  * markiewb <noreply@github.com>
  * Mark J. Berger <mark.berger.j@gmail.com>
  * Martins Polakovs <martins.polakovs@gmail.com>
  * Massimiliano Torromeo <massimiliano.torromeo@gmail.com>
  * Mathieu Aubin <noreply@github.com>
  * Mathieu Thoretton <mathieu.thoretton@getyourguide.com>
  * Max Christian Pohle <goaccess@prosoftcorp.com>
  * metrix78 <metrix1978@gmail.com>
  * Michael Vetter <jubalh@iodoru.org>
  * Mika Raunio <mika@diago.global>
  * Moritz Schott <unsafe@nurfuerspam.de>
  * m-r-r <raybaudroigm@gmail.com>
  * mynameiscfed <christopherfederico@gmail.com>
  * Newbe36524 <newbe36524@qq.com>
  * Nicolas Le Manchet <nicolas@lemanchet.fr>
  * Nicolas <noreply@github.com>
  * Ophir LOJKINE <pere.jobs@gmail.com>
  * Otto Kekäläinen <otto.kekalainen@seravo.fi>
  * Panos Stavrianos <panos-stavrianos@users.noreply.github.com>
  * pitilux <pitilux@elinar.fr>
  * Pixelcode <52963327+realpixelcode@users.noreply.github.com>
  * Placidina <alanplacidina@gmail.com>
  * pravdomil <noreply@github.com>
  * rachid-debu <rachid.debu@yahoo.fr>
  * radoslawc <radoslawc@gmail.com>
  * rahra <bf@abenteuerland.at>
  * Ramires Viana <59319979+ramiresviana@users.noreply.github.com>
  * rgriebl <robert@griebl.org>
  * Roy Marples <roy@marples.name>
  * rtmkrlv <artyom.karlov@gmail.com>
  * Ryow <ryow@midgen.asia>
  * schoonc <noreply@github.com>
  * Sean Cross <sean@xobs.io>
  * Sean Wei <me@sean.taipei>
  * Sebastian Wiedenroth <wiedi@frubar.net>
  * sh4rkman <maxime.boussard@gmail.com>
  * Simon Gardling <Titaniumtown@gmail.com>
  * SjonHortensius <noreply@github.com>
  * Steely Wing <noreply@github.com>
  * Stéphane Péchard <stephanepechard@gmail.com>
  * Stephen Wade <stephen@stephenwade.me>
  * Stoyan Dimov <s.dimov@codelogic.eu>
  * Stuart Henderson <noreply@github.com>
  * Sveinbjorn Thordarson <sveinbjorn@sveinbjorn.org>
  * Tatsuyuki Ishi <noreply@github.com>
  * Thomas Gläßle <t_glaessle@gmx.de>
  * Thomas Jost <schnouki@schnouki.net>
  * Thomas Lange <code@nerdmind.de>
  * throwaway1037 <noreply@github.com>
  * Tim Gates <tim.gates@iress.com>
  * Timothy Quilling <teqed@shatteredsky.net>
  * Tom Samstag <github@modtwo.com>
  * ugola <urvika.gola@gmail.com>
  * Ulrich Schwarz <ulmi@absatzen.de>
  * Viktor Szépe <noreply@github.com>
  * Viktor Szépe <viktor@szepe.net>
  * Ville Skyttä <ville.skytta@iki.fi>
  * Vincent Bernat <vincent@bernat.ch>
  * Vladimir Pavljuchenkov <spiderx@spiderx.dp.ua>
  * William Muir <wamuir@gmail.com>
  * Wladimir Palant <noreply@github.com>
  * wodev <wodev@fischer-net.net>
  * woobee <support.developpement@gmail.com>
  * Yaroslav Halchenko <debian@onerussian.com>
  * Yuri D'Elia <wavexx@thregr.org>
  * Yuriy M. Kaminskiy <yumkam@gmail.com>
  * zeke <zhenkai0605@gmail.com>


================================================
FILE: COPYING
================================================
The MIT License (MIT)

Copyright (c) 2009-2022 Gerardo Orellana <hello @ goaccess.io>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: ChangeLog
================================================
Changes to GoAccess 1.10.1 - Saturday, February 14, 2026

  - Fixed a crash when restoring persisted data via `--restore` that contained
    GEOLOCATION data generated in versions ≤ v1.9.4 and loaded with v1.10.

Changes to GoAccess 1.10 - Wednesday, February 11, 2026

  - Added new bar charts to the terminal UI for a quicker visual read of
    metrics.
  - Added city-level entries to the GEOLOCATION panel.
  - Added optional zlib support to parse compressed log files.
  - Added panel reordering in the TUI, letting you customize the dashboard
    layout.
  - Added sorting for panels in the HTML report.
  - Added the ability to expand and collapse subitems within TUI panels for
    easier navigation of large datasets.
  - Added a TX Amount percent column to the TUI for clearer traffic share
    insight.
  - Added the ability to prepend the virtual host to a request via
    --concat-vhost-req
  - Deprecated `--no-column-names` in favor of a unified TUI dashboard.
  - Fixed log tailing edge cases, including empty reads and date specificity
    overrides from the CLI.
  - Fixed stability issues in multi-threaded parsing and during Ctrl+C with
    multiple jobs.
  - Fixed inability to override date specificity from the CLI.
  - Fixed dry-run lines being counted as processed during config format
    testing.
  - Improved the TUI spinner and progress display for smoother, clearer
    feedback during parsing.
  - Refreshed the HTML dashboard styling and theme visuals.
  - Updated browser and OS detection lists, including macOS 26 (Tahoe) and
    Alibaba Cloud Linux.
  - Updated packaging targets, adding Debian Trixie while dropping Debian
    Buster and i386 builds.
  - Updated Swedish, Chinese and Japanese translations
  - Updated Dockerfile to use openssl-dev for compatibility with
    SSL_CIPHER_standard_name(3ssl).

Changes to GoAccess 1.9.4 - Monday, March 31, 2025

  - Added an azimuthal (globe) projection to the HTML report for geolocation,
    providing a less distorted view of the global map.
  - Added 'apple-touch-icon' for improved iPhone home screen support, enabling
    quick access to reports directly from the home screen.
  - Added 'aria-*' attributes to HTML report for better accessibility, ensuring
    that the report is more inclusive for screen readers and other assistive
    technologies.
  - Added 'theme-color' '<meta>' tag to the HTML report for better integration
    with mobile devices, allowing the browser's address bar to match the
    report's theme color.
  - Added additional validation checks to ensure the existence of file paths
    provided in CLI options, preventing errors.
  - Added WebSocket authentication to support both local-generated JSON Web
    Tokens (JWT) and external verification methods. This enhancement enables
    easy integration with external authentication systems while ensuring CSRF
    protection for token refresh requests.
  - Changed WebSocket server to avoid swapping bytes on big-endian platforms,
    fixing compatibility issues on AIX systems.
  - Fixed the issue where zooming/panning the map would unexpectedly skip or
    jump back, providing a smoother user experience.
  - Fixed the issue where the same mime types were displayed as duplicates due
    to different casing by normalizing mime types before adding them to the
    storage, ensuring consistent reporting.
  - Replaced div elements with more semantic HTML elements like <section>,
    <header>, and <article>, improving the structure and accessibility of the
    report.
  - Updated the list of supported browsers and operating systems to ensure more
    accurate tracking and reporting.
  - Updated the method of parsing the browser list for bots/crawlers, enabling
    the capture of previously difficult-to-parse bots, allowing for more
    precise targeting and better analytics.

Changes to GoAccess 1.9.3 - Friday, May 31, 2024

  - Added additional common bots to the list.
  - Added Address Sanitizer via '--enable-asan' to the configure options for
    debugging purposes.
  - Fixed inability to parse JSON keys containing dots.
  - Fixed out-of-bounds access for invalid HTTP status codes.
  - Fixed out-of-bounds access when parsing a log in serial processing mode.
  - Fixed regression introduced in 8f570c, which caused duplicate counts upon
    restoring from disk via '--restore'.

Changes to GoAccess 1.9.2 - Friday, April 12, 2024

  - Added World Map to the Geo Location panel on the HTML report.
  - Added additional non-official/standard HTTP status codes such as Caddy's 0
    HTTP status among others.
  - Added support for '%z' on strptime for non-glibc systems, such as musl libc
    in Alpine Linux (Docker container), enabling the use of '--tz'
  - Changed the '--hide/ignore-referrer' options to filter by hostname directly
    without the use of wildcards, e.g., '--ignore-referrer=wiki.google.com'.
  - Fixed inability to parse duplicate specifiers during log format parsing.
  - Fixed regression which previously hindered the ability to modify log, date,
    and time formats within the TUI dialog. i.e., '# goaccess access.log -c'.
  - Replaced 'remote_ip' with 'client_ip' for Caddy's JSON format, allowing the
    use of trusted proxies.
  - Updated Caddy JSON example log format to handle headers correctly.
  - Updated Swedish i18n.

Changes to GoAccess 1.9.1 - Tuesday, February 05, 2024

  - Added support for macOS to the OS detection.
  - Fixed C99 mode issue with initial declarations [CentOS7].
  - Fixed minor typographical, orthographic, and grammatical errors in the
    German translation.
  - Fixed a regression issue wherein parsing would halt at the first empty log
    file.

Changes to GoAccess 1.9 - Tuesday, January 30, 2024

  - Added multi-threaded log processing with '--jobs=<num>' for a boost in
    parsing speed, achieving an improvement ranging from 1.26 to 3.65x faster.
  - Added the 'SEARCH' method to the list of HTTP request methods.
  - Added compatibility to include the Traefik log format.
  - Added the ability to gracefully handle SIGQUIT as a signal for shutdown.
  - Altered WebSocket server initialization, ensuring it takes place after
    log-format checks.
  - Deprecated '--output-format'; now, only the '--output' option is
    permissible.
  - Implemented mutex locking to prevent a TZ environment race condition.
  - Fixed a potential heap overflow when checking a request for bots.
  - Fixed sorting of child items on HTML panels when sorting a column via the
    UI.
  - Fixed an issue where, in some cases, the referer host wouldn't be extracted
    properly
  - Fixed the miscategorization of Android 12.1 under operating systems.
  - Fixed TUI and temporarily ignored SIGINT during subdialog execution via
    Ctrl+C.
  - Updated the list of browsers/bots.

Changes to GoAccess 1.8.1 - Tuesday, October 31, 2023

  - Added latest Android and macOS versions to the list of OSs.
  - Fixed issue when trying to apply a regex on an invalid value (HTML report).
  - Fixed issue with D3.js xScale.domain() going out of boundaries in certain
    cases.
  - Prevent setting default static files when no static-file options are
    defined in config file.

Changes to GoAccess 1.8 - Saturday, September 30, 2023

  - Added dual-stack support to the WebSocket server.
  - Added Debian Bookworm to the official deb repo.
  - Added Ubuntu Lunar to the official deb repo.
  - Fixed compiler error on macOS 10.12.
  - Updated bootstrap to v3.4.
  - Updated FontAwesome with additional icons for upcoming major release.
  - Updated Japanese translation.
  - Updated OS display from Macintosh to macOS.
  - Updated to D3.js v7 (latest) including charts.js code.

Changes to GoAccess 1.7.2 - Friday, March 31, 2023

  - Added a color-coding scheme to HTTP status codes.
  - Added '--external-assets' command line option to output external JS+CSS
    files. Great when used with Content Security Policy (CSP).
  - Ensure there's a fallback for 'Windows' if it appears on the user-agent.
  - Ensure we construct the WebSocket URL in a way that supports multiple use
    cases when used along '--ws-url' and '--port'.
  - Fixed a segfault due to a null pointer exception on FreeBSD.
  - Fixed build with '--disable-nls'.
  - Fixed invalid read (heap-buffer-overflow) when parsing an XFF spec via
    JSON.
  - Fixed segfault when parsing a specific XFF specifier.

Changes to GoAccess 1.7.1 - Tuesday, February 28, 2023

  - Added 'inlang' for easy localization (i18n) updates.
    https://inlang.com/editor/github.com/allinurl/goaccess
  - Added nanosecond parsing option via the '%n' specifier. Great for parsing
    'Traefik' JSON logs duration field.
  - Changed Docker workflow to build a docker image on different architectures
    {'arm64' & 'amd64'}.
  - Fixed issue with '--unknowns-as-crawlers' where it did not process them as
    such.

Changes to GoAccess 1.7 - Saturday, December 31, 2022

  - Added an option to classify unknown OS and browsers as crawlers using
    `--unknowns-as-crawlers`.
  - Added highlighting to certain metrics on the HTML report for readability.
  - Added a new panel that displays ASN data for GeoIP2 and legacy databases.
    Great for detecting malicious traffic and blocking accordingly.
  - Added an ASN metric per IP/host.
  - Changed and prioritize user's browsers list over heuristics.
  - Ensure `--geoip-database=<path>` can be used multiple times to support
    different databases.
  - Fixed invalid read when loading the list of agents for an IP.
  - Fixed issue where a file containing a NUL `\0` character would crash the
    program.
  - Updated Swedish i18n.

Changes to GoAccess 1.6.5 - Monday, October 31, 2022

  - Updated Dockerfile build stage to use alpine:3.
  - Updated deb build to use the right libncursesw6 dependency.

Changes to GoAccess 1.6.4 - Friday, September 30, 2022

  - Added Korean translation (i18n).
  - Added the ability to use filenames as virtualhosts using
    '--fname-as-vhost=<regex>'.
  - Enabled crawlers/bots under the OSs panel instead of being shown as
    'Unknown'.
  - Updated the format on the command-line help output.

Changes to GoAccess 1.6.3 - Thursday, August 31, 2022

  - Enabled DNS thread when resolving a host and outputting real-time HTML.
    This helps avoid stalling the WS server on busy connections.
  - Fixed issue where it would not properly parse an XFF if the '%h' specifier
    was already set.
  - Fixed possible XSS issues when using '--html-custom-css' and
    '--html-custom-js' by allowing valid filenames.

Changes to GoAccess 1.6.2 - Thursday, July 14, 2022

  - Added `Android 12` to the list of OSs.
  - Added `macOS 12 Ventura` to the list of OSs.
  - Fixed implicit declaration build issue due to `timegm(3)` on `BSDs` and `macOS`.
  - Fixed issue where timezone conversion would be performed twice on a given
    date.

Changes to GoAccess 1.6.1 - Thursday, June 30, 2022

  - Added a `--ping-interval=<secs>` in an attempt to keep the WebSocket
    connection opened.
  - Added support for timezone conversion via `--datetime-format=<format>` and
    `--tz=<timezone>`.
  - Added the ability to reconnect to the WebSocket server after 1 sec with
    exponential backoff (x20).
  - Fixed issue where an invalid client connection would stall data out to
    clients via the WebSocket server.
  - Fixed an issue where real-time data would be parsed multiple times under `Cygwin`.

Changes to GoAccess 1.6 - Tuesday, May 31, 2022

  - Changed slightly how the XFF field is specified. See man page for details.
  - Ensure city is displayed with the DBIP City Lite database.
  - Ensure no 'cleaning up resources' message  is displayed if `--no-progress`
    is passed.
  - Ensure the maximum number of items per panel defaults to 1440 (24hrs) when
    passing `--date-spec=min`.
  - Fixed issue when parsing a delimited XFF field followed by a host IP.
  - Fixed issue where some data was buffered on the WebSocket server before it
    was sent to each client.
  - Fixed issue where the WebSocket server would fail with POLLNVAL consuming
    100% CPU.
  - Fixed segfault when attempting to open an unresolved IP on mac/BSDs.

Changes to GoAccess 1.5.7 - Thursday, April 28, 2022

  - Updated Caddy's JSON format. This should address CADDY's v2.5.0 change.
  - Updated Chinese translation (i18n).
  - Updated GeoIP module so it defaults to native language name (i18n) or
    fall-back to English.
  - Updated Russian translation (i18n).
  - Updated Ukrainian translation (i18n).

Changes to GoAccess 1.5.6 - Wednesday, March 30, 2022

  - Added `--anonymize-level=<1|2|3>` option to specify IP anonymization level.
  - Added minute specificity to the Visitors panel via `--date-spec=min`.
  - Added the ability to toggle on/off panels on the HTML report.
  - Changed stderr to stdout on non-error output when exiting goaccess.

Changes to GoAccess 1.5.5 - Monday, January 31, 2022

  - Added mechanism to automatically parse additional bots.
  - Changed area chart interpolation to 'monotone'. This should avoid the issue
    where the interpolated curve has a bend into the negative space.
  - Changed build to use debugging symbols even for release builds.
  - Changed order on which we verify bots to be the first thing we check. This
    adds a slight improvement on parsing time.
  - Ensure we initialize DNS resolver conditions and mutexes before they're used.
  - Fixed possible buffer over-read for cases where a '\0' could be reached
    early when parsing a log line.
  - Fixed possible data race on UI spinner thread.
  - Fixed regression where a lot of robots were not detected by GoAccess.

Changes to GoAccess 1.5.4 - Saturday, December 25, 2021

  - Added AWS ALB to the predefined logs format list --log-format=AWSALB.
  - Ensure we lock our pipe/websocket writer before broadcasting message.
  - Ensure we require a valid host token even when we're not validating the IP.
  - Ensure we simply update the TUI once after tailing multiple files.
  - Ensure we simply update the UI once after tailing multiple files.
  - Fixed buffer overflow when checking if an HTTP code was a 404 on an empty
    status code.
  - Optimized terminal and HTML UI output when tailing multiple files.
  - Updated DB PATH error message to be more descriptive.

Changes to GoAccess 1.5.3 - Thursday, November 25, 2021

  - Added additional crawlers to the default list.
  - Added Italian translation (i18n).
  - Added 'macOS 12' to the list of OS.
  - Fixed buffer overflow caused by an excessive number of invalid requests
    with multiple logs.
  - Fixed visualization issue on the HTML report for panels with disabled
    chart.

Changes to GoAccess 1.5.2 - Tuesday, September 28, 2021

  - Added .avi to the list of static requests/extensions.
  - Changed label from 'Init. Proc. Time' to 'Log Parsing Time'.
  - Fixed issue where lengthy static-file extension wouldn't account certain
    valid requests.
  - Fixed possible buffer underflow when checking static-file extension.
  - Fixed segfault when attempting to parse an invalid JSON log while using a
    JSON log format.
  - Fixed segfault when ignoring a status code and processing a line > '4096'
    chars.

Changes to GoAccess 1.5.1 - Wednesday, June 30, 2021

  - Changed official deb repo so it now builds '--with-getline' in order to
    support request lines longer than 4096.
  - Ensure there's no tail delay if the log file hasn't changed.
  - Fixed data race when writing to a self-pipe and attempting to stop the WS server.
  - Fixed inability to close expanded panel when pressing 'q' on TUI.
  - Fixed possible data race during parsing spinner label assignment.
  - Increased the maximum number of files to monitor from '512' to '3072'.

Changes to GoAccess 1.5 - Wednesday, May 26, 2021

  - Added a Docker container based isolated build environment (Debian).
  - Added Dark Mode detection to the HTML report.
  - Added the ability for the WebSocket server to bind to a Unix-domain socket.
  - Added the ability to parse IPs enclosed within brackets (e.g., IPv6).
  - Changed categorization of requests containing 'CFNetwork' to 'iOS' when
    applicable.
  - Changed command line option from '--hide-referer' to '--hide-referrer'.
  - Changed command line option from '--ignore-referer' to '--ignore-referrer'.
  - Fixed a potential division by zero.
  - Fixed inability to parse IPv6 when using a 'CADDY' log format.
  - Fixed issue where a 'BSD' OS could be displayed as Linux with certain
    user-agents.
  - Fixed memory leak when a JSON value contained an empty string (e.g.,
    JSON/CADDY format).
  - Fixed possible buffer overflow on a WS packet coming from the browser.
  - Refactored a substantial part of the storage codebase for upcoming
    filtering/search capabilities (issue #117).
  - Refactored DB storage to minimize memory consumption up to '35%'.
  - Updated default 'AWS Elastic Load Balancing' log format.
  - Updated German translation.
  - Updated page size to 24 on the HTML report.
  - Updated UNIX OS categories.

Changes to GoAccess 1.4.6 - Sunday, February 28, 2021

  - Added additional feed reader clients.
  - Added additional browsers and bots to the main list.
  - Added command line option '--unknowns-log' to log unknown browsers and
    OSs.
  - Added 'Referer' to the pre-defined 'Caddy JSON' log format.
  - Added support for real-time piping as non-root user.
  - Added the ability to Handle case when IPv4 is encoded as IPv6 in
    GeoIP1/legacy.
  - Ensure we capture linux (lowercase) when extracting an OS.
  - Fixed a regression in parsing Google Cloud Storage or possibly other
    non-JSON formats.
  - Fixed inability to parse escaped formats.
  - Fixed issue when using '%s' with 'strptime(3)' under musl libc. This
    addresses mostly the Docker image.
  - Fixed possible buffer over-read for certain log-format patterns.
  - Fixed segfault when attempting to process a malformed JSON string.
  - Fixed segfault when setting an empty log-format from the TUI dialog.
  - Fixed sorting on hits and visitors when larger than INT_MAX.
  - Updated CloudFront pre-defined log-format to reflect the latest fields.
  - Updated 'Dockerfile' image to use 'alpine:3.13' instead of edge due to
    compatibility issue with the GNU coreutils.

Changes to GoAccess 1.4.5 - Tuesday, January 26, 2021

  - Fixed build issue due to initial declarations only allowed in C99 mode
    (e.g., CentOS7).

Changes to GoAccess 1.4.4 - Monday, January 25, 2021

  - Added 'Caddy' to the list of pre-defined log formats.
  - Added command line option '--no-strict-status' to disable status validation.
  - Added native support to parse JSON logs.
  - Added the ability to process timestamps in milliseconds using '%*'.
  - Ensure TUI/CSV/HTML reports are able to output 'uint64_t' data.
  - Ensure we allow UI render if the rate at which data is being read is
    greater than '8192' req/s.
  - Ensure we don't re-render Term/HTML output if no data was read/piped.
  - Fixed build configure to work on NetBSD.
  - Fixed issue where it would send data via socket each second when managed
    by systemd.
  - Fixed issue where parser was unable to parse syslog date with padding.
  - Fixed issue where some items under browsers.list were not tab separated.
  - Fixed issue where the format parser was unable to properly parse logs
    delimited by a pipe.
  - Fixed issue where T.X. Amount metrics were not shown when data was piped.
  - Fixed issue where XFF parser could swallow an additional field.
  - Fixed memory leak when using '%x' as date/time specifier.
  - Replaced select(2) with poll(2) as it is more efficient and a lot faster
    than select(2).
  - Updated Swedish i18n.

Changes to GoAccess 1.4.3 - Friday, December 04, 2020

  - Added the ability to set how often goaccess will parse data and output to
    the HTML report via '--html-refresh=<secs>'.
  - Changed how TLS is parsed so the Cypher uses a separate specifier.
    It now uses '%K' for the TLS version and '%k' for the Cypher.
  - Fixed issue where real-time output would double count a rotated log. This
    was due to the change of inode upon rotating the log.
  - Updated man page to reflect proper way of 'tail -f' a remote access log.

Changes to GoAccess 1.4.2 - Monday, November 16, 2020

  - Added the ability to show 'Encryption Settings' such as 'TLSv1.2' and
    Cipher Suites on its own panel.
  - Added the ability to show 'MIME Types' such as 'application/javascript' on
    its own panel.
  - Changed Debian build to use mmdb instead of libgeoip (legacy).
  - Ensure the HTML report defaults to widescreen if viewport is larger than
    '2560px'.
  - Fixed inability to properly process multiple logs in real-time.
  - Fixed issue where named PIPEs were not properly seed upon generating
    filename.
  - Fixed issue where served time metrics were not shown when data was piped.
  - Removed unnecessary padding from SVG charts. Improves readability on mobile.

Changes to GoAccess 1.4.1 - Monday, November 09, 2020

  - Added additional browsers and bots to the main list.
  - Added 'Android 11' to the list of OSs.
  - Added 'macOS 11.0 Big Sur' to the list of OSs.
  - Added 'average' to each panel overall metrics.
  - Added '.dmg', '.xz', and '.zst' to the static list.
  - Added extra check to ensure restoring from disk verifies the content of the
    log against previous runs.
  - Added Russian translation (i18n).
  - Added Ukrainian translation (i18n).
  - Added support for HTTP status code '308'.
  - Added the ability for 'get_home ()' to return NULL on error, instead of
    terminating the process. Great if using through systemd.
  - Added the ability to read lowercase predefined log formats. For instance,
    '--log-format=COMBINED' or '--log-format=combined'.
  - Changed how FIFOs are created and avoid using predictable filenames under
    '/tmp'.
  - Changed '--ignore-referer' to use whole referrer instead of referring site.
  - Ensure Cache Status can be parsed without sensitivity to case.
  - Ensure restored data enforces '--keep-last' if used by truncating
    accordingly.
  - Fixed a few memory leaks when restoring from disk.
  - Fixed blank time distribution panel when using timestamps.
  - Fixed build issue due to lack of 'mmap' on 'Win'/'Cygwin'/'MinGW'.
  - Fixed crash in mouse enabled mode.
  - Fixed double free on data restore.
  - Fixed inability to keep processing a log when using '--keep-last'.
  - Fixed inability to properly parse truncated logs.
  - Fixed inability to properly count certain requests when restoring from
    disk.
  - Fixed issue where it would not parse subsequent requests coming from stdin (tail).
  - Fixed issue where log truncation could prevent accurate number counting.
  - Fixed issue where parsed date range was not rendered with '--date-spec'.
  - Fixed issue where parser would stop regardless of a valid '--num-test' value.
  - Fixed issue where restoring from disk would increment 'MAX.TS'.
  - Fixed possible incremental issue when log rotation occurs.
  - Fixed possible XSS when getting real-time data into the HTML report.
  - Fixed potential memory leak when failing to get root node.
  - Fixed real-time hits count issue for certain scenarios.
  - Fixed segfault in 'Docker' due to a bad allocation when generating FIFOs.
  - Fixed 'Unknown' Operating Systems with 'W3C' format.
  - Removed unnecessary include from parser.c so it builds in macOS.
  - Updated each panel overall UI to be more streamlined.
  - Updated French translation.
  - Updated German translation.
  - Updated Spanish translation.
  - Updated sigsegv handler.

Changes to GoAccess 1.4 - Monday, May 18, 2020

  - Added a caching storage mechanism to improve parsing raw data and data
    rendering.
  - Added a mechanism to avoid counting duplicate data when restoring persisted
    data from disk.
  - Added additional option to the HTML report to set a maximum number of items
    per page to 3.
  - Added a list of podcast-related user agents under '%sysconfdir%'.
  - Added 'Android 10' to the list of Android codenames.
  - Added a 'widescreen' layout to the HTML report (e.g., 4K TV/KPI Dashboard).
  - Added 'Beaker', 'Brave', and 'Firefox Focus' to the list of browsers
  - Added command line option --user-name=username to avoid running GoAccess as
    root when outputting a real-time report.
  - Added 'DuckDuckGo' and 'MSNBot' browsers to the browsers.list.
  - Added 'facebookexternalhit' to the default crawler list.
  - Added German translation (DE).
  - Added Kubernetes Nginx Ingress Log Format to the default config file.
  - Added 'macOS Catalina' to the list of OSX codenames.
  - Added minor CSS updates to HTML report.
  - Added missing header '<sys/socket.h>' to fix FreeBSD build
  - Added new 'Edg' token to the list of browsers.
  - Added '--no-ip-validation' command line to disable client IP validation
  - Added '--persist' and '--restore' options to persist to disk and restore a
    dump from disk.
  - Added Portuguese translation (pt-BR)
  - Added Swedish translation (SV)
  - Added the ability to parse server cache status and a new panel to display
    those metrics.
  - Changed accumulated time to work by default on '--persist' and '--restore'.
  - Changed back how the hits and visitors percentage is calculated to be more
    intuitive.
  - Changed Geo Location panel display default to show only if database file is
    provided ('LIBMAXMINDDB').
  - Changed initial processing time from secs to HH:MM:SS in HTML output.
  - Changed '--max-items' for the static HTML report to allow no limit on
    output entries.
  - Changed required 'gettext' version to 0.19
  - Changed to ignore 'SIGPIPE' with 'SIG_IGN'
  - Changed version to 10.15 for 'macOS Catalina'.
  - Ensure proper escaping on default AWSELB log format.
  - Ensure valid requests counter is not affected on duplicate entries when
    restoring data.
  - Fixed issue preventing Ctrl-C (SIGINT) for the curses interface to stop the
    program.
  - Fixed issue where HTML report wouldn't update the tables when changing per
    page option.
  - Fixed issue where it wouldn't find either the user's or global config file.
  - Fixed issue where changing the number of items per page in the HTML report
    would not automatically refresh the tables.
  - Fixed issue where last updated label was not updated in real-time.
  - Fixed issue where overall date range wasn't showing the right start/end parse
    dates.
  - Fixed issue where tailing a file could potentially re-parse part of the log.
  - Fixed memory leak when fetching country/continent while using 'LIBMAXMINDDB'.
  - Fixed several '-Wcast-qual' warnings.
  - Fixed unwanted added characters to the HTML output.
  - Fixed websocket issue returning a 400 due to request header size.
  - Increased 'MAX_LINE_CONF' so a JSON string can be properly parsed from the
    config file.
  - Removed deprecated option '--geoip-city-data' from config file.
  - Removed unnecessary dependency from snapcraft.yaml.
  - Removed Vagrantfile per #1410
  - Removed some old browsers from the default curated list.
  - Replaced TokyoCabinet storage for a non-dependency in-memory persistent
    storage.
  - Updated Dockerfile.

Changes to GoAccess 1.3 - Friday, November 23, 2018

  - Added ability to store accumulated processing time into DB_GEN_STATS tcb
    file via '--accumulated-time' command line option.
  - Added additional Apache status codes to the list.
  - Added a few feed readers to the list.
  - Added 'Android 8 Oreo' to the list of OSs.
  - Added 'Android Pie 9' to the list of OSs.
  - Added --anonymize-ip command line option to anonymize ip addresses.
  - Added --browsers-file command line option to load a list of crawlers from a
    text file.
  - Added byte unit (PiB) to C formatter and refactored code.
  - Added byte unit (PiB) to JS formatter.
  - Added Chinese translation (i18n).
  - Added French translation (i18n).
  - Added '%h' date specifier to the allowed date character specifiers.
  - Added "HeadlessChrome" to the list of browsers.
  - Added --hide-referer command line option to hide referrers from report.
  - Added HTTP status code 429 (TOO MANY REQUESTS).
  - Added IGNORE_LEVEL_PANEL and IGNORE_LEVEL_REQ definitions.
  - Added Japanese translation (i18n).
  - Added macOS 10.14 Mojave to the list of OSs.
  - Added "Mastodon" user-agent to the list of crawlers/unix-like.
  - Added new fontawesome icons and use angle arrows in HTML paging.
  - Added new purple theme to HTML report and default to it.
  - Added --no-parsing-spinner command line option to switch off parsing
    spinner.
  - Added .ogv and ogg static file extension (ogg video, Ogg Vorbis audio).
  - Added OS X version numbers when outputting with --real-os.
  - Added parsing mechanism in an attempt capture more bots and to include
    unspecified bots/crawlers.
  - Added --pidfile command line option to the default config file.
  - Added Spanish translation (i18n).
  - Added SSL support for Docker goaccess build.
  - Added support to the WebSocket server for openssl-1.1*.
  - Added the ability to show/hide a chart per panel in the HTML report.
  - Added transparency to the navigation bar of the HTML report.
  - Added "WhatsApp" user-agent to the list of crawlers.
  - Changed default db folder so it adds the process id (PID). --db-path is
    required now when using --load-from-disk.
  - Changed Dockerfile to build from the current source.
  - Changed 'hits' to be right-aligned on TUI.
  - Changed to use faster slide animations on HTML report.
  - Changed wording from 'Bandwidth' to the proper term 'Tx. Amount'.
  - Ensure database filenames used by btree are less predictable.
  - Ensure HTML templates, CSS and JS files are minified when outputting
    report.
  - Ensure key phrases from Google are added even when https is used.
  - Ensure live report updates data & charts if tab/document has focus.
  - Ensure multiple 'Yandex' crawlers are properly parsed.
  - Ensure Safari has priority over most crawlers except the ones that are
    known to have it.
  - Ensure the request protocol on its own is properly parsed.
  - Ensure the right number of tests are performed against the given log.
  - Ensure user configuration is parsed first when available.
  - Ensure wss:// is used when connecting via HTTPS.
  - Ensure XFF parser takes into account escaped braces.
  - Fixed a regression where fifo-in/out would fail with ENXIO.
  - Fixed a regression where it would return EXIT_FAILURE on an empty log.
  - Fixed a (ssh) pipeline problem with fgetline()/fgets() when there is a race
    for data on stdin.
  - Fixed broken X-Forwarded-For (XFF) %~ specifier in certain parsing cases.
  - Fixed conf.filenames duplication problem if logs are via pipe.
  - Fixed float percent value on JSON/HTML output for locales using decimal comma.
  - Fixed issue where it was not possible to establish a Web Socket connection
    when attempting to parse and extract HTTP method.
  - Fixed issue where log formats with pipe delimiter were not properly parsed.
  - Fixed memory leak after config file path has been set (housekeeping).
  - Fixed memory leak when adding host to holder introduced in c052d1ea.
  - Fixed possible memory leak when hiding specific referrers.
  - Fixed several JS jshint warnings.
  - Fixed sudo installs on TravisCI.
  - Fixed UNDEFINED time range in HTML report when VISITORS panel was ignored.
  - Fixed unnecessary closing span tags from template.
  - Fixed use-after-free when two color items were found on color_list.

Changes to GoAccess 1.2 - Tuesday, March 07, 2017

  - Added a Dockerfile.
  - Added Amazon S3 bucket name as a VirtualHost (server block).
  - Added a replacement for GNU getline() to dynamically expand line buffer
    while maintaining real-time output.
  - Added --daemonize command line option to run GoAccess as daemon.
  - Added several improvements to the HTML report on small-screen devices.
  - Added option to the HTML report to auto-hide tables on small-screen
    devices.
  - Added --process-and-exit command line option to parse log and exit.
  - Added several feed readers to the list of browsers.
  - Added "-" single dash per convention to read from the standard input.
  - Added support for MaxMind GeoIP2.
  - Added the ability to read and follow from a pipe such as
    "tail -f access.log | goaccess -"
  - Added the ability to specify multiple logs as input sources, e.g.:
    "goaccess access.log access.log.1" while maintaining real-time output.
  - Added time unit (seconds) to the processed time label in the HTML/terminal
    output.
  - Added visitors' percent column to the terminal dashboard.
  - Changed D3 charts to dim Y-axis on mouseover.
  - Changed D3 charts to reflect HTML column sort.
  - Changed D3 charts to render only if within the viewport. This improves the
    overall real-time HTML performance.
  - Changed HTML report tables to render only if within the viewport.
  - Changed percentage calculation to be based on the total within each panel.
  - Ensure start/end dates are updated real-time in the HTML output.
  - Ensure "window.location.hostname" is used as the default WS server host.
    In most cases, this should avoid the need for specifying "--ws-url=host".
    Simply using "--real-time-html" should suffice.
  - Fixed issue on HTML report to avoid outputting scientific notation for all
    byte sizes.
  - Fixed integer overflow when calculating bar graph length on terminal
    output.
  - Fixed issue where global config file would override command line arguments.
  - Fixed issue where it wouldn't allow loading from disk without specifying a
    file when executed from the cron.
  - Fixed issue where parser couldn't read some X-Forwarded-For (XFF) formats.
    Note that this breaks compatibility with the original implementation of
    parsing XFF, but at the same time it gives much more flexibility on different
    formats.
  - Fixed issue where specifying fifo-in/out wouldn't allow HTML real-time
    output.
  - Fixed issue where the wrong number of parsed lines upon erroring out was
    displayed.
  - Fixed issue where the WebSocket server prevented to establish a connection
    with a client due to invalid UTF-8 sequences.
  - Fixed percent issue when calculating visitors field.
  - Updated the list of crawlers.

Changes to GoAccess 1.1.1 - Wednesday, November 23, 2016

  - Added data metric's "unique" count on each panel to the JSON/HTML outputs.
  - Changed D3 bar charts to use .rangeBands and avoid extra outer padding.
  - Fixed mouseover offset position issue on D3 bar charts.
  - Fixed possible heap overflow when an invalid status code was parsed and
    processed. This also ensures that only valid HTTP status codes are parsed
    >=100 or <= 599.
  - Fixed sluggish D3 chart re-rendering by changing how x-axis labels are
    displayed in the HTML report.

Changes to GoAccess 1.1 - Tuesday, November 08, 2016

  - Added a new layout to the HTML report and additional settings and changes.
  - Added --crawlers-only command line option to display crawlers/bots only.
  - Added --fifo-in and --fifo-out command line options to set websocket FIFO
    reader/writer.
  - Added --no-html-last-updated command line option.
  - Added --num-tests command line option.
  - Added --html-prefs command line option to to set default preferences for
    the HTML report.
  - Added "Amazon S3" Log Format to the list of predefined options.
  - Added "Android 7.1 Nougat" to the list of OSs.
  - Added "Android Marshmallow 6.0.1" to the list of OSs.
  - Added "Android Nougat 7.0" to the list of OSs.
  - Added "Feed Wrangler" to the list of feeds.
  - Added "Go-http-client" to the list of browsers.
  - Added "MicroMessenger" (WeChat) to the list of browsers.
  - Added "SemrushBot" to the list of crawlers.
  - Added "Remote User" panel to capture HTTP authentication requests. Use %e
    within the log-format variable to enable this panel.
  - Added tebibyte unit to the byte to string function converter.
  - Added the ability to parse reverse proxy logs that have multiple IPs. This
    adds the ability to parse the "X-Forwarded-For" field in a reverse proxy
    setup.
  - Added the ability to show which token didn't match log/date/time pattern.
    This also ensures that in the absence of data, its output is not treated as
    error but instead it produces an empty report.
  - Added the ability to specify a WebSocket protocol (ws|wss) through
    --ws-url.
  - Added the request query string to the W3C format.
  - Added TLS/SSL support to the HTML real-time report.
  - Changed browser classification for Google Cloud Clients.
  - Changed how "Darwin" OS was reported to display AppName instead.
  - Changed default W3C log format to use the URL path instead of full request.
  - Changed HTML default number of items on each table to 7.
  - Changed request parser to allow empty query strings.
  - Changed default HTML output theme to darkBlue.
  - Ensure every version of iOS is broken down under the OS panel.
  - Ensure latest JSON data is fast-forwarded when connection is opened.
    GoAccess now sends the latest JSON data to the client as soon as the
    WebSocket connection is opened.
  - Ensure localStorage is supported and enabled in the HTML report
  - Ensure unknown countries/continents are listed.
  - Fixed D3 chart width overflow issue on Edge.
  - Fixed integer to string key conversion for unique visitors. This fixes the
    issue where resulting keys would collide with existing keys and thus not
    keeping the right visitors count on certain panels.
  - Fixed memory leak when unable to URL decode %q specifier.
  - Fixed memory leak when unable to URL decode %U specifier.
  - Fixed month name abbreviation on app.js.
  - Fixed percentage integer overflow with large numbers on 32bits platforms.
  - Fixed percent calculation due to integer division rounding to zero.
  - Fixed possible code injection when outputting an HTML report.
  - Fixed segfault when using options -H or -M without an argument.
  - Removed timestamp from the HTML report title tag.

Changes to GoAccess 1.0.2 - Tuesday, July 05, 2016

  - Added minor changes to the HTML report stylesheet.
  - Added the ability to specify the WebSocket port within --ws-url.
  - Added the proper byte swap functions used by Sun Solaris.
  - Added the proper default --http-method/protocol values on the config file.
  - Changed bar transition to scale delay dynamically to the length of the
    dataset.
  - Fixed build issue on platforms lacking of open_memstream() by refactoring
    the JSON module to use its own memory buffer.
  - Fixed issue where the server wouldn't send cached buffer to slow clients.
  - Fixed OS X build check of ncursesw.
  - Implemented a throttle mechanism for slow clients to avoid caching too much
    data on the server-side.
  - Removed flickering on D3 line and bar chart redraw.

Changes to GoAccess 1.0.1 - Friday, June 17, 2016

  - Added Android version number along with the codename when using --real-os,
    e.g., "Lollipop 5.1".
  - Added some missing headers and function checks to configure.ac.
  - Fixed a regression where it wouldn't allow abbreviated date and time
    formats such as %F or %T.
  - Fixed build issues on systems running GLIBC older than 2.9, such as RHEL <= 5.
  - Fixed issue where it wouldn't send the whole buffer to a socket causing the
    real-time-html WebSocket server to progressively consume a lot more memory.
  - Fixed memory leak when using getline and follow mode enabled.
  - Fixed some buffer initialization issues on read_line() and
    perform_tail_follow().
  - Fixed uint types in sha1 files.

Changes to GoAccess 1.0 - Thursday, June 09, 2016

  - Added --enable-panel=<PANEL> command line option to display the given
    module.
  - Added --json-pretty-print command line option to output pretty json.
  - Added --log-format=<format> command-line shortcuts for standard log
    formats.
  - Added --origin command line option to match the origin WebSocket header.
  - Added --output=<file.[html|csv|json]> as a shortcut to --output-format.
  - Added a complete real-time functionality to the HTML output.
  - Added an option to set the max number of items to show per panel.
  - Added D3 Visualziations to the HTML dashboard.
  - Added metadata metrics to the each of the panels (JSON output)
  - Added option to specify time distribution specificity.
  - Added the ability to download a JSON file from the HTML report.
  - Added the ability to output multiple formats on a single log parse.
  - Added the ability to set the date specificity in hours.
  - Added the ability to sort all HTML tables on all panels.
  - Added the ability to specify a custom CSS and JS file to the HTML report.
  - Added user-agents to the JSON output per each host.
  - Added "Vivaldi" to the list of browsers.
  - Bootstrapify the HTML dashboard.
  - Changed configure.ac to use LDFLAGS instead of CFLAGS where applicable.
  - Changed default terminal color scheme to 256 Monokai if terminal supports 256 colors.
  - Changed GoAccess license to The MIT License (MIT)
  - Changed the visitors panel to display its dates continuously instead of top.
  - Default to 256 Monokai color scheme if terminal supports 256 colors.
  - Default to display HTTP method/protocol (if applicable).
  - Display the children's Max. T.S. as the parent's top Max. T.S.
  - Ensure the parent's Avg. T.S. displays parent's Cum. T.S. over parent's Hits.
  - Fixed color issue when switching from the color scheme dialog.
  - Fixed cross platform build issue when ncurses is built with and without
    termlib=tinfo.
  - Fixed curses header window issue where it wouldn't clear out on small
    window sizes.
  - Fixed issue where tail mode wouldn't parse full lines using getline().
  - Fixed minor background color issue when using ncurses 6.
  - Fixed possible division by zero when calculating percentage.
  - Fixed singly link list node removal.
  - Fixed still reachable memory leak on GeoIP cleanup (geoip legacy >= 1.4.7).
  - Fixed various Valgrind's still reachable memory leaks.
  - Removed -Wredundant-decls.

Changes to GoAccess 0.9.8 - Monday, February 29, 2016

  - Added a more complete list of static extensions to the config file.
  - Added "Android 6.0 Marshmallow" to the list of OSs.
  - Added --no-tab-scroll command line option to disable scroll through panels
    on TAB.
  - Added the first and last log dates to the overall statistics panel.
  - Ensure GoAccess links correctly against libtinfo.
  - Ensure static content is case-insensitive verified.
  - Fixed bandwidth overflow issue (numbers > 2GB on non-x86_64 arch).
  - Fixed broken HTML layout when html-method/protocol is missing in config file.
  - Refactored parsing and display of available modules/panels.

Changes to GoAccess 0.9.7 - Monday, December 21, 2015

  - Added "Squid native" log format to the config file.
  - Fixed integer overflow when getting total bandwidth using the on-disk
    storage.
  - Fixed issue where a timestamp was stored as date under the visitors panel.
  - Fixed issue where config dialog fields were not cleared out on select.
  - Fixed issue where "Virtual Hosts" menu item wasn't shown in the HTML sidebar.

Changes to GoAccess 0.9.6 - Tuesday, October 27, 2015

  - Added --dcf command line option to view the default config file path.
  - Added --ignore-status the ability to ignore parsing status codes.
  - Added "Darwin" to the list of OSs.
  - Fixed segfault when appending data to a log (follow) without virtualhosts.

Changes to GoAccess 0.9.5 - Thursday, October 22, 2015

  - Added major performance improvements to the default storage when parsing and
    storing data (~%44 less memory, ~37% faster).
  - Added the ability to parse virtual hosts and a new panel to display metrics
    per virtual host.
  - Added the ability to parse HTTP/2 requests.
  - Added the ability to use GNU getline() to parse full line requests.
  - Added the ability to output debug info if a log file is specified, even
    without --enable-debug.
  - Added OS X "El Capitan".
  - Added WebDav HTTP methods and HTTP status from RFC 2518 and  RFC 3253.
  - Fixed detection of some Googlebots.
  - Fixed issue where time served metrics were not shown when loading persisted
    data.
  - Fixed linker error on OSX: ld: library not found for -lrt.
  - Fixed percentage on the HTML output when excluding IPs.
  - Removed GLib dependency and refactored storage functionality. By removing
    this dependency, GoAccess is able to store data in a more efficient manner,
    for instance, it avoids storing integer data as void* (generic typing), thus
    greatly improving memory consumption for integers.

Changes to GoAccess 0.9.4 - Tuesday, September 08, 2015

  - Added --all-static-files command line option to parse static files
    containing a query string.
  - Added --invalid-requests command line option to log invalid requests to a file.
  - Added additional overall metric - total valid requests.
  - Added "%~" specifier to move forward through a log string until a non-space
    char is found.
  - Added the ability to parse native Squid access.log format.
  - Fixed a few issues in the configuration script.
  - Fixed inability to parse color due to a missing POSIX extension.
    "ERR:Invalid bg/fg color pairs"

Changes to GoAccess 0.9.3 - Wednesday, August 26, 2015

  - Added --no-column-names command line option to disable column name metrics.
  - Added a default color palette (Monokai) to the config file.
  - Added AWS Elastic Load Balancing to the list of predefined log/date/time
    formats.
  - Added CloudFlare status codes.
  - Added column headers for every enabled metric on each panel.
  - Added cumulative time served metric.
  - Added "DragonFly" BSD to the list of OSs.
  - Added maximum time served metric (slowest running requests).
  - Added "Slackbot" to the list of crawlers/browsers.
  - Added the ability to parse the query string specifier "%q" from a log file.
  - Added the ability to process logs incrementally.
  - Added the ability to set custom colors on the terminal output.
  - Disabled REFERRERS by default.
  - Ensure bandwidth metric is displayed only if %b specifier is parsed.
  - Fixed issue where the --sort-panel option wouldn't sort certain panels.
  - Fixed several compiler warnings.
  - Set predefined static files when no config file is used.
  - Updated "Windows 10" user agent from 6.4 (wrong) to 10.0.(actual)

Changes to GoAccess 0.9.2 - Monday, July 06, 2015

  - Added ability to fully parse browsers that contain spaces within a token.
  - Added multiple user agents to the list of browsers.
  - Added the ability to handle time served in milliseconds as a decimal number
    `%L`.
  - Added the ability to parse a timestamp in microseconds.
  - Added the ability to parse Google Cloud Storage access logs.
  - Added the ability to set a custom title and header in the HTML report.
  - Added "%x" as timestamp log-format specifier.
  - Ensure agents" hash table is destroyed upon exiting the program.
  - Ensure "Game Systems" are processed correctly.
  - Ensure visitors panel header is updated depending if crawlers are parsed or
    not.
  - Fixed issue where the date value was set as time value  in the config
    dialog.
  - Fixed memory leak in the hits metrics when using the in-memory storage
    (GLib).

Changes to GoAccess 0.9.1 - Tuesday, May 26, 2015

  - Added --hl-header command line option to highlight active panel.
  - Added "Applebot" to the list of web crawlers.
  - Added "Microsoft Edge" to the list of browsers.
  - Added additional Nginx-specific status codes.
  - Ensure dump_struct is used only if using __GLIBC__.
  - Ensure goaccess image has an alt attribute on the HTML output for valid
    HTML5.
  - Ensure the config file path is displayed when something goes wrong (FATAL).
  - Ensure there is a character indicator to see which panel is active.
  - Fixed Cygwin compile issue attempting to use -rdynamic.
  - Fixed issue where a single IP did not get excluded after an IP range.
  - Fixed issue where requests showed up in the wrong view even when
    --no-query-string was used.
  - Fixed issue where some browsers were not recognized or marked as "unknown".
  - Fixed memory leak when excluding an IP range.
  - Fixed overflows on sort comparison functions.
  - Fixed segfault when using on-disk storage and loading persisted data with -a.
  - Removed keyphrases menu item from HTML output.
  - Split iOS devices from Mac OS X.

Changes to GoAccess 0.9 - Thursday, March 19, 2015

  - Added --geoip-database command line option for GeoIP Country/City IPv6.
  - Added "Windows 10 (v6.4)" to the real windows user agents.
  - Added ability to double decode an HTTP referer and agent.
  - Added ability to sort views through the command line on initial load.
  - Added additional data values to the backtrace report.
  - Added additional graph to represent the visitors metric on the HTML output.
  - Added AM_PROG_CC_C_O to configure.ac
  - Added "Android Lollipop" to the list of operating systems.
  - Added "average time served" metric to all panels.
  - Added "bandwidth" metric to all panels.
  - Added command line option to disable summary metrics on the CSV output.
  - Added numeric formatting to the HTML output to improve readability.
  - Added request method specifier to the default W3C log format.
  - Added the ability to ignore parsing and displaying given panel(s).
  - Added the ability to ignore referer sites from being counted. A good case
    scenario is to ignore own domains. i.e., owndomain.tld. This also allows
    ignoring hosts using wildcards. For instance, *.mydomain.tld or www.mydomain.*
    or www?.mydomain.tld
  - Added time/hour distribution module. e.g., 00-23.
  - Added "visitors" metrics to all panels.
  - Changed AC_PREREQ macro version so it builds on old versions of autoconf.
  - Changed GEOIP database load to GEOIP_MEMORY_CACHE for faster lookups.
  - Changed maximum number of choices to display per panel to 366 from 300.
  - Ensure config file is read from home dir if unable to open it from
    %sysconfdir% path.
  - Fixed array overflows when exceeding MAX_* limits on command line options.
  - Fixed a SEGFAULT where sscanf could not handle special chars within the
    referer.
  - Fixed character encoding on geolocation output (ISO-8859 to UTF8).
  - Fixed issue on wild cards containing "?" at the end of the string.
  - Fixed issue where a "Nothing valid to process" error was triggered when the
    number of invalid hits was equal to the number of valid hits.
  - Fixed issue where outputting to a file left a zero-byte file in pwd.
  - Improved parsing of operating systems.
  - Refactored log parser so it allows with ease the addition of new modules.
    This also attempts to decouple the core functionality from the rendering
    functions. It also gives the flexibility to add children metrics to root
    metrics for any module. e.g., Request A was visited by IP1, IP2, IP3, etc.
  - Restyled HTML output.

Changes to GoAccess 0.8.5 - Sunday, September 14, 2014

  - Fixed SEGFAULT when parsing a malformed request that doesn't have HTTP
    status.

Changes to GoAccess 0.8.4 - Monday, September 08, 2014

  - Added --444-as-404 command line option to handle nginx non-standard status
    code 444 as 404.
  - Added --4xx-to-unique-count command line option to count client errors (4xx)
    to the unique visitors count.  Now by default it omits client errors (4xx)
    from being added to the unique visitors count as they are probably not welcomed
    visitors. 4xx errors are always counted in panels other than visitors, OS &
    browsers.
  - Added and updated operating systems, and browsers.
  - Added excluded IP hits count to the general statistics panel on all reports.
  - Added HTTP nonstandard code "444" to the status code list.
  - Fixed compile error due to missing include <sys/types.h> for type
    off_t (gcc 4.1).
  - Fixed issue when excluding IPv4/v6 ranges.
  - Removed request status field restriction. This allows parsing logs that
    contain only a valid date, IPv4/6 and host.

Changes to GoAccess 0.8.3 - Monday, July 28, 2014

  - Fixed SEGFAULT when parsing a CLF log format and using --ignore-crawlers.
  - Fixed parsing conflict between some Opera browsers and Chrome.
  - Fixed parsing of several feed readers that are Firefox/Safari-based.
  - Fixed Steam detection.
  - Added Huawei to the browser's list and removed it from the OS's list.

Changes to GoAccess 0.8.2 - Monday, July 20, 2014

  - Added --version command line option.
  - Added --ignore-crawlers command line option to ignore crawlers.
  - Added ability to parse dates containing whitespaces in between,
    e.g., "Jul 15 20:13:59" (syslog format).
  - Added a variety of browsers, game systems, feed readers, and podcasts.
  - Added missing up/down arrows to the help section.
  - Added the ability to ignore multiple IPv4/v6 and IP ranges.
  - Added the PATCH method according to RFC 5789.
  - Fixed GeoLocation percent issue for the JSON, CSV and HTML outputs.
  - Fixed memory leak when excluding one or multiple IPs.

Changes to GoAccess 0.8.1 - Monday, June 16, 2014

  - Added ability to add/remove static files by extension through the config
    file.
  - Added ability to print backtrace on segmentation fault.
  - Escaped JSON strings correctly according to [RFC4627].
  - Fixed encoding issue when extracting keyphrases for some HTTP referrers.
  - Fixed issue where HTML bar graphs were not shown due to numeric locale.
  - Fixed issue with URIs containing "\r?\n" thus breaking the corresponding
    output.
  - Make sure request string is URL decoded on all outputs.

Changes to GoAccess 0.8 - Tuesday, May 20, 2014

  - Added APT-HTTP to the list of browsers.
  - Added data persistence and ability to load data from disk.
  - Added IE11 to the list of browsers.
  - Added IEMobile to the list of browsers.
  - Added multiple command line options.
  - Added Nagios check_http to the list of browsers.
  - Added parsing progress metrics - total requests / requests per second.
  - Added the ability to parse a GeoLiteCity.dat to get the city given an IPv4.
  - Changed the way the configuration file is parsed. This will parse all
    configuration options under ~/.goaccessrc or the specified config file and
    will feed getopt_long with the extracted key/value pairs. This also allows the
    ability to have comments on the config file which won't be overwritten.
  - Ensure autoconf determines the location of ncurses headers.
  - Fixed issue where geo_location_data was NULL.
  - Fixed issue where GoAccess did not run without a tty allocated to it.
  - Fixed potential memory leak on --log-file realpath().
  - Fixed Solaris build errors.
  - Implemented an on-memory hash database using Tokyo Cabinet. This
    implementation allows GoAccess not to rely on GLib's hash table if one is
    needed.
  - Implemented large file support using an on-disk B+ Tree database. This
    implementation allows GoAccess not to hold everything in memory but instead
    it uses an on-disk B+ Tree database.
  - Trimmed leading and trailing whitespaces from keyphrases module.

Changes to GoAccess 0.7.1 - Monday, February 17, 2014

  - Added --no-color command line option to turn off color output.
  - Added --real-os command line option to get real OS names, e.g.,
    "Android, Windows, Mac".
  - Added ability to log debug messages to a file.
  - Added ability to parse tab-separated log format strings.
  - Added ability to support terminals without colors.
  - Added command line option to append HTTP method to request.
  - Added command line option to append HTTP protocol to request.
  - Added long options to command-line.
  - Added missing "Win 9x 4.90" (Windows Me) user-agent.
  - Added missing Windows RT user-agent.
  - Ensure mouse click does not reset expanded module if it is the same.
  - Fixed Amazon CloudFront tab-separated log format.
  - Fixed "FreeBSD style" ncursesw built into system.
  - Fixed HTML report issue where data cell would not wrap.
  - Fixed issue when isatty() could not find a valid file descriptor.
  - Fixed SymbianOS user-agent and retrieve its version.

Changes to GoAccess 0.7 - Monday, December 15, 2013

  - Added a command line option to ignore request query strings.
  - Added additional compiler flags & fixed several warnings.
  - Added additional static file extensions.
  - Added country per IP to HOSTS module (HTML & JSON).
  - Added DEBUG mode to Makefile & -O2 to default release.
  - Added GEOLOCATION report to all outputs - includes continents/countries.
  - Added IP resolver to HTML and JSON output.
  - Added module numbers to each module header.
  - Added the ability to output JSON and CSV.
  - Added Windows NT 6.3 (Win 8.1) to the list.
  - Fixed buffer overflow issue with realpath.
  - New HTML report - HTML5 + CSS styles.
  - Properly split request line into the three request modules.

Changes to GoAccess 0.6.1 - Monday, October 07, 2013

  - Added active module indication by name.
  - Added additional crawlers to the list.
  - Added custom configuration file option.
  - Added human-readable string when unable to open log.
  - Added missing include when compiling on OSX 10.6.
  - Added optional mouse support to the main dashboard.
  - Added the ability to select active module by number (keys).
  - Added the rest of HTTP methods according to RFC2616.
  - Changed referring site sscanf format to process multiple URLs.
  - Changed the default color scheme to monochrome.
  - Fixed issue where %T was not processing floating-point numbers.
  - Fixed percentage issue for browsers and os modules.
  - Fixed SIGSEGV when reading from stdin to stdout.
  - Improved performance when expanding a module.
  - Reduced memory consumption by decreasing number of dns threads.
  - Removed ^UP/^DOWN due to a key mapping conflict.

Changes to GoAccess 0.6 - Monday, July 15, 2013

  - Added a bunch of minor fixes and changes.
  - Added and updated list of browsers and operating systems.
  - Added a predefined log format/date for the Amazon CloudFront (Download
    Distribution).
  - Added parsing/processing indicators.
  - Added the ability to independently sort each module.
  - Added the ability to search across the whole dashboard with the option to
    use regular expressions.
  - Config window now accepts [ENTER] to continue or F10.
  - Fixed issue where Opera +15 was identified as Chrome.
  - Implemented the ability to parse the time taken to serve the request, in
    microseconds and seconds.
  - Improved memory usage and better performance in general.
  - Moved away from the original pop-up UI to a new expandable dashboard
    allowing data to be processed in real-time.
  - Sanitized HTML output with html entities for special chars.
  - Updated the hosts module so it shows the reverse DNS as a sub node.

Changes to GoAccess 0.5 - Monday, June 04, 2012

  - Added ability to output a full stats report to a file.
  - Added a key shortcut to scroll top/bottom.
  - Added a new include sys/socket.h - BSD
  - Added support for IPv6
  - Added the ability to parse a custom format string.
  - Fixed google cache key-phrases.
  - Fixed issue on empty Google query strings.
  - Fixed issue on Opera agents where version was not recognized correctly.
  - Fixed other minor fixes and changes.

Changes to GoAccess 0.4.2 - Monday, January 03, 2011

  - Added UTF-8 support. Now it should handle properly wide-character/UTF-8.
    Run ./configure --enable-utf8
  - Fixed a minor bug when adding monthly totals on visitors subwin.
  - Removed -lrt since GoAccess does not link to librt. (OS X doesn't include
    librt)

Changes to GoAccess 0.4.1 - Monday, December 13, 2010

  - Added more flexibility when resizing the terminal. Should work fine with
    the standard 80x24.
  - Added the ability to pass a flag to ./configure so GeoIP can be enabled if
    needed.
  - Implemented a pipeline from stdin, so the input doesn't have to be only a
    file.

Changes to GoAccess 0.4 - Tuesday, November 30, 2010

  - Added graphs to the unique_visitors subwin.
  - Implemented bandwidth per day, and host.
  - Implemented list of agents for specific hosts.
  - Rewrote hash tables iterative code to avoid the use of GHashTableIter, this
    way it works with all GLib > 2.0.0.
  - Various bug fixes and code cleanups (mainly in the subwin modules).

Changes to GoAccess 0.3.3 - Monday, September 27, 2010

  - Changed tarball's filename.
  - Fixed a request size parsing issue. Due to malformed syntax on the HTTP
    protocol, bandwidth was reset to 0. Ex. "HEAD /" 400 20392
  - Fixed a segfault when goaccess was executed without any options but with an
    additional unknown argument.

Changes to GoAccess 0.3.2 - Thursday, September 09, 2010

  - Fixed an agent parsing issue. As a result, operating systems were not
    properly counted.

Changes to GoAccess 0.3.1 - Friday, September 03, 2010

  - Added a color scheme implementation

Changes to GoAccess 0.3 - Sunday, August 29, 2010

  - Added a counter for total requests since initial parse was implemented
  - Added a more detailed and comprehensive browser and os report
  - Added bandwidth details for requested files
  - Added percentage details on modules 2, 3, 4, 5, 10, 11
  - Code cleanups
  - Fixed a potential segmentation fault when resizing main window
  - Fixed a segmentation fault on pop-up window search if haystack was null
  - Fixed invalid entries when parsing status codes
  - Implemented a real support for LFS - Handles files larger than 2 GiB on
    32-bit systems
  - Implemented support for "vhost_combined" log format
  - Changed position of data/graphs depending on # of hits

Changes to GoAccess 0.2 - Sunday, July 25, 2010

  - Added a keyphrases report coming from Google search engine. This includes,
    raw, cache, and translation queries.
  - Fixed a memory leak when invalid entries were parsed
  - Fixed a potential buffer overflow.
  - Implemented real-time statistics (RTS). Data will be appended as the log
    file grows. Equivalent to "tail -f" on Unix systems
  - Implemented screen resize functionality
  - Simplified creation of the "unique visitors" hash-key.
  - Simplified the "process_unique_data" function
  - Various small speed increases & code cleanup

Changes to GoAccess 0.1.2 - Monday, July 12, 2010

  - Fixed a segmentation fault when parsing logs with unusual request type. Ex.
    "GET HTTP/1.1 HTTP/1.1"

Changes to GoAccess 0.1.1 - Saturday, July 10, 2010

  - Added an enhanced error handling
  - Added an extra macro on configure.ac to check against GHashTableIter.
    ./configure might not check for glib 2.16 that introduced "GHashTableIter".
  - Added Glibc LFS
  - Cleaned up code a little bit
  - Fixed a segmentation fault when displaying the help text on x86_64.
  - Fixed assignments in conditions. In case the assignment is actually intended
    put extra parenthesis around it. This will shut GCC (and others) up.
  - Fixed casts associated with "g_hash_table_iter_next".
  - Fixed comparison between signed and unsigned integer types.
  - Fixed function declarations.
  - Fixed includes.
  - Fixed two format strings. (If the error was ever triggered, it'd most
    likely lead to a segfault)

Changes to GoAccess 0.1 - Tuesday, July 06, 2010

  - Initial release 0.1


================================================
FILE: DOCKER.md
================================================

# Docker image features

* This command uses the language set for this system. If that does not support it will be output in English. [**Supported Language**](https://github.com/allinurl/goaccess/raw/master/po/LINGUAS)

* This image supports building on the ARM architecture (e.g. Raspberry Pi)

* Do you want to change the timezone? Use the `-e` option to pass the time-zone setting to Docker. (e.g. `-e TZ="America/New_York"`)

* The container is built with geo-location support (see [the manual](https://goaccess.io/man#options)). To enable the respective panel, mount the geolocation database using `-v /path/to/GeoLite2-City.mmdb:/GeoLite2-City.mmdb` and specify `--geoip-database /GeoLite2-City.mmdb` when running GoAccess.

* If you made changes to the config file after building the image, you don't have to rebuild from scratch. Simply restart the container:

```
    docker restart goaccess
```

* If you had already run the container, you may have to stop and remove it first:

```
    docker stop goaccess
    docker rm goaccess
```

* The container and image can be completely removed as follows:

```
    docker stop goaccess
    docker rm goaccess
    docker rmi allinurl/goaccess
```


================================================
FILE: Dockerfile
================================================
# Build stage
FROM alpine:3.20 AS builds
RUN apk add --no-cache \
    autoconf \
    automake \
    build-base \
    clang \
    gettext-dev \
    libmaxminddb-dev \
    openssl-dev \
    linux-headers \
    ncurses-dev \
    pkgconf \
    tzdata

# GoAccess
COPY . /goaccess
WORKDIR /goaccess
RUN autoreconf -fiv && rm -rf autom4te.cache
RUN CC="clang" CFLAGS="-O3" LIBS="$(pkg-config --libs openssl)" ./configure --prefix=/usr --enable-utf8 --with-openssl --enable-geoip=mmdb
RUN make -j$(nproc) && make DESTDIR=/dist install
# Check dynamic dependencies
RUN ldd /dist/usr/bin/goaccess && echo "Dependencies checked"

# Runtime stage
FROM alpine:3.20
RUN apk add --no-cache \
    gettext-libs \
    libmaxminddb \
    ncurses-libs \
    openssl \
    tzdata
# Copy GoAccess binary and assets
COPY --from=builds /dist/usr/bin/goaccess /usr/bin/goaccess
COPY --from=builds /dist/usr/share /usr/share
COPY --from=builds /usr/share/zoneinfo /usr/share/zoneinfo
# Set up volume and port
VOLUME /var/www/goaccess
EXPOSE 7890
ENTRYPOINT ["/usr/bin/goaccess"]
CMD ["--help"]


================================================
FILE: Dockerfile.debian-12
================================================
# Used to have all compile dependencies isolated in a container image.
FROM debian:12

RUN apt update -qqq
RUN apt install -y \
    libncurses-dev \
    libssl-dev \
    libmaxminddb-dev \
    build-essential \
    autoconf \
    gettext \
    autopoint

# GoAccess
WORKDIR /goaccess

ENTRYPOINT ["./build-dynamic.sh"]


================================================
FILE: Makefile.am
================================================
#AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = goaccess
AUTOMAKE_OPTIONS = subdir-objects

dist_noinst_DATA =                 \
  resources/tpls.html              \
  resources/css/app.css            \
  resources/css/bootstrap.min.css  \
  resources/css/fa.min.css         \
  resources/js/app.js              \
  resources/js/charts.js           \
  resources/countries-110m.json    \
  resources/cities-10m.json        \
  resources/js/d3.v7.min.js        \
  resources/js/topojson.v3.min.js  \
  resources/js/hogan.min.js

noinst_PROGRAMS = bin2c
bin2c_SOURCES = src/bin2c.c

BUILT_SOURCES =       \
  src/tpls.h          \
  src/bootstrapcss.h  \
  src/facss.h         \
  src/appcss.h        \
  src/d3js.h          \
  src/topojsonjs.h    \
  src/hoganjs.h       \
  src/countries110m.h \
  src/cities10m.h     \
  src/chartsjs.h      \
  src/appjs.h

CLEANFILES =                          \
  src/tpls.h                          \
  src/bootstrapcss.h                  \
  src/facss.h                         \
  src/appcss.h                        \
  src/d3js.h                          \
  src/topojsonjs.h                    \
  src/hoganjs.h                       \
  src/countries110m.h                 \
  src/cities10m.h                     \
  src/chartsjs.h                      \
  src/appjs.h                         \
  resources/tpls.html.tmp             \
  resources/countries-110m.json.tmp   \
  resources/cities-10m.json.tmp       \
  resources/css/bootstrap.min.css.tmp \
  resources/css/fa.min.css.tmp        \
  resources/css/app.css.tmp           \
  resources/js/d3.v7.min.js.tmp       \
  resources/js/topojson.v3.min.js.tmp \
  resources/js/hogan.min.js.tmp       \
  resources/js/charts.js.tmp          \
  resources/js/app.js.tmp

# Tpls
src/tpls.h: bin2c$(EXEEXT) $(srcdir)/resources/tpls.html
if HAS_SEDTR
	cat $(srcdir)/resources/tpls.html | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > $(srcdir)/resources/tpls.html.tmp
	./bin2c $(srcdir)/resources/tpls.html.tmp src/tpls.h tpls
else
	./bin2c $(srcdir)/resources/tpls.html src/tpls.h tpls
endif
# countries.json
src/countries110m.h: bin2c$(EXEEXT) $(srcdir)/resources/countries-110m.json
if HAS_SEDTR
	cat $(srcdir)/resources/countries-110m.json | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > $(srcdir)/resources/countries-110m.json.tmp
	./bin2c $(srcdir)/resources/countries-110m.json.tmp src/countries110m.h countries_json
else
	./bin2c $(srcdir)/resources/countries-110m.json src/countries110m.h countries_json
endif
# cities.json
src/cities10m.h: bin2c$(EXEEXT) $(srcdir)/resources/cities-10m.json
if HAS_SEDTR
	cat $(srcdir)/resources/cities-10m.json | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > $(srcdir)/resources/cities-10m.json.tmp
	./bin2c $(srcdir)/resources/cities-10m.json.tmp src/cities10m.h cities_json
else
	./bin2c $(srcdir)/resources/cities-10m.json src/cities10m.h cities_json
endif
# Bootstrap
src/bootstrapcss.h: bin2c$(EXEEXT) $(srcdir)/resources/css/bootstrap.min.css
if HAS_SEDTR
	cat $(srcdir)/resources/css/bootstrap.min.css | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > $(srcdir)/resources/css/bootstrap.min.css.tmp
	./bin2c $(srcdir)/resources/css/bootstrap.min.css.tmp src/bootstrapcss.h bootstrap_css
else
	./bin2c $(srcdir)/resources/css/bootstrap.min.css src/bootstrapcss.h bootstrap_css
endif
# Font Awesome
src/facss.h: bin2c$(EXEEXT) $(srcdir)/resources/css/fa.min.css
if HAS_SEDTR
	cat $(srcdir)/resources/css/fa.min.css | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > $(srcdir)/resources/css/fa.min.css.tmp
	./bin2c $(srcdir)/resources/css/fa.min.css.tmp src/facss.h fa_css
else
	./bin2c $(srcdir)/resources/css/fa.min.css src/facss.h fa_css
endif
# App.css
src/appcss.h: bin2c$(EXEEXT) $(srcdir)/resources/css/app.css
if HAS_SEDTR
	cat $(srcdir)/resources/css/app.css | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > $(srcdir)/resources/css/app.css.tmp
	./bin2c $(srcdir)/resources/css/app.css.tmp src/appcss.h app_css
else
	./bin2c $(srcdir)/resources/css/app.css src/appcss.h app_css
endif
# D3.js
src/d3js.h: bin2c$(EXEEXT) $(srcdir)/resources/js/d3.v7.min.js
if HAS_SEDTR
	cat $(srcdir)/resources/js/d3.v7.min.js | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > $(srcdir)/resources/js/d3.v7.min.js.tmp
	./bin2c $(srcdir)/resources/js/d3.v7.min.js.tmp src/d3js.h d3_js
else
	./bin2c $(srcdir)/resources/js/d3.v7.min.js src/d3js.h d3_js
endif
# topojson.js
src/topojsonjs.h: bin2c$(EXEEXT) $(srcdir)/resources/js/topojson.v3.min.js
if HAS_SEDTR
	cat $(srcdir)/resources/js/topojson.v3.min.js | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > $(srcdir)/resources/js/topojson.v3.min.js.tmp
	./bin2c $(srcdir)/resources/js/topojson.v3.min.js.tmp src/topojsonjs.h topojson_js
else
	./bin2c $(srcdir)/resources/js/topojson.v3.min.js src/topojsonjs.h topojson_js
endif
# Hogan.js
src/hoganjs.h: bin2c$(EXEEXT) $(srcdir)/resources/js/hogan.min.js
if HAS_SEDTR
	cat $(srcdir)/resources/js/hogan.min.js | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > $(srcdir)/resources/js/hogan.min.js.tmp
	./bin2c $(srcdir)/resources/js/hogan.min.js.tmp src/hoganjs.h hogan_js
else
	./bin2c $(srcdir)/resources/js/hogan.min.js src/hoganjs.h hogan_js
endif
# Charts.js
src/chartsjs.h: bin2c$(EXEEXT) $(srcdir)/resources/js/charts.js
if HAS_SEDTR
	cat $(srcdir)/resources/js/charts.js | sed -E "s@(,|;)[[:space:]]*//..*@\1@g" | sed -E "s@^[[:space:]]*//..*@@g" | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > $(srcdir)/resources/js/charts.js.tmp
	./bin2c $(srcdir)/resources/js/charts.js.tmp src/chartsjs.h charts_js
else
	./bin2c $(srcdir)/resources/js/charts.js src/chartsjs.h charts_js
endif
if DEBUG
	./bin2c $(srcdir)/resources/js/charts.js src/chartsjs.h charts_js
endif
# App.js
src/appjs.h: bin2c$(EXEEXT) $(srcdir)/resources/js/app.js
if HAS_SEDTR
	cat $(srcdir)/resources/js/app.js | sed -E "s@(,|;)[[:space:]]*//..*@\1@g" | sed -E "s@^[[:space:]]*//..*@@g" | sed "s/^[[:space:]]*//" | sed "/^$$/d" | tr -d "\r\n" > $(srcdir)/resources/js/app.js.tmp
	./bin2c $(srcdir)/resources/js/app.js.tmp src/appjs.h app_js
else
	./bin2c $(srcdir)/resources/js/app.js src/appjs.h app_js
endif
if DEBUG
	./bin2c $(srcdir)/resources/js/app.js src/appjs.h app_js
endif

confdir = $(sysconfdir)/goaccess
dist_conf_DATA = config/goaccess.conf
dist_conf_DATA += config/browsers.list
dist_conf_DATA += config/podcast.list

goaccess_SOURCES = \
   src/base64.c        \
   src/base64.h        \
   src/browsers.c      \
   src/browsers.h      \
   src/color.c         \
   src/color.h         \
   src/commons.c       \
   src/commons.h       \
   src/csv.c           \
   src/csv.h           \
   src/dialogs.c       \
   src/dialogs.h       \
   src/error.c         \
   src/error.h         \
   src/fileio.c        \
   src/fileio.h        \
   src/gchart.c        \
   src/gchart.h        \
   src/gdashboard.c    \
   src/gdashboard.h    \
   src/gdns.c          \
   src/gdns.h          \
   src/gholder.c       \
   src/gholder.h       \
   src/gkhash.c        \
   src/gkhash.h        \
   src/gkmhash.c       \
   src/gkmhash.h       \
   src/gmenu.c         \
   src/gmenu.h         \
   src/goaccess.c      \
   src/goaccess.h      \
   src/gslist.c        \
   src/gslist.h        \
   src/gstorage.c      \
   src/gstorage.h      \
   src/gwsocket.c      \
   src/gwsocket.h      \
   src/json.c          \
   src/json.h          \
   src/khash.h         \
   src/labels.h        \
   src/opesys.c        \
   src/opesys.h        \
   src/options.c       \
   src/options.h       \
   src/output.c        \
   src/output.h        \
   src/parser.c        \
   src/parser.h        \
   src/persistence.c   \
   src/persistence.h   \
   src/pdjson.c        \
   src/pdjson.h        \
   src/settings.c      \
   src/settings.h      \
   src/sort.c          \
   src/sort.h          \
   src/tpl.c           \
   src/tpl.h           \
   src/ui.c            \
   src/ui.h            \
   src/util.c          \
   src/util.h          \
   src/websocket.c     \
   src/websocket.h     \
   src/xmalloc.c       \
   src/xmalloc.h

if WITH_SSL
goaccess_SOURCES +=  \
   src/wsauth.c      \
   src/wsauth.h
endif

if USE_SHA1
goaccess_SOURCES +=  \
   src/sha1.c        \
   src/sha1.h
endif

if USE_MMAP
goaccess_SOURCES +=  \
   src/win/mman.h    \
   src/win/mmap.c
endif

if GEOIP_LEGACY
goaccess_SOURCES +=  \
  src/geoip1.c       \
  src/geoip1.h
endif

if GEOIP_MMDB
goaccess_SOURCES +=  \
   src/geoip2.c      \
   src/geoip1.h
endif

if DEBUG
AM_CFLAGS = -DDEBUG -O0 -DSYSCONFDIR=\"$(sysconfdir)\"
else
AM_CFLAGS = -O2 -DSYSCONFDIR=\"$(sysconfdir)\"
endif

if WITH_RDYNAMIC
AM_LDFLAGS = -rdynamic
endif

if WITH_ZLIB
AM_LDFLAGS = -lz
endif

goaccess_LDADD = -lm

AM_CFLAGS += -Wall -Wextra -Wnested-externs -Wformat=2 -g
AM_CFLAGS += -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations
AM_CFLAGS += -Wwrite-strings -Wshadow -Wpointer-arith -Wsign-compare
AM_CFLAGS += -Wbad-function-cast -Wcast-align
AM_CFLAGS += -Wdeclaration-after-statement -Wshadow -Wold-style-definition

if WITH_ASAN
AM_CFLAGS += -fsanitize=address
endif

dist_man_MANS = goaccess.1

SUBDIRS = po

ACLOCAL_AMFLAGS = -I m4

DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@

EXTRA_DIST = config.rpath


================================================
FILE: NEWS
================================================
Copyright (C) 2009-2026
Gerardo Orellana <goaccess@prosoftcorp.com>

* Version history:
    - 1.10.1 [Saturday, Feb 14, 2026]
        . GoAccess 1.10.1 Released. See ChangeLog for new features/bug-fixes.
    - 1.10 [Tuesday, Feb 10, 2026]
        . GoAccess 1.10 Released. See ChangeLog for new features/bug-fixes.
    - 1.9.4 [Monday, Mar 31, 2025]
        . GoAccess 1.9.4 Released. See ChangeLog for new features/bug-fixes.
    - 1.9.3 [Friday, May 31, 2024]
        . GoAccess 1.9.3 Released. See ChangeLog for new features/bug-fixes.
    - 1.9.2 [Friday, April 12, 2024]
        . GoAccess 1.9.2 Released. See ChangeLog for new features/bug-fixes.
    - 1.9.1 [Tuesday, February 05, 2024]
        . GoAccess 1.9.1 Released. See ChangeLog for new features/bug-fixes.
    - 1.9 [Tuesday, January 30, 2024]
        . GoAccess 1.9 Released. See ChangeLog for new features/bug-fixes.
    - 1.8.1 [Tuesday, October 31, 2023]
        . GoAccess 1.8.1 Released. See ChangeLog for new features/bug-fixes.
    - 1.8 [Saturday, September 30, 2023]
        . GoAccess 1.8 Released. See ChangeLog for new features/bug-fixes.
    - 1.7.2 [Friday, March 31, 2023]
        . GoAccess 1.7.2 Released. See ChangeLog for new features/bug-fixes.
    - 1.7.1 [Tuesday, February 28, 2023]
        . GoAccess 1.7.1 Released. See ChangeLog for new features/bug-fixes.
    - 1.7 [Saturday, December 31 , 2022]
        . GoAccess 1.7 Released. See ChangeLog for new features/bug-fixes.
    - 1.6.5 [Monday, October 31 , 2022]
        . GoAccess 1.6.5 Released. See ChangeLog for new features/bug-fixes.
    - 1.6.4 [Friday, September 30 , 2022]
        . GoAccess 1.6.4 Released. See ChangeLog for new features/bug-fixes.
    - 1.6.3 [Thursday, August 31 , 2022]
        . GoAccess 1.6.3 Released. See ChangeLog for new features/bug-fixes.
    - 1.6.2 [Thursday, July 14 , 2022]
        . GoAccess 1.6.2 Released. See ChangeLog for new features/bug-fixes.
    - 1.6.1 [Thursday, June 30 , 2022]
        . GoAccess 1.6.1 Released. See ChangeLog for new features/bug-fixes.
    - 1.6 [Tuesday, May 31 , 2022]
        . GoAccess 1.6 Released. See ChangeLog for new features/bug-fixes.
    - 1.5.7 [Thursday, April 28 , 2022]
        . GoAccess 1.5.7 Released. See ChangeLog for new features/bug-fixes.
    - 1.5.6 [Wednesday, March 30, 2022]
        . GoAccess 1.5.6 Released. See ChangeLog for new features/bug-fixes.
    - 1.5.5 [Monday, January 31, 2022]
        . GoAccess 1.5.5 Released. See ChangeLog for new features/bug-fixes.
    - 1.5.4 [Saturday, December 25, 2021]
        . GoAccess 1.5.4 Released. See ChangeLog for new features/bug-fixes.
    - 1.5.3 [Thursday, November 25, 2021]
        . GoAccess 1.5.3 Released. See ChangeLog for new features/bug-fixes.
    - 1.5.2 [Tuesday, Sep 28, 2021]
        . GoAccess 1.5.2 Released. See ChangeLog for new features/bug-fixes.
    - 1.5.1 [Wednesday, Jun 30, 2021]
        . GoAccess 1.5.1 Released. See ChangeLog for new features/bug-fixes.
    - 1.5 [Wednesday, May 26, 2021]
        . GoAccess 1.5 Released. See ChangeLog for new features/bug-fixes.
    - 1.4.6 [Sunday, February 28, 2021]
        . GoAccess 1.4.6 Released. See ChangeLog for new features/bug-fixes.
    - 1.4.5 [Tuesday, January 26, 2021]
        . GoAccess 1.4.5 Released. See ChangeLog for new features/bug-fixes.
    - 1.4.4 [Monday, January 25, 2021]
        . GoAccess 1.4.4 Released. See ChangeLog for new features/bug-fixes.
    - 1.4.3 [Friday, December 04, 2020]
        . GoAccess 1.4.3 Released. See ChangeLog for new features/bug-fixes.
    - 1.4.2 [Monday, November 16, 2020]
        . GoAccess 1.4.2 Released. See ChangeLog for new features/bug-fixes.
    - 1.4.1 [Monday, November 09, 2020]
        . GoAccess 1.4.1 Released. See ChangeLog for new features/bug-fixes.
    - 1.4 [Monday, May 18, 2020]
        . GoAccess 1.4 Released. See ChangeLog for new features/bug-fixes.
    - 1.3 [Friday, November 23, 2018]
        . GoAccess 1.3 Released. See ChangeLog for new features/bug-fixes.
    - 1.2  [Tuesday, March 07, 2017]
        . GoAccess 1.2 Released. See ChangeLog for new features/bug-fixes.
    - 1.1.1  [Wednesday, November 23, 2016]
        . GoAccess 1.1.1 Released. See ChangeLog for new features/bug-fixes.
    - 1.1  [Tuesday, November 08, 2016]
        . GoAccess 1.1 Released. See ChangeLog for new features/bug-fixes.
    - 1.0.2  [Tuesday, July 05, 2016]
        . GoAccess 1.0.2 Released. See ChangeLog for new features/bug-fixes.
    - 1.0.1  [Friday, June 17, 2016]
        . GoAccess 1.0.1 Released. See ChangeLog for new features/bug-fixes.
    - 1.0  [Thursday, June 09, 2016]
        . GoAccess 1.0 Released. See ChangeLog for new features/bug-fixes.
    - 0.9.8  [Monday, February 29, 2016]
        . GoAccess 0.9.8 Released. See ChangeLog for new features/bug-fixes.
    - 0.9.7  [Monday, December 21, 2015]
        . GoAccess 0.9.7 Released. See ChangeLog for new features/bug-fixes.
    - 0.9.6  [Tuesday, October 27, 2015]
        . GoAccess 0.9.6 Released. See ChangeLog for new features/bug-fixes.
    - 0.9.5  [Thursday, October 22, 2015]
        . GoAccess 0.9.5 Released. See ChangeLog for new features/bug-fixes.
    - 0.9.4  [Tuesday, September 08 , 2015]
        . GoAccess 0.9.4 Released. See ChangeLog for new features/bug-fixes.
    - 0.9.3  [Wednesday, August 28, 2015]
        . GoAccess 0.9.3 Released. See ChangeLog for new features/bug-fixes.
    - 0.9.2  [Monday, July 06, 2015]
        . GoAccess 0.9.2 Released. See ChangeLog for new features/bug-fixes.
    - 0.9.1  [Tuesday, May 26, 2015]
        . GoAccess 0.9.1 Released. See ChangeLog for new features/bug-fixes.
    - 0.9  [Thursday, March 19, 2015]
        . GoAccess 0.9 Released. See ChangeLog for new features/bug-fixes.
    - 0.8.5  [Sunday, September 14, 2014]
        . GoAccess 0.8.5 Released. See ChangeLog for new features/bug-fixes.
    - 0.8.4  [Monday, September 08, 2014]
        . GoAccess 0.8.4 Released. See ChangeLog for new features/bug-fixes.
    - 0.8.3  [Monday, July 28, 2014]
        . GoAccess 0.8.3 Released. See ChangeLog for new features/bug-fixes.
    - 0.8.2  [Monday, July 21, 2014]
        . GoAccess 0.8.2 Released. See ChangeLog for new features/bug-fixes.
    - 0.8.1  [Monday, June 16, 2014]
        . GoAccess 0.8.1 Released. See ChangeLog for new features/bug-fixes.
    - 0.8  [Monday, May 20, 2013]
        . GoAccess 0.8 Released. See ChangeLog for new features/bug-fixes.
    - 0.7.1  [Monday, February 17, 2014]
        . GoAccess 0.7.1 Released. See ChangeLog for new features/bug-fixes.
    - 0.7  [Monday, December 16, 2013]
        . GoAccess 0.7 Released. See ChangeLog for new features/bug-fixes.
    - 0.6.1  [Monday, October 07, 2013]
        . GoAccess 0.6.1 Released. See ChangeLog for new features/bug-fixes.
    - 0.6  [Monday, July 15, 2013]
        . GoAccess 0.6 Released. See ChangeLog for new features/bug-fixes.
    - 0.5  [Monday, June 04, 2012]
        . GoAccess 0.5 Released. See ChangeLog for new features/bug-fixes.
    - 0.4.2  [Monday, January 03, 2011]
        . GoAccess 0.4.2 Released. See ChangeLog for new features/bug-fixes.
    - 0.4.1  [Monday, December 13, 2010]
        . GoAccess 0.4.1 Released. See ChangeLog for new features/bug-fixes.
    - 0.4  [Tuesday, November 30, 2010]
        . GoAccess 0.4 Released. See ChangeLog for new features/bug-fixes.
    - 0.3.3  [Monday, September 27, 2010]
        . GoAccess 0.3.3 Released. See ChangeLog for new features/bug-fixes.
    - 0.3.2  [Thursday, September 09 2010]
        . GoAccess 0.3.2 Released. See ChangeLog for new features/bug-fixes.
    - 0.3.1  [Friday, September 03, 2010]
        . GoAccess 0.3.1 Released. See ChangeLog for new features/bug-fixes.
    - 0.3    [Sunday, August 29, 2010]
        . GoAccess 0.3 Released. See ChangeLog for new features/bug-fixes.
    - 0.2    [Sunday, July 25, 2010]
        . GoAccess 0.2 Released. See ChangeLog for new features/bug-fixes.
    - 0.1.2  [Tuesday, July 13, 2010]
        . GoAccess 0.1.2 Released. See ChangeLog for new features/bug-fixes.
    - 0.1.1  [Saturday, July 10, 2010]
        . GoAccess 0.1.1 Released. See ChangeLog for new features/bug-fixes.
    - 0.1    [Wednesday, July 07, 2010]
        . Welcome to the GoAccess 0.1 Released.


================================================
FILE: README.md
================================================
GoAccess [![C build](https://github.com/allinurl/goaccess/actions/workflows/build-test.yml/badge.svg)](https://github.com/allinurl/goaccess/actions/workflows/build-test.yml) [![GoAccess](https://goaccess.io/badge)](https://goaccess.io)
========

## What is it? ##
GoAccess is an open source, real-time web log analyzer and interactive viewer
that runs in a terminal on *nix systems or directly in your browser. Designed
with system administrators, DevOps engineers, and security professionals in
mind, it delivers fast, actionable HTTP statistics and visual server reports on
the fly. GoAccess parses your web server logs in real time and presents the
data directly in the terminal or via a live HTML dashboard, making it easy to
monitor traffic, detect anomalies, and troubleshoot issues instantly.

More info at: [https://goaccess.io](https://goaccess.io/?src=gh).

[![GoAccess Terminal Dashboard](https://goaccess.io/images/goaccess-real-time-term-gh-2026-1.png?2026021201)](https://goaccess.io/)
[![GoAccess HTML Dashboard](https://goaccess.io/images/goaccess-real-time-html-gh-2026.png?2026021201)](https://rt.goaccess.io/?src=gh)

## Features ##
GoAccess parses the specified web log file and outputs the data to the X
terminal. Features include:

* **Completely Real Time**<br>
  All panels and metrics are timed to be updated every 200 ms on the terminal
  output and every second on the HTML output.

* **Minimal Configuration needed**<br>
  You can just run it against your access log file, pick the log format and let
  GoAccess parse the access log and show you the stats.

* **Track Application Response Time**<br>
  Track the time taken to serve the request. Extremely useful if you want to
  track pages that are slowing down your site.

* **WebSocket Authentication:**<br>
  GoAccess offers enhanced WebSocket authentication, supporting local and
  external JWT verification, with secure token refresh capabilities and seamless
  integration with external authentication systems.

* **Nearly All Web Log Formats**<br>
  GoAccess allows any custom log format string.  Predefined options include,
  Apache, Nginx, Amazon S3, Elastic Load Balancing, CloudFront, etc.

* **Incremental Log Processing**<br>
  Need data persistence? GoAccess has the ability to process logs incrementally
  through the on-disk persistence options.

* **Only one dependency**<br>
  GoAccess is written in C. To run it, you only need ncurses as a dependency.
  That's it. It even features its own Web Socket server — http://gwsocket.io/.

* **Visitors**<br>
  Determine the amount of hits, visitors, bandwidth, and metrics for slowest
  running requests by the hour, or date.

* **Metrics per Virtual Host**<br>
  Have multiple Virtual Hosts (Server Blocks)? It features a panel that
  displays which virtual host is consuming most of the web server resources.

* **ASN (Autonomous System Number mapping)**<br>
  Great for detecting malicious traffic patterns and block them accordingly.

* **Color Scheme Customizable**<br>
  Tailor GoAccess to suit your own color taste/schemes. Either through the
  terminal, or by simply applying the stylesheet on the HTML output.

* **Support for Large Datasets**<br>
  GoAccess features the ability to parse large logs due to its optimized
  in-memory hash tables. It has very good memory usage and pretty good
  performance. This storage has support for on-disk persistence as well.

* **Docker Support**<br>
  Ability to build GoAccess' Docker image from upstream. You can still fully
  configure it, by using Volume mapping and editing `goaccess.conf`.  See
  [Docker](https://github.com/allinurl/goaccess#docker) section below.
  There is also documentation how to use [docker-compose](./docker-compose/README.md).

### Nearly all web log formats... ###
GoAccess allows any custom log format string. Predefined options include, but
not limited to:

* Amazon CloudFront (Download Distribution).
* Amazon Simple Storage Service (S3)
* AWS Elastic Load Balancing
* Combined Log Format (XLF/ELF) Apache | Nginx
* Common Log Format (CLF) Apache
* Google Cloud Storage.
* Apache virtual hosts
* Squid Native Format.
* W3C format (IIS).
* Caddy's JSON Structured format.
* Traefik's CLF flavor

## Why GoAccess? ##
GoAccess was designed to be a fast, terminal-based log analyzer. Its core idea
is to quickly analyze and view web server statistics in real time without
needing to use your browser (_great if you want to do a quick analysis of your
access log via SSH, or if you simply love working in the terminal_).

It also serves as a practical tool for security monitoring, making it easy to
spot suspicious activity, unusual traffic patterns, brute-force attempts,
scanners, bots, and anomalous requests directly from your logs.

While the terminal output is the default output, it has the capability to
generate a complete, self-contained, real-time [**`HTML`**](https://rt.goaccess.io/?src=gh)
report, as well as a [**`JSON`**](https://goaccess.io/json?src=gh), and
[**`CSV`**](https://goaccess.io/goaccess_csv_report.csv?src=gh) report.

You can see it more of a monitor command tool than anything else.

## Installation ##
<a href="https://repology.org/project/goaccess/versions">
    <img src="https://repology.org/badge/vertical-allrepos/goaccess.svg" alt="Packaging status" align="right">
</a>

### Build from release

GoAccess can be compiled and used on *nix systems.

Download, extract and compile GoAccess with:

    $ wget https://tar.goaccess.io/goaccess-1.10.1.tar.gz
    $ tar -xzvf goaccess-1.10.1.tar.gz
    $ cd goaccess-1.10.1/
    $ ./configure --enable-utf8 --enable-geoip=mmdb --with-zlib
    $ make
    # make install

### Build from GitHub (Development) ###

    $ git clone https://github.com/allinurl/goaccess.git
    $ cd goaccess
    $ autoreconf -fiv
    $ ./configure --enable-utf8 --enable-geoip=mmdb
    $ make
    # make install

### Distributions ###

It is easiest to install GoAccess on GNU+Linux using the preferred package manager
of your GNU+Linux distribution. Please note that not all distributions will have
the latest version of GoAccess available.

#### Debian/Ubuntu ####

    # apt-get install goaccess

**Note:** It is likely this will install an outdated version of GoAccess. To
make sure that you're running the latest stable version of GoAccess see
alternative option below.

#### Official GoAccess Debian & Ubuntu repository ####

    $ wget -O - https://deb.goaccess.io/gnugpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/goaccess.gpg >/dev/null
    $ echo "deb [signed-by=/usr/share/keyrings/goaccess.gpg arch=$(dpkg --print-architecture)] https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/goaccess.list
    $ sudo apt-get update
    $ sudo apt-get install goaccess

**Note**:
* `.deb` packages in the official repo are available through HTTPS as well. You may need to install `apt-transport-https`.

#### Fedora ####

    # yum install goaccess

#### Arch ####

    # pacman -S goaccess

#### Gentoo ####

    # emerge net-analyzer/goaccess

#### OS X / Homebrew ####

    # brew install goaccess

#### FreeBSD ####

    # cd /usr/ports/sysutils/goaccess/ && make install clean
    # pkg install sysutils/goaccess

#### OpenBSD ####

    # cd /usr/ports/www/goaccess && make install clean
    # pkg_add goaccess

#### openSUSE  ####

    # zypper ar -f obs://server:http http
    # zypper in goaccess

#### OpenIndiana ####

    # pkg install goaccess

#### pkgsrc (NetBSD, Solaris, SmartOS, ...) ####

    # pkgin install goaccess

#### Windows ####

GoAccess can be used in Windows through Cygwin. See Cygwin's <a
href="https://goaccess.io/faq#installation">packages</a>.  Or through the
GNU+Linux Subsystem on Windows 10.

#### Docker ####

A Docker image has been updated, capable of directing output from an access log. If you only want to output a report, you can pipe a log from the external environment to a Docker-based process:

    touch report.html
    cat access.log | docker run --rm -i -v ./report.html:/report.html -e LANG=$LANG allinurl/goaccess -a -o report.html --log-format COMBINED -

OR real-time

    tail -F access.log | docker run -p 7890:7890 --rm -i -e LANG=$LANG allinurl/goaccess -a -o report.html --log-format COMBINED --real-time-html -

There is also documentation how to use [docker-compose](./docker-compose/README.md).

##### Build in isolated container

You can also build the binary for Debian based systems in an isolated container environment to prevent cluttering your local system with the development libraries:

    $ curl -L "https://github.com/allinurl/goaccess/archive/refs/heads/master.tar.gz" | tar -xz && cd goaccess-master
    $ docker build -t goaccess/build.debian-12 -f Dockerfile.debian-12 .
    $ docker run -i --rm -v $PWD:/goaccess goaccess/build.debian-12 > goaccess

You can read more about using the docker image in [DOCKER.md](https://github.com/allinurl/goaccess/blob/master/DOCKER.md).

#### Distribution Packages ####

GoAccess has minimal requirements, it's written in C and requires only ncurses.
However, below is a table of some optional dependencies in some distros to
build GoAccess from source.

| Distro                 | NCurses          | GeoIP (opt)      | GeoIP2 (opt)          |  OpenSSL (opt)     |
| ---------------------- | ---------------- | ---------------- | --------------------- | -------------------|
| **Ubuntu/Debian**      | libncurses-dev   | libgeoip-dev     | libmaxminddb-dev      |  libssl-dev        |
| **RHEL/CentOS**        | ncurses-devel    | geoip-devel      | libmaxminddb-devel    |  openssl-devel     |
| **Arch**               | ncurses          | geoip            | libmaxminddb          |  openssl           |
| **Gentoo**             | sys-libs/ncurses | dev-libs/geoip   | dev-libs/libmaxminddb |  dev-libs/openssl  |
| **Slackware**          | ncurses          | GeoIP            | libmaxminddb          |  openssl           |

**Note**: You may need to install build tools like `gcc`, `autoconf`,
`gettext`, `autopoint` etc. for compiling/building software from source. e.g.,
`base-devel`, `build-essential`, `"Development Tools"`.

## Storage ##

#### Default Hash Tables ####

In-memory storage provides better performance at the cost of limiting the
dataset size to the amount of available physical memory. GoAccess uses
in-memory hash tables.  It has very good memory usage and pretty good
performance. This storage has support for on-disk persistence as well.

## Command Line / Config Options ##
See [**options**](https://goaccess.io/man#options) that can be supplied to the command or
specified in the configuration file. If specified in the configuration file, long
options need to be used without prepending `--`.

## Usage / Examples ##
**Note**: Piping data into GoAccess won't prompt a log/date/time
configuration dialog, you will need to previously define it in your
configuration file or in the command line.

### Getting Started ###

To output to a terminal and generate an interactive report:

    # goaccess access.log

To generate an HTML report:

    # goaccess access.log -a > report.html

To generate a JSON report file:

    # goaccess access.log -a -d -o report.json

To generate a CSV report to stdout:

    # goaccess access.log --no-csv-summary -o csv

GoAccess also allows great flexibility for real-time filtering and parsing. For
instance, to quickly diagnose issues by monitoring logs since goaccess was
started:

    # tail -f access.log | goaccess -

And even better, to filter while maintaining opened a pipe to preserve
real-time analysis, we can make use of `tail -f` and a matching pattern tool
such as `grep`, `awk`, `sed`, etc.:

    # tail -f access.log | grep -i --line-buffered 'firefox' | goaccess --log-format=COMBINED -

or to parse from the beginning of the file while maintaining the pipe opened
and applying a filter

    # tail -f -n +0 access.log | grep -i --line-buffered 'firefox' | goaccess -o report.html --real-time-html -


### Multiple Log files ###

There are several ways to parse multiple logs with GoAccess. The simplest is to
pass multiple log files to the command line:

    # goaccess access.log access.log.1

It's even possible to parse files from a pipe while reading regular files:

    # cat access.log.2 | goaccess access.log access.log.1 -

**Note**: the single dash is appended to the command line to let GoAccess
know that it should read from the pipe.

Now if we want to add more flexibility to GoAccess, we can use `zcat --force`
to read compressed and uncompressed files. For instance, if we would
like to process all log files `access.log*`, we can do:

    # zcat --force access.log* | goaccess -

_Note_: On Mac OS X, use `gunzip -c` instead of `zcat`.

### Multi-thread Support ###

Use `--jobs=<count>` (or `-j`) to enable multi-thread parsing. For example:

    # goaccess access.log -o report.html -j 4


And use `--chunk-size=<256-32768>` to adjust chunk size, the default chunk size is 1024. For example:

    # goaccess access.log -o report.html -j 4 --chunk-size=8192


### Real-time HTML outputs ###

GoAccess has the ability the output real-time data in the HTML report. You can
even email the HTML file since it is composed of a single file with no external
file dependencies, how neat is that!

The process of generating a real-time HTML report is very similar to the
process of creating a static report. Only `--real-time-html` is needed to make
it real-time.

    # goaccess access.log -o /usr/share/nginx/html/your_site/report.html --real-time-html

To view the report you can navigate to `http://your_site/report.html`.

By default, GoAccess will use the host name of the generated report.
Optionally, you can specify the URL to which the client's browser will connect
to. See [FAQ](https://goaccess.io/faq) for a more detailed example.

    # goaccess access.log -o report.html --real-time-html --ws-url=goaccess.io

By default, GoAccess listens on port 7890, to use a different port other than
7890, you can specify it as (make sure the port is opened):

    # goaccess access.log -o report.html --real-time-html --port=9870

And to bind the WebSocket server to a different address other than 0.0.0.0, you
can specify it as:

    # goaccess access.log -o report.html --real-time-html --addr=127.0.0.1

**Note**: To output real time data over a TLS/SSL connection, you need to use
`--ssl-cert=<cert.crt>` and `--ssl-key=<priv.key>`.

### Filtering ###

#### Working with dates ####

Another useful pipe would be filtering dates out of the web log

The following will get all HTTP requests starting on `05/Dec/2010` until the
end of the file.

    # sed -n '/05\/Dec\/2010/,$ p' access.log | goaccess -a -

or using relative dates such as yesterdays or tomorrows day:

    # sed -n '/'$(date '+%d\/%b\/%Y' -d '1 week ago')'/,$ p' access.log | goaccess -a -

If we want to parse only a certain time-frame from DATE a to DATE b, we can do:

    # sed -n '/5\/Nov\/2010/,/5\/Dec\/2010/ p' access.log | goaccess -a -

If we want to preserve only certain amount of data and recycle storage, we can
keep only a certain number of days. For instance to keep & show the last 5
days:

    # goaccess access.log --keep-last=5

#### Virtual hosts ####

Assuming your log contains the virtual host field. For instance:

    vhost.io:80 8.8.4.4 - - [02/Mar/2016:08:14:04 -0600] "GET /shop HTTP/1.1" 200 615 "-" "Googlebot-Image/1.0"

And you would like to append the virtual host to the request in order to see
which virtual host the top urls belong to:

    awk '$8=$1$8' access.log | goaccess -a -

To do the same, but also use real-time filtering and parsing:

    tail -f  access.log | unbuffer -p awk '$8=$1$8' | goaccess -a -

To exclude a list of virtual hosts you can do the following:

    # grep -v "`cat exclude_vhost_list_file`" vhost_access.log | goaccess -

#### Files, status codes and bots ####

To parse specific pages, e.g., page views, `html`, `htm`, `php`, etc. within a
request:

    # awk '$7~/\.html|\.htm|\.php/' access.log | goaccess -

Note, `$7` is the request field for the common and combined log format,
(without Virtual Host), if your log includes Virtual Host, then you probably
want to use `$8` instead. It's best to check which field you are shooting for,
e.g.:

    # tail -10 access.log | awk '{print $8}'

Or to parse a specific status code, e.g., 500 (Internal Server Error):

    # awk '$9~/500/' access.log | goaccess -

Or multiple status codes, e.g., all 3xx and 5xx:

    # tail -f -n +0 access.log | awk '$9~/3[0-9]{2}|5[0-9]{2}/' | goaccess -o out.html -

And to get an estimated overview of how many bots (crawlers) are hitting your server:

    # tail -F -n +0 access.log | grep -i --line-buffered 'bot' | goaccess -

### Tips ###

Also, it is worth pointing out that if we want to run GoAccess at lower
priority, we can run it as:

    # nice -n 19 goaccess -f access.log -a

and if you don't want to install it on your server, you can still run it from
your local machine!

    # ssh -n root@server 'tail -f /var/log/apache2/access.log' | goaccess - --log-format=COMBINED

**Note:** SSH requires `-n` so GoAccess can read from stdin. Also, make sure to
use SSH keys for authentication as it won't work if a passphrase is required.

#### Troubleshooting ####

We receive many questions and issues that have been answered previously.

* Date/time matching problems? Check that your log format and the system locale in which you run GoAccess match. See [#1571](https://github.com/allinurl/goaccess/issues/1571#issuecomment-543186858)
* Problems with pattern matching? Spaces are often a problem, see for instance [#136](https://github.com/allinurl/goaccess/issues/136), [#1579](https://github.com/allinurl/goaccess/issues/1579)
* Other issues matching log entries: See [>200 closed issues regarding log/date/time formats](https://github.com/allinurl/goaccess/issues?q=is%3Aissue+is%3Aclosed+label%3A%22log%2Fdate%2Ftime+format%22)
* Problems with log processing? See [>111 issues regarding log processing](https://github.com/allinurl/goaccess/issues?q=is%3Aissue+is%3Aclosed+label%3Alog-processing)


#### Incremental log processing ####

GoAccess has the ability to process logs incrementally through its internal
storage and dump its data to disk. It works in the following way:

1. A dataset must be persisted first with `--persist`, then the same dataset
can be loaded with.
2. `--restore`.  If new data is passed (piped or through a log file), it will
append it to the original dataset.

##### NOTES #####

GoAccess keeps track of inodes of all the files processed (assuming files will
stay on the same partition), in addition, it extracts a snippet of data from
the log along with the last line parsed of each file and the timestamp of the
last line parsed. e.g., `inode:29627417|line:20012|ts:20171231235059`

First, it compares if the snippet matches the log being parsed, if it does, it
assumes the log hasn't changed drastically, e.g., hasn't been truncated. If
the inode does not match the current file, it parses all lines. If the current
file matches the inode, it then reads the remaining lines and updates the count
of lines parsed and the timestamp. As an extra precaution, it won't parse log
lines with a timestamp ≤ than the one stored.

Piped  data works based off the timestamp of the last line read. For instance,
it will parse and discard all incoming entries until it finds a timestamp >=
than the one stored.

##### Examples #####

    // last month access log
    # goaccess access.log.1 --persist

then, load it with

    // append this month access log, and preserve new data
    # goaccess access.log --restore --persist

To read persisted data only (without parsing new data)

    # goaccess --restore

## Contributing ##

Any help on GoAccess is welcome. The most helpful way is to try it out and give
feedback. Feel free to use the GitHub issue tracker and pull requests to
discuss and submit code changes.

You can contribute to our translations by editing the .po files direct on GitHub or using the visual interface [inlang.com](https://inlang.com/editor/github.com/allinurl/goaccess)

Enjoy!


================================================
FILE: SECURITY.md
================================================
# Security Policy

Found a security issue in [GoAccess](https://github.com/allinurl/goaccess)?
Read on.

## Reporting a Vulnerability

GoAccess takes all security bugs seriously. Thank you for improving the
security of `goaccess`. I appreciate your efforts and responsible disclosure
and will make every effort to acknowledge your contributions.

Vulnerabilities should be reported to [hello@goaccess.io](mailto:hello@goaccess.io) which is a private,
maintainer-only email address.


When I receive a security bug report, I will work on the fix and prepare a
release including the following steps:

  * Confirm the problem and determine the affected versions.
  * Audit the code to find any potential similar problems.

## Comments on this Policy

If you have suggestions on how this process could be improved please submit a
pull request.

When reporting an issue, where possible, please provide the following (if
possible):

* Commit version where the issue was introduced.
* A proof of concept (plaintext; or ideally send a patch to same email address)
* Steps to reproduce
* Your recommended fixes, if any.

> Note: Please do not open public issues for security issues, as GitHub does
> not provide facility for private issues, and deleting the issue makes it hard
> to triage/respond back to the reporter.


================================================
FILE: TODO
================================================
Copyright (C) 2009-2026
6erardo Orellana <goaccess@prosoftcorp.com>

For a more comprehensive list of to-do items, please refer to the GitHub site.
https://github.com/allinurl/goaccess/issues

or visit https://goaccess.io/faq#todo

If you are interested in working on any of the items listed in there, email
goaccess@prosoftcorp.com or better, open a new issue:


================================================
FILE: build-dynamic.sh
================================================
#!/usr/bin/env sh
# Build dynamic linked binaries on Debian.
set -o nounset   ## set -u : exit the script if you try to use an uninitialised variable
set -o errexit   ## set -e : exit the script if any statement returns a non-true return value

# should be either of "mmdb" or "legacy"
geoip=${1:-"mmdb"}

autoreconf -fi > /dev/null 2>&1
./configure CFLAGS=-Werror --enable-utf8 --with-openssl --with-getline --enable-geoip="$geoip" >/dev/null
make -j > /dev/null
cat goaccess


================================================
FILE: config/browsers.list
================================================
# List of browsers and their categories
# e.g., WORD delimited by tab(s) TYPE
# TYPE can be any type and it's not limited to the ones below.
#
# **IMPORTANT NOTE**:
# ---------------------
# The SIZE of the list is proportional to the run time.
# Thus, the longer the list, the more time GoAccess will take to parse it.
#
# Also, you should note that the higher the browser/item is on the list, the
# faster the parsing will be.
#
# The list needs to be specified using --browsers-file=<path>. This file is not
# parsed by default.
#
# The items below are sample crawlers, adjust as needed.

Chef Client								Crawlers
Abonti									Crawlers
SISTRIX									Crawlers
DotBot									Crawlers
Speedy	Spider								Crawlers
Sosospider								Crawlers
BPImageWalker								Crawlers
DoCoMo									Crawlers
GSLFbot									Crawlers
YodaoBot								Crawlers
AddThis									Crawlers
Purebot									Crawlers
CCBot									Crawlers
findlinks								Crawlers
ichiro									Crawlers
Linguee Bot								Crawlers
Gigabot									Crawlers
BacklinkCrawler								Crawlers
distilator								Crawlers
Aboundex								Crawlers
UnwindFetchor								Crawlers
SBIder									Crawlers
TestNutch								Crawlers
DomainCrawler								Crawlers
NextGenSearchBot							Crawlers
SEOENGWorldBot								Crawlers
Cityreview								Crawlers
PagePeeker								Crawlers
JS-Kit									Crawlers
ScreenerBot								Crawlers
ShowyouBot								Crawlers
SolomonoBot								Crawlers
Domnutch								Crawlers
MaxPoint								Crawlers
NCBot									Crawlers
TosCrawler								Crawlers
Updownerbot								Crawlers
OpenWebSpider								Crawlers
WordPress								Crawlers
PEAR									Crawlers
ZumBot									Crawlers
YisouSpider								Crawlers
W3C									Crawlers
vcheck									Crawlers
PercolateCrawler							Crawlers
NING									Crawlers
gvfs									Crawlers
CatchBot								Crawlers
Combine									Crawlers
A6-Indexer								Crawlers
Altresium								Crawlers
Comodo									Crawlers
crawler4j								Crawlers
Cricket									Crawlers
EC2LinkFinder								Crawlers
envolk									Crawlers
GeoHasher								Crawlers
HTMLParser								Crawlers
MLBot									Crawlers
Jaxified								Crawlers
LinkWalker								Crawlers
nutch									Crawlers
PostRank								Crawlers
keybase-proofs								Crawlers
CommonCrawler								Crawlers
X-CAD-SE								Crawlers
Safeassign								Crawlers
Nmap									Crawlers
sqlmap									Crawlers
Jorgee									Crawlers
PxBroker								Crawlers
Seekport								Crawlers
adscanner								Crawlers
AfD-Verbotsverfahren_JETZT!						Crawlers
DuckDuckGo-favicons-Bot							Crawlers
bingbot									Crawlers
PetalBot								Crawlers
Discordbot								Crawlers
ZoominfoBot								Crawlers
Googlebot								Crawlers
AhrefsBot								Crawlers
SemrushBot								Crawlers
Adsbot									Crawlers
BLEXBot									Crawlers
NetcraftSurveyAgent							Crawlers
Netcraft Web Server Survey						Crawlers
masscan									Crawlers
MJ12bot									Crawlers
Pandalytics								Crawlers
YandexBot								Crawlers
Nimbostratus-Bot							Crawlers
SeznamBot								Crawlers
AppleBot								Crawlers

Vienna									Feeds
Windows-RSS-Platform							Feeds
newsbeuter								Feeds
Wrangler								Feeds
Fever									Feeds
Tiny									Feeds
FreshRSS								Feeds
KrISS									Feeds
SimplePie								Feeds
Feedsubs								Feeds
UniversalFeedParser							Feeds


================================================
FILE: config/goaccess.conf
================================================
######################################
# Time Format Options (required)
######################################
#
# The hour (24-hour clock) [00,23]; leading zeros are permitted but not required.
# The minute [00,59]; leading zeros are permitted but not required.
# The seconds [00,60]; leading zeros are permitted but not required.
# See `man strftime` for more details
#
# The following time format works with any of the
# Apache/NGINX's log formats below.
#
#time-format %H:%M:%S
#
# Google Cloud Storage or
# The time in microseconds since the Unix epoch.
#
#time-format %f

# Squid native log format
#
#time-format %s

######################################
# Date Format Options (required)
######################################
#
# The date-format variable followed by a space, specifies
# the log format date containing any combination of regular
# characters and special format specifiers. They all begin with a
# percentage (%) sign. See `man strftime`
#
# The following date format works with any of the
# Apache/NGINX's log formats below.
#
#date-format %d/%b/%Y
#
# AWS | Amazon CloudFront (Download Distribution)
# AWS | Elastic Load Balancing
# W3C (IIS)
#
#date-format %Y-%m-%d
#
# Google Cloud Storage or
# The time in microseconds since the Unix epoch.
#
#date-format %f

# Squid native log format
# Caddy
#
#date-format %s

######################################
# Date/Time Format Option
######################################
#
# The datetime-format variable followed by a space, specifies
# the log format date and time containing any combination of regular
# characters and special format specifiers. They all begin with a
# percentage (%) sign. See `man strftime`
#
# This gives the ability to get the timezone from a request and
# convert it to another timezone for output. See --tz=<timezone> in
# the man page.
#
#datetime-format %d/%b/%Y:%H:%M:%S %z

######################################
# Log Format Options (required)
######################################
#
# The log-format variable followed by a space or \t for
# tab-delimited, specifies the log format string.
#
# NOTE: If the time/date is a timestamp in seconds or microseconds
# %x must be used instead of %d & %t to represent the date & time.

# NCSA Combined Log Format
#log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"

# NCSA Combined Log Format with Virtual Host
#log-format %v:%^ %h %^[%d:%t %^] "%r" %s %b "%R" "%u"

# Common Log Format (CLF)
#log-format %h %^[%d:%t %^] "%r" %s %b

# Common Log Format (CLF) with Virtual Host
#log-format %v:%^ %h %^[%d:%t %^] "%r" %s %b

# W3C
#log-format %d %t %h %^ %^ %^ %^ %r %^ %s %b %^ %^ %u %R

# Squid native log format
#log-format %^ %^ %^ %v %^: %x.%^ %~%L %h %^/%s %b %m %U

# AWS | Amazon CloudFront (Download Distribution)
#log-format %d\t%t\t%^\t%b\t%h\t%m\t%^\t%r\t%s\t%R\t%u\t%^

# Google Cloud Storage
#log-format "%x","%h",%^,%^,"%m","%U","%s",%^,"%b","%D",%^,"%R","%u"

# AWS | Elastic Load Balancing
#log-format %dT%t.%^ %^ %h:%^ %^ %T %^ %^ %^ %s %^ %b "%r" "%u"

# AWSS3 | Amazon Simple Storage Service (S3)
#log-format %^[%d:%t %^] %h %^"%r" %s %^ %b %^ %L %^ "%R" "%u"

# Virtualmin Log Format with Virtual Host
#log-format %h %^ %v %^[%d:%t %^] "%r" %s %b "%R" "%u"

# Kubernetes Nginx Ingress Log Format
#log-format %^ %^ [%h] %^ %^ [%d:%t %^] "%r" %s %b "%R" "%u" %^ %^ [%v] %^:%^ %^ %T %^ %^

# CADDY JSON Structured
#log-format {"ts":"%x.%^","request":{"client_ip":"%h","proto":"%H","method":"%m","host":"%v","uri":"%U","headers":{"User-Agent":["%u"],"Referer":["%R"]},"tls":{"cipher_suite":"%k","proto": "%K"}},"duration": "%T","size": "%b","status": "%s","resp_headers":{"Content-Type":["%M"]}}

# Traefik CLF flavor
#log-format %h - %e [%d:%t %^] "%r" %s %b "%R" "%u" %^ "%v" "%U" %Lms

# In addition to specifying the raw log/date/time formats, for
# simplicity, any of the following predefined log format names can be
# supplied to the log/date/time-format variables. GoAccess  can  also
# handle  one  predefined name in one variable and another predefined
# name in another variable.
#
#log-format COMBINED
#log-format VCOMBINED
#log-format COMMON
#log-format VCOMMON
#log-format W3C
#log-format SQUID
#log-format CLOUDFRONT
#log-format CLOUDSTORAGE
#log-format AWSELB
#log-format AWSS3
#log-format CADDY
#log-format TRAEFIKCLF

######################################
# UI Options
######################################

# Choose among color schemes
# 1 : Monochrome
# 2 : Green
# 3 : Monokai (if 256-colors supported)
#
#color-scheme 3

# Prompt log/date configuration window on program start.
#
config-dialog false

# Color highlight active panel.
#
hl-header true

# Specify a custom CSS file in the HTML report.
#
#html-custom-css /path/file.css

# Specify a custom JS file in the HTML report.
#
#html-custom-js /path/file.js

# Set default HTML preferences.
#
# NOTE: A valid JSON object is required.
# DO NOT USE A MULTILINE JSON OBJECT.
# The parser will only parse the value next to `html-prefs` (single line)
# It allows the ability to customize each panel plot. See example below.
#
#html-prefs {"theme":"bright","perPage":5,"layout":"horizontal","showTables":true,"visitors":{"plot":{"chartType":"bar"}}}

# Set HTML report page title and header.
#
#html-report-title My Awesome Web Stats

# Format JSON output using tabs and newlines.
#
json-pretty-print false

# Turn off colored output. This is the  default output on
# terminals that do not support colors.
# true  : for no color output
# false : use color-scheme
#
no-color false

# Don't write column names in the terminal output. By default, it displays
# column names for each available metric in every panel.
#
no-column-names false

# Disable summary metrics on the CSV output.
#
no-csv-summary false

# Disable progress metrics.
#
no-progress false

# Disable scrolling through panels on TAB.
#
no-tab-scroll false

# Disable progress metrics and parsing spinner.
#
#no-parsing-spinner true

# Do not show the last updated field displayed in the HTML generated report.
#
#no-html-last-updated true

# Outputs the report date/time data in the given timezone. Note that it
# uses the canonical timezone name. See --datetime-format in order to
# properly specify a timezone in the date/time format.
#
#tz Europe/Berlin

# Enable mouse support on main dashboard.
#
with-mouse false

# Maximum number of items to show per panel.
# Note: Only the CSV and JSON outputs allow a maximum greater than the
# default value of 366.
#
#max-items 366

# Custom colors for the terminal output
# Tailor GoAccess to suit your own tastes.
#
# Color Syntax:
# DEFINITION space/tab colorFG#:colorBG# [[attributes,] PANEL]
#
# FG# = foreground color number [-1...255] (-1 = default terminal color)
# BG# = background color number [-1...255] (-1 = default terminal color)
#
# Optionally:
#
# It is possible to apply color attributes, such as:
# bold,underline,normal,reverse,blink.
# Multiple attributes are comma separated
#
# If desired, it is possible to apply custom colors per panel, that is, a
# metric in the REQUESTS panel can be of color A, while the same metric in the
# BROWSERS panel can be of color B.
#
# The following is a 256 color scheme (hybrid palette)
#
#color COLOR_MTRC_HITS              color110:color-1
#color COLOR_MTRC_VISITORS          color173:color-1
#color COLOR_MTRC_DATA              color221:color-1
#color COLOR_MTRC_BW                color167:color-1
#color COLOR_MTRC_AVGTS             color143:color-1
#color COLOR_MTRC_CUMTS             color247:color-1
#color COLOR_MTRC_MAXTS             color186:color-1
#color COLOR_MTRC_PROT              color109:color-1
#color COLOR_MTRC_MTHD              color139:color-1
#color COLOR_MTRC_HITS_PERC         color186:color-1
#color COLOR_MTRC_HITS_PERC_MAX     color139:color-1
#color COLOR_MTRC_HITS_PERC_MAX     color139:color-1 VISITORS
#color COLOR_MTRC_HITS_PERC_MAX     color139:color-1 OS
#color COLOR_MTRC_HITS_PERC_MAX     color139:color-1 BROWSERS
#color COLOR_MTRC_HITS_PERC_MAX     color139:color-1 VISIT_TIMES
#color COLOR_MTRC_VISITORS_PERC     color186:color-1
#color COLOR_MTRC_VISITORS_PERC_MAX color139:color-1
#color COLOR_MTRC_BW_PERC           color186:color-1
#color COLOR_MTRC_BW_PERC_MAX       color139:color-1
#color COLOR_PANEL_COLS             color243:color-1
#color COLOR_BARS                   color240:color-1
#color COLOR_SUBBARS                color250:color-1
#color COLOR_CHART_AXIS             color241:color-1
#color COLOR_CHART_VALUES           color248:color-1
#color COLOR_ERROR                  color231:color167
#color COLOR_SELECTED               color7:color167
#color COLOR_PANEL_ACTIVE           color7:color237
#color COLOR_PANEL_HEADER           color250:color235
#color COLOR_PANEL_DESC             color242:color-1
#color COLOR_OVERALL_LBLS           color243:color-1
#color COLOR_OVERALL_VALS           color167:color-1
#color COLOR_OVERALL_PATH           color186:color-1
#color COLOR_ACTIVE_LABEL           color139:color235 bold underline
#color COLOR_BG                     color250:color-1
#color COLOR_DEFAULT                color243:color-1
#color COLOR_PROGRESS               color7:color110

######################################
# Server Options
######################################

# Specify IP address to bind server to.
#
#addr 0.0.0.0

# Run GoAccess as daemon (if --real-time-html enabled).
#
#daemonize false

# Ensure clients send the specified origin header upon the WebSocket
# handshake.
#
#origin http://example.org

# The port to which the connection is being attempted to connect.
# By default GoAccess' WebSocket server listens on port 7890
# See man page or http://gwsocket.io for details.
#
#port 7890

# Write the PID to a file when used along the daemonize option.
#
#pid-file /var/run/goaccess.pid

# Enable real-time HTML output.
#
#real-time-html true

# Path to TLS/SSL certificate.
# Note that ssl-cert and ssl-key need to be used to enable TLS/SSL.
#
#ssl-cert /path/ssl/domain.crt

# Path to TLS/SSL private key.
# Note that ssl-cert and ssl-key need to be used to enable TLS/SSL.
#
#ssl-key /path/ssl/domain.key

# URL to which the WebSocket server responds. This is the URL supplied
# to the WebSocket constructor on the client side.
#
# Optionally, it is possible to specify the WebSocket URI scheme, such as ws://
# or wss:// for unencrypted and encrypted connections.
# e.g., ws-url wss://goaccess.io
#
# If GoAccess is running behind a proxy, you could set the client side
# to connect to a different port by specifying the host followed by a
# colon and the port.
# e.g., ws-url goaccess.io:9999
#
# By default, it will attempt to connect to localhost. If GoAccess is
# running on a remote server, the host of the remote server should be
# specified here. Also, make sure it is a valid host and NOT an http
# address.
#
#ws-url goaccess.io

# Path to read named pipe (FIFO).
#
#fifo-in /tmp/wspipein.fifo

# Path to write named pipe (FIFO).
#
#fifo-out /tmp/wspipeout.fifo


## WebSocket Authentication
# See man page for more details.
#
# Enables WebSocket authentication using a JSON Web Token (JWT). Optionally, a
# secret key can be provided for verification.
#
#ws-auth=<jwt[:secret]>

# Time after which the JWT expires (only for local generated JWTs).
#
#ws-auth-expire=<secs>

# URL to fetch the initial JWT. e.g., https://site.com/api/get-auth-token
#
#ws-auth-url=<url>

# URL to fetch a new JWT when initial expires. e.g.,
# https://site.com/api/refresh-token
#
#ws-auth-refresh-url=<url>


######################################
# File Options
######################################

# Specify the path to the input log file. If set, it will take
# priority over -f from the command line.
#
#log-file /var/log/apache2/access.log

# Send all debug messages to the specified file.
#
#debug-file debug.log

# Specify a custom configuration file to use. If set, it will take
# priority over the global configuration file (if any).
#
#config-file <filename>

# Log invalid requests to the specified file.
#
#invalid-requests <filename>

# Do not load the global configuration file.
#
#no-global-config false

######################################
# Parse Options
######################################

# Enable a list of user-agents by host. For faster parsing, do not
# enable this flag.
#
agent-list false

#  Enable IP resolver on HTML|JSON|CSV output.
#
with-output-resolver false

# Exclude an IPv4 or IPv6 from being counted.
# Ranges can be included as well using a dash in between
# the IPs (start-end).
#
#exclude-ip 127.0.0.1
#exclude-ip 192.168.0.1-192.168.0.100
#exclude-ip ::1
#exclude-ip 0:0:0:0:0:ffff:808:804-0:0:0:0:0:ffff:808:808

# Include HTTP request method if found. This will create a
# request key containing the request method + the actual request.
#
# <yes|no> [default: yes]
#
http-method yes

# Include HTTP request protocol if found. This will create a
# request key containing the request protocol + the actual request.
#
# <yes|no> [default: yes]
#
http-protocol yes

# Write  output to stdout given one of the following files and the
# corresponding extension for the output format:
#
# /path/file.csv  - Comma-separated values (CSV)
# /path/file.json - JSON (JavaScript Object Notation)
# /path/file.html - HTML
#
# output /path/file.html

# Ignore request's query string.
# i.e.,  www.google.com/page.htm?query => www.google.com/page.htm
#
# Note: Removing the query string can greatly decrease memory
# consumption, especially on timestamped requests.
#
no-query-string false

# Disable IP resolver on terminal output.
#
no-term-resolver false

# Treat non-standard status code 444 as 404.
#
444-as-404 false

# Add 4xx client errors to the unique visitors count.
#
4xx-to-unique-count false

# IP address anonymization
# The IP anonymization option sets the last octet of IPv4 user IP addresses and
# the last 80 bits of IPv6 addresses to zeros.
# e.g., 192.168.20.100 => 192.168.20.0
# e.g., 2a03:2880:2110:df07:face:b00c::1 => 2a03:2880:2110:df07::
#
#anonymize-ip false

# Include static files that contain a query string in the static files
# panel.
# e.g., /fonts/fontawesome-webfont.woff?v=4.0.3
#
all-static-files false

# Include an additional delimited list of browsers/crawlers/feeds etc.
# See config/browsers.list for an example or
# https://raw.githubusercontent.com/allinurl/goaccess/master/config/browsers.list
#
#browsers-file <filename>

# Date specificity. Possible values: `date` (default), or `hr` or `min`.
#
#date-spec hr|min

# Decode double-encoded values.
#
double-decode false

# Enable parsing/displaying the given panel.
#
#enable-panel VISITORS
#enable-panel REQUESTS
#enable-panel REQUESTS_STATIC
#enable-panel NOT_FOUND
#enable-panel HOSTS
#enable-panel OS
#enable-panel BROWSERS
#enable-panel VISIT_TIMES
#enable-panel VIRTUAL_HOSTS
#enable-panel REFERRERS
#enable-panel REFERRING_SITES
#enable-panel KEYPHRASES
#enable-panel STATUS_CODES
#enable-panel REMOTE_USER
#enable-panel CACHE_STATUS
#enable-panel GEO_LOCATION
#enable-panel ASN
#enable-panel MIME_TYPE
#enable-panel TLS_TYPE

# Hide a referrer but still count it. Wild cards are allowed. i.e., *.bing.com
#
#hide-referrer *.google.com
#hide-referrer bing.com

# Hour specificity. Possible values: `hr` (default), or `min` (tenth
# of a minute).
#
#hour-spec min

# Ignore crawlers from being counted.
# This will ignore robots listed under browsers.c
# Note that it will count them towards the total
# number of requests, but excluded from any of the panels.
#
ignore-crawlers false

# Parse and display crawlers only.
# This will ignore all hosts except robots listed under browsers.c
# Note that it will count them towards the total
# number of requests, but excluded from any of the panels.
#
crawlers-only false

# Unknown browsers and OS are considered as crawlers
#
unknowns-as-crawlers false

# Ignore static file requests.
# req : Only ignore request from valid requests
# panels : Ignore request from panels.
# Note that it will count them towards the total number of requests
# ignore-statics req

# Ignore parsing and displaying the given panel.
#
#ignore-panel VISITORS
#ignore-panel REQUESTS
#ignore-panel REQUESTS_STATIC
#ignore-panel NOT_FOUND
#ignore-panel HOSTS
#ignore-panel OS
#ignore-panel BROWSERS
#ignore-panel VISIT_TIMES
#ignore-panel VIRTUAL_HOSTS
ignore-panel REFERRERS
#ignore-panel REFERRING_SITES
ignore-panel KEYPHRASES
#ignore-panel STATUS_CODES
#ignore-panel REMOTE_USER
#ignore-panel CACHE_STATUS
#ignore-panel GEO_LOCATION
#ignore-panel ASN
#ignore-panel MIME_TYPE
#ignore-panel TLS_TYPE

# Ignore referrers from being counted.
# This supports wild cards. For instance,
# '*' matches 0 or more characters (including spaces)
# '?' matches exactly one character
#
#ignore-referrer *.domain.com
#ignore-referrer ww?.domain.*

# Ignore parsing and displaying one or multiple status code(s)
#
#ignore-status 400
#ignore-status 502

# Keep the last specified number of days in storage. This will recycle the
# storage tables. e.g., keep & show only the last 7 days.
#
# keep-last 7

# Disable client IP validation. Useful if IP addresses have been
# obfuscated before being logged.
#
# no-ip-validation true

# Number of lines from the access log to test against the provided
# log/date/time format. By default, the parser is set to test 10
# lines. If set to 0, the parser won't test  any  lines and will parse
# the whole access log.
#
#num-tests 10

# Parse log and exit without outputting data.
#
#process-and-exit false

# Display real OS names. e.g, Windows XP, Snow Leopard.
#
real-os true

# Sort panel on initial load.
# Sort options are separated by comma.
# Options are in the form: PANEL,METRIC,ORDER
#
# Available metrics:
#  BY_HITS     - Sort by hits
#  BY_VISITORS - Sort by unique visitors
#  BY_DATA     - Sort by data
#  BY_BW       - Sort by bandwidth
#  BY_AVGTS    - Sort by average time served
#  BY_CUMTS    - Sort by cumulative time served
#  BY_MAXTS    - Sort by maximum time served
#  BY_PROT     - Sort by http protocol
#  BY_MTHD     - Sort by http method
# Available orders:
#  ASC
#  DESC
#
#sort-panel VISITORS,BY_DATA,ASC
#sort-panel REQUESTS,BY_HITS,ASC
#sort-panel REQUESTS_STATIC,BY_HITS,ASC
#sort-panel NOT_FOUND,BY_HITS,ASC
#sort-panel HOSTS,BY_HITS,ASC
#sort-panel OS,BY_HITS,ASC
#sort-panel BROWSERS,BY_HITS,ASC
#sort-panel VISIT_TIMES,BY_DATA,DESC
#sort-panel VIRTUAL_HOSTS,BY_HITS,ASC
#sort-panel REFERRERS,BY_HITS,ASC
#sort-panel REFERRING_SITES,BY_HITS,ASC
#sort-panel KEYPHRASES,BY_HITS,ASC
#sort-panel STATUS_CODES,BY_HITS,ASC
#sort-panel REMOTE_USER,BY_HITS,ASC
#sort-panel CACHE_STATUS,BY_HITS,ASC
#sort-panel GEO_LOCATION,BY_HITS,ASC
#sort-panel MIME_TYPE,BY_HITS,ASC
#sort-panel TLS_TYPE,BY_HITS,ASC

# Consider the following extensions as static files
# The actual '.' is required and extensions are case sensitive
# For a full list, uncomment the less common static extensions below.
#
static-file .css
static-file .js
static-file .jpg
static-file .png
static-file .gif
static-file .ico
static-file .jpeg
static-file .pdf
static-file .csv
static-file .mpeg
static-file .mpg
static-file .swf
static-file .woff
static-file .woff2
static-file .xls
static-file .xlsx
static-file .doc
static-file .docx
static-file .ppt
static-file .pptx
static-file .txt
static-file .zip
static-file .ogg
static-file .mp3
static-file .mp4
static-file .exe
static-file .iso
static-file .gz
static-file .rar
static-file .svg
static-file .bmp
static-file .tar
static-file .tgz
static-file .tiff
static-file .tif
static-file .ttf
static-file .flv
static-file .dmg
static-file .xz
static-file .zst
#static-file .less
#static-file .ac3
#static-file .avi
#static-file .bz2
#static-file .class
#static-file .cue
#static-file .dae
#static-file .dat
#static-file .dts
#static-file .ejs
#static-file .eot
#static-file .eps
#static-file .img
#static-file .jar
#static-file .map
#static-file .mid
#static-file .midi
#static-file .ogv
#static-file .webm
#static-file .mkv
#static-file .odp
#static-file .ods
#static-file .odt
#static-file .otf
#static-file .pict
#static-file .pls
#static-file .ps
#static-file .qt
#static-file .rm
#static-file .svgz
#static-file .wav
#static-file .webp

######################################
# GeoIP Options
# Only if configured with --enable-geoip
######################################

# To feed a database either through GeoIP Legacy or GeoIP2, you need to use the
# geoip-database flag below.
#
# === GeoIP Legacy
# Legacy GeoIP has been discontinued. If your GNU+Linux distribution does not ship
# with the legacy databases, you may still be able to find them through
# different sources. Make sure to download the .dat files.
#
# Distributed with Creative Commons Attribution-ShareAlike 4.0 International License.
# https://mailfud.org/geoip-legacy/

# IPv4 Country database:
# Download the GeoIP.dat.gz
# gunzip GeoIP.dat.gz
#
# IPv4 City database:
# Download the GeoIPCity.dat.gz
# gunzip GeoIPCity.dat.gz

# Standard GeoIP database for less memory usage (GeoIP Legacy).
#
#std-geoip false

# === GeoIP2
# For GeoIP2 databases, you can use DB-IP Lite databases.
# DB-IP is licensed under a Creative Commons Attribution 4.0 International License.
# https://db-ip.com/db/lite.php

# Or you can download them from MaxMind
# https://dev.maxmind.com/geoip/geoip2/geolite2/

# For GeoIP2 City database:
# Download the GeoLite2-City.mmdb.gz
# gunzip GeoLite2-City.mmdb.gz
#
# For GeoIP2 Country database:
# Download the GeoLite2-Country.mmdb.gz
# gunzip GeoLite2-Country.mmdb.gz
#
#geoip-database /usr/local/share/GeoIP/GeoLiteCity.dat

######################################
# Persistence Options
######################################

# Path where the persisted database files are stored on disk.
# The default value is the /tmp directory.
#db-path /tmp

# Persist parsed data into disk.
#persist true

# Load previously stored data from disk.
# Database files need to exist. See `persist`.
#restore true


================================================
FILE: config/podcast.list
================================================
# vim: set noexpandtab:
#1 This file is a user agent list of various podcast-related agents (but not
#2 limited to). It was distilled from the user agents of a web page which hosts
#3 a WordPress blog and a podcast.
#4 \author Bernhard R. Fischer, <bf@abenteuerland.at>
#5 \date 2019/09/26
AntennaPod				Podcasts
AppleCoreMedia			Mediaplayer
atc						Podcasts
BacklinkCrawler		Crawlers
Baiduspider				Crawlers
Bullhorn Server		PodCrawlers
Castbox					Podcasts
CastBox					Podcasts
Castro					Podcasts
CCBot						Crawlers
com.evolve.podcast	Podcasts
cortex					Facebook
ExoPlayerLib			Mediaplayer
facebookexternalhit	Facebook
fyyd image poller		PodCrawlers
fyyd-poll				PodCrawlers
icatcher					Podcasts
iCatcher!				Podcasts
iTMS						PodCrawlers
itunesstored			PodCrawlers
Kodi						Mediaplayer
Lavf						Mediaplayer
LCC						Crawlers
Luminary					Podcasts
Mediatoolkitbot		Crawlers
mindUpBot				Crawlers
msnbot					Crawlers
NSPlayer					Mediaplayer
Overcast					Podcasts
Photon					Crawlers
Player FM				Podcasts
PlayerFM					Podcasts
Plex						Mediaplayer
Podbean					Podcasts
podcast					Podcasts
Podcast					Podcasts
PodcastRepublic		Podcasts
Podcasts					Podcasts
Podchaser				PodCrawlers
Podchaser-Parser		PodCrawlers
Podnews.net				PodCrawlers
PodParadise				PodCrawlers
Procast					Podcasts
ProCast					Podcasts
Procast (iOS)			Podcasts
ProcastProCast			Podcasts
radio.at					PodCrawlers
RadioPublic				PodCrawlers
RadioPublicImageResizer	PodCrawlers
RSSRadio					Podcasts
Sonos						Mediaplayer
Spotify					PodCrawlers
stagefright				Mediaplayer
Stitcher					PodCrawlers
UniversalFeedParser	Feeds
WinampMPEG				Mediaplayer
XING FeedReader		Feeds
XING-contenttabreceiver	Feeds


================================================
FILE: configure.ac
================================================
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT([goaccess],[1.10.1],[hello@goaccess.io],[],[https://goaccess.io])
AM_INIT_AUTOMAKE([foreign])
AC_CONFIG_SRCDIR([src/goaccess.c])
AC_CONFIG_HEADERS([src/config.h])

# Use empty CFLAGS by default so autoconf does not add
# CFLAGS="-O2 -g"
# NOTE: Needs to go after AC_INIT and before AC_PROG_CC to select an
# empty default instead.
: ${CFLAGS=""}

# Prefer host default compiler
AC_PROG_CC([cc gcc clang])
AM_PROG_CC_C_O

# Check for programs
AM_GNU_GETTEXT([external])
AM_GNU_GETTEXT_VERSION([0.19])
# Fix `undefined reference to `libintl_gettext'` on docker:
AC_CHECK_LIB([intl], [libintl_dgettext])
# Fix undefined reference to dgettext on NetBSD
AC_CHECK_LIB([intl], [dgettext])

# pthread
AC_CHECK_LIB([pthread], [pthread_create], [], [AC_MSG_ERROR([pthread is missing])])
CFLAGS="$CFLAGS -pthread"

# DEBUG
AC_ARG_ENABLE([debug],[AS_HELP_STRING([--enable-debug],[Create a debug build. Default is disabled])],[debug="$enableval"],[debug=no])

if test "$debug" = "yes"; then
  AC_DEFINE([_DEBUG], 1, [Debug option])
fi
AM_CONDITIONAL([DEBUG], [test "x$debug" = "xyes"])

# Handle rdynamic only on systems using GNU ld
AC_CANONICAL_HOST
AC_MSG_CHECKING([whether to build with rdynamic for GNU ld])
with_rdyanimc=yes
case "$host_os" in
  *darwin*|*cygwin*|*aix*|*mingw*) with_rdyanimc=no
  ;;
esac
AC_MSG_RESULT([$with_rdyanimc])
AM_CONDITIONAL([WITH_RDYNAMIC], [test "x$with_rdyanimc" = "xyes"])

# Add ASAN
AC_CANONICAL_HOST
AC_ARG_ENABLE([asan],
  [AS_HELP_STRING([--enable-asan], [Enable address sanitizer])],
  [with_asan=$enableval], [with_asan=no])
AC_MSG_CHECKING([whether to build with address sanitizer])
case "$host_os" in
  *cygwin*|*aix*|*mingw*) with_asan=no
  ;;
esac
AC_MSG_RESULT([$with_asan])
AM_CONDITIONAL([WITH_ASAN], [test "x$with_asan" = "xyes"])

# Check for libc implementation on NetBSD
AC_CHECK_HEADERS([sha.h sha1.h])
AC_CHECK_FUNCS([SHA1Init])
AM_CONDITIONAL([USE_SHA1], [test "x$ac_cv_func_SHA1Init" != "xyes"])

# Build with OpenSSL
AC_ARG_WITH([openssl],[AS_HELP_STRING([--with-openssl],[Build with OpenSSL support. Default is disabled])],[openssl="$withval"],[openssl="no"])

if test "$openssl" = 'yes'; then
  AC_CHECK_LIB([ssl], [SSL_CTX_new],,[AC_MSG_ERROR([ssl library missing])])
  AC_CHECK_LIB([crypto], [CRYPTO_free],,[AC_MSG_ERROR([crypto library missing])])
  AC_CHECK_LIB([ssl], [SSL_CIPHER_standard_name], [AC_DEFINE([HAVE_CIPHER_STD_NAME], 1, [HAVE_CIPHER_STD_NAME])])
fi
AM_CONDITIONAL([WITH_SSL], [test "x$with_openssl" = "xyes"])

# Build with zlib
AC_ARG_WITH([zlib],
  [AS_HELP_STRING([--with-zlib], [Build with zlib support for reading gzipped logs. Default is disabled])],
  [zlib="$withval"],
  [zlib="no"])

if test "$zlib" = 'yes'; then
  AC_CHECK_LIB([z], [gzopen], [], [AC_MSG_ERROR([zlib library missing])])
  AC_CHECK_HEADERS([zlib.h], [], [AC_MSG_ERROR([zlib header missing])])
  AC_DEFINE([HAVE_ZLIB], 1, [Build with zlib support])
fi
AM_CONDITIONAL([WITH_ZLIB], [test "x$zlib" = "xyes"])

# GeoIP
AC_ARG_ENABLE([geoip],[AS_HELP_STRING([--enable-geoip],[Enable GeoIP country lookup. Supported types: mmdb, legacy. Default is disabled])],[geoip="$enableval"],[geoip=no])

geolocation="N/A"
if test "$geoip" = "mmdb"; then
  AC_CHECK_LIB([maxminddb], [MMDB_open], [], [AC_MSG_ERROR([
    *** Missing development files for libmaxminddb library.
  ])])
  geolocation="GeoIP2"
  AC_DEFINE([HAVE_GEOLOCATION], 1, [Build using GeoIP.])
elif test "$geoip" = "legacy"; then
  AC_CHECK_LIB([GeoIP], [GeoIP_new], [], [AC_MSG_ERROR([
    *** Missing development files for the GeoIP library
  ])])
  geolocation="GeoIP Legacy"
  AC_DEFINE([HAVE_GEOLOCATION], 1, [Build using GeoIP.])
elif test "$geoip" != "no"; then
  AC_MSG_ERROR([*** Invalid argument for GeoIP: $geoip])
fi
AM_CONDITIONAL([GEOIP_LEGACY], [test "x$geoip" = "xlegacy"])
AM_CONDITIONAL([GEOIP_MMDB], [test "x$geoip" = "xmmdb"])

# GNU getline / POSIX.1-2008
AC_ARG_WITH([getline],[AS_HELP_STRING([--with-getline],[Build using dynamic line buffer. Default is disabled])],[with_getline=$withval],[with_getline=no])

if test "$with_getline" = "yes"; then
  AC_DEFINE([WITH_GETLINE], 1, [Build using GNU getline.])
fi

# UTF8
AC_ARG_ENABLE([utf8],[AS_HELP_STRING([--enable-utf8],[Enable ncurses library that handles wide characters. Default is disabled])],[utf8="$enableval"],[utf8=no])

if test "$utf8" = "yes"; then
  libncursesw=ncursesw
  # Simply called libncurses on OS X
  case "$host_os" in
    *darwin*) libncursesw=ncurses
    ;;
  esac

  AC_CHECK_LIB([$libncursesw], [mvaddwstr], [],
      [AC_MSG_ERROR([*** Missing development libraries for ncursesw])])
  AC_SEARCH_LIBS([tputs], [tinfow], ,[AC_MSG_ERROR([Cannot find a library providing tputs])])
  AC_DEFINE([HAVE_LIBNCURSESW], [1], ["ncursesw is present."])

  have_ncurses="yes"
  AC_CHECK_HEADERS([ncursesw/ncurses.h],[have_ncurses=yes], [], [
  #ifdef HAVE_NCURSESW_NCURSES_H
  #include <ncursesw/ncurses.h>
  #endif
  ])

  AC_CHECK_HEADERS([ncurses.h],[have_ncurses=yes], [], [
  #ifdef HAVE_NCURSES_H
  #include <ncurses.h>
  #endif
  ])

  if test "$have_ncurses" != "yes"; then
    AC_MSG_ERROR([Missing ncursesw header file])
  fi
else
  AC_CHECK_LIB([ncurses], [refresh], [],
    [AC_CHECK_LIB([curses], [refresh], [],
    [AC_MSG_ERROR([*** Missing development libraries for ncurses])])])
  AC_SEARCH_LIBS([tputs], [tinfo], ,[AC_MSG_ERROR([Cannot find a library providing tputs])])

  have_ncurses="yes"
  AC_CHECK_HEADERS([ncurses/ncurses.h],[have_ncurses=yes], [], [
  #ifdef HAVE_NCURSES_NCURSES_H
  #include <ncurses/ncurses.h>
  #endif
  ])

  AC_CHECK_HEADERS([ncurses.h],[have_ncurses=yes], [], [
  #ifdef HAVE_NCURSES_H
  #include <ncurses.h>
  #endif
  ])

  AC_CHECK_HEADERS([curses.h],[have_ncurses=yes], [], [
  #ifdef HAVE_CURSES_H
  #include <curses.h>
  #endif
  ])

  if test "$have_ncurses" != "yes"; then
    AC_MSG_ERROR([Missing ncurses header file])
  fi
fi

# Default Hash
storage="In-Memory with On-Disk Persistent Storage"

HAS_SEDTR=no
AC_CHECK_PROG([SED_CHECK],[sed],[yes],[no])
if test x"$SED_CHECK" = x"yes" ; then
  AC_CHECK_PROG([TR_CHECK],[tr],[yes],[no])
  if test x"$TR_CHECK" = x"yes" ; then
    HAS_SEDTR=yes
  fi
fi
AM_CONDITIONAL([HAS_SEDTR], [test "x$HAS_SEDTR" = xyes])

# detect Cygwin or MinGW and use mmap family replacements
USE_MMAP=no
case $host in
  *-*-mingw32* | *-*-cygwin* | *-*-windows*)
  USE_MMAP=yes
  AC_MSG_NOTICE([using custom mmap for Cygwin/MinGW])
  ;;
esac
AM_CONDITIONAL([USE_MMAP], [test "x$USE_MMAP" = xyes])

# Solaris
AC_CHECK_LIB([nsl], [gethostbyname])
AC_CHECK_LIB([socket], [socket])

# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([arpa/inet.h])
AC_CHECK_HEADERS([fcntl.h])
AC_CHECK_HEADERS([inttypes.h])
AC_CHECK_HEADERS([limits.h])
AC_CHECK_HEADERS([locale.h])
AC_CHECK_HEADERS([netdb.h])
AC_CHECK_HEADERS([netinet/in.h])
AC_CHECK_HEADERS([stddef.h])
AC_CHECK_HEADERS([stdint.h])
AC_CHECK_HEADERS([stdlib.h])
AC_CHECK_HEADERS([string.h])
AC_CHECK_HEADERS([strings.h])
AC_CHECK_HEADERS([sys/socket.h])
AC_CHECK_HEADERS([sys/time.h])
AC_CHECK_HEADERS([unistd.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_CHECK_TYPES([ptrdiff_t])
AC_STRUCT_TM
AC_TYPE_INT64_T
AC_TYPE_INT8_T
AC_TYPE_OFF_T
AC_TYPE_SIZE_T
AC_TYPE_UINT32_T
AC_TYPE_UINT64_T
AC_TYPE_UINT8_T

# Checks for library functions.
AC_FUNC_FSEEKO
AC_FUNC_MEMCMP
AC_FUNC_MKTIME
AC_FUNC_STAT
AC_FUNC_STRFTIME
AC_FUNC_STRTOD
AC_CHECK_FUNCS([floor])
AC_CHECK_FUNCS([gethostbyaddr])
AC_CHECK_FUNCS([gethostbyname])
AC_CHECK_FUNCS([gettimeofday])
AC_CHECK_FUNCS([malloc])
AC_CHECK_FUNCS([memmove])
AC_CHECK_FUNCS([memset])
AC_CHECK_FUNCS([mkfifo])
AC_CHECK_FUNCS([poll])
AC_CHECK_FUNCS([realloc])
AC_CHECK_FUNCS([realpath])
AC_CHECK_FUNCS([regcomp])
AC_CHECK_FUNCS([setlocale])
AC_CHECK_FUNCS([socket])
AC_CHECK_FUNCS([strcasecmp])
AC_CHECK_FUNCS([strchr])
AC_CHECK_FUNCS([strcspn])
AC_CHECK_FUNCS([strdup])
AC_CHECK_FUNCS([strerror])
AC_CHECK_FUNCS([strncasecmp])
AC_CHECK_FUNCS([strpbrk])
AC_CHECK_FUNCS([strrchr])
AC_CHECK_FUNCS([strspn])
AC_CHECK_FUNCS([strstr])
AC_CHECK_FUNCS([strtol])
AC_CHECK_FUNCS([strtoull])
AC_CHECK_FUNCS([timegm])

AC_CONFIG_FILES([Makefile po/Makefile.in])
AC_OUTPUT

cat << EOF

Your build configuration:

  Prefix         : $prefix
  Package        : $PACKAGE_NAME
  Version        : $VERSION
  Compiler flags : $CFLAGS
  Linker flags   : $LIBS $LDFLAGS
  UTF-8 support  : $utf8
  Dynamic buffer : $with_getline
  ASan           : $with_asan
  Geolocation    : $geolocation
  Storage method : $storage
  TLS/SSL        : $openssl
  zlib support   : $zlib
  Bugs           : $PACKAGE_BUGREPORT

EOF


================================================
FILE: docker-compose/README.md
================================================
# Docker-compose configuration

Here are two docker-compose configurations for goaccess which
combine a static site with a real-time report of goaccess.
The directories used are:

- `configs` - for the nginx and goaccess configuration
- `public` - the files served by nginx - put your static site here
- `logs` - nginx logs - there is no log rotation in place!

There are two flavors of the docker-compose files and the goaccess files: 
- `*.vanilla.*` which need you to take care of the TLS certificates
- `*.traefik.*` using traefik for TLS and domain routing

## Vanilla

For the vanilla version, you'll have to do the following:

- put the TLS certificates into `configs/certs`, following the naming scheme
in `goaccess.vanilla.conf`
- route requests for the static webpage to port `8080`

## Traefik

The traefik version is setup to make it easier to do the routing.
You don't need to take care of the TLS certificates, and the
goaccess websocket gets its own subdomain.

To put it all together, the following environment is needed:
- traefik configured according to [Traefik-101](https://ineiti.ch/posts/traefik-101/traefik-101/)
- DNS configuration for two domain names pointing to your server's IP:
  - `yourdomain` for the static pages, e.g., a blog-post using [Hugo](https://gohugo.io/)
  - `goaccess.yourdomain` for the stats with goaccess



================================================
FILE: docker-compose/configs/goaccess.traefik.conf
================================================
tz Europe/Zurich
time-format %H:%M:%S
date-format %Y-%m-%d
log-format COMBINED
log-file /srv/logs/access.log
output /srv/report/report.html
real-time-html true
ws-url wss://goaccess.yourdomain
port 443


================================================
FILE: docker-compose/configs/goaccess.vanilla.conf
================================================
tz Europe/Zurich
time-format %H:%M:%S
date-format %Y-%m-%d
log-format COMBINED
log-file /srv/logs/access.log
output /srv/report/report.html
real-time-html true
ws-url wss://yourdomain
ssl-cert /srv/certs/yourdomain.crt
ssl-key /srv/certs/yourdomain.key


================================================
FILE: docker-compose/configs/nginx.conf
================================================
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}


================================================
FILE: docker-compose/docker-compose.traefik.yaml
================================================
services:
  web:
    image: nginx
    volumes:
      - ./logs:/var/log/nginx
      - ./configs/nginx.conf:/etc/nginx/nginx.conf
      - ./public:/usr/share/nginx/html
    labels:
      - "traefik.enable=true"
      - "fqdn=yourdomain"
    networks:
      - traefik

  goaccess:
    image: allinurl/goaccess
    container_name: goaccess
    volumes:
      - ./configs/goaccess.traefik.conf:/srv/config/goaccess.conf
      - ./logs:/srv/logs
      - ./public:/srv/report
    command: ["--no-global-config", "--config-file=/srv/config/goaccess.conf"]
    labels:
      - "traefik.enable=true"
      - "fqdn=goaccess.yourdomain"
      - "traefik.http.services.yourdomain-goaccess.loadbalancer.server.port=443"
    restart: unless-stopped
    networks:
      - traefik

networks:
  traefik:
    external:
      name: traefik_traefik


================================================
FILE: docker-compose/docker-compose.vanilla.yaml
================================================
services:
  web:
    image: nginx
    ports:
      - 8080:80
    volumes:
      - ./logs:/var/log/nginx
      - ./configs/nginx.conf:/etc/nginx/nginx.conf
      - ./public:/usr/share/nginx/html

  goaccess:
    image: allinurl/goaccess
    ports:
      - 7890:7890
    volumes:
      - ./configs/goaccess.vanilla.conf:/srv/config/goaccess.conf
      - ./logs:/srv/logs
      - ./public:/srv/report
      - ./configs/certs:/srv/certs
    command: ["--no-global-config", "--config-file=/srv/config/goaccess.conf"]
    restart: unless-stopped


================================================
FILE: goaccess.1
================================================
.TH goaccess 1 "FEB 2026" GNU+Linux "User Manuals"
.SH NAME
goaccess \- fast web log analyzer and interactive viewer.
.SH SYNOPSIS
.LP
.B goaccess [filename] [options...] [-c][-M][-H][-q][-d][...]
.SH DESCRIPTION
.B goaccess
is an open source, real-time log analyzer and
interactive viewer that runs in a
.I terminal
on *nix systems or directly in your
.I browser.
Designed with system administrators, DevOps engineers, and security
professionals in mind, it delivers fast, actionable HTTP statistics and visual
server reports on the fly. GoAccess parses your web server logs in real time
and presents the data directly in the terminal or via a live HTML dashboard,
making it easy to monitor traffic, detect anomalies, and troubleshoot issues
instantly.

.IP "General Statistics:"
This panel gives a summary of several metrics, such as the number of valid and
invalid requests, time taken to analyze the dataset, unique visitors, requested
files, static files (CSS, ICO, JPG, etc) HTTP referrers, 404s, size of the
parsed log file and bandwidth consumption.
.IP "Unique visitors"
This panel shows metrics such as hits, unique visitors and cumulative bandwidth
per date. HTTP requests containing the same IP, the same date, and the same
user agent are considered a unique visitor. By default, it includes web
crawlers/spiders.
.IP
Optionally, date specificity can be set to the hour level using
.I --date-spec=hr
which will display dates such as 05/Jun/2016:16, or to the minute level
producing 05/Jun/2016:16:59. This is great if you want to track your daily
traffic at the hour or minute level.
.IP "Requested files"
This panel displays the most requested (non-static) files on your web server.
It shows hits, unique visitors, and percentage, along with the cumulative
bandwidth, protocol, and the request method used.
.IP "Requested static files"
Lists the most frequently static files such as: JPG, CSS, SWF, JS, GIF, and PNG
file types, along with the same metrics as the last panel. Additional static
files can be added to the configuration file.
.IP "404 or Not Found"
Displays the same metrics as the previous request panels, however, its data
contains all pages that were not found on the server, or commonly known as 404
status code.
.IP "Hosts"
This panel has detailed information on the hosts themselves. This is great for
spotting aggressive crawlers and identifying who's eating your bandwidth.

Expanding the panel can display more information such as host's reverse DNS
lookup result, country of origin and city. If the
.I -a
argument is enabled, a list of user agents can be displayed by selecting the
desired IP address, and then pressing ENTER.
.IP "Operating Systems"
This panel will report which operating system the host used when it hit the
server. It attempts to provide the most specific version of each operating
system.
.IP "Browsers"
This panel will report which browser the host used when it hit the server. It
attempts to provide the most specific version of each browser.
.IP "Visit Times"
This panel will display an hourly report. This option displays 24 data points,
one for each hour of the day.
.IP
Optionally, hour specificity can be set to the tenth of an hour level using
.I --hour-spec=min
which will display hours as 16:4 This is great if you want to spot peaks of
traffic on your server.
.IP "Virtual Hosts"
This panel will display all the different virtual hosts parsed from the access
log. This panel is displayed if
.I %v
is used within the log-format string.
.IP "Referrers URLs"
If the host in question accessed the site via another resource, or was
linked/diverted to you from another host, the URL they were referred from will
be provided in this panel. See `--ignore-panel` in your configuration file to
enable it.
.I disabled
by default.
.IP "Referring Sites"
This panel will display only the host part but not the whole URL. The URL where
the request came from.
.IP "Keyphrases"
It reports keyphrases used on Google search, Google cache, and Google translate
that have lead to your web server. At present, it only supports Google search
queries via HTTP. See `--ignore-panel` in your configuration file to enable it.
.I disabled
by default.
.IP "Geo Location"
Determines where an IP address is geographically located. Statistics are broken
down by continent and country, and when city-level GeoIP data is available it
also lists the individual cities for each hit. It needs to be compiled with
GeoLocation support.
.IP "HTTP Status Codes"
The values of the numeric status code to HTTP requests.
.IP "ASN"
This panel displays ASN (Autonomous System Numbers) data for GeoIP2 and legacy
databases. Great for detecting malicious traffic and blocking accordingly.
.IP "Remote User (HTTP authentication)"
This is the userid of the person requesting the document as determined by HTTP
authentication. If the document is not password protected, this part will be
"-" just like the previous one. This panel is not enabled unless
.I %e
is given within the log-format variable.
.IP "Cache Status"
If you are using caching on your server, you may be at the point where you
want to know if your request is being cached and served from the cache. This
panel shows the cache status of the object the server served. This panel is not
enabled unless
.I %C
is given within the log-format variable. The status can be either
 `MISS`, `BYPASS`, `EXPIRED`, `STALE`, `UPDATING`, `REVALIDATED` or `HIT`
.IP "MIME Types"
This panel specifies Media Types (formerly known as MIME types) and Media
Subtypes which will be assigned and listed underneath. This panel is not
enabled unless
.I %M
is given within the log-format variable. See
https://www.iana.org/assignments/media-types/media-types.xhtml for more
details.
.IP "Encryption Settings"
This panel shows the SSL/TLS protocol used along the Cipher Suites. This panel
is not enabled unless
.I %K
is given within the log-format variable.

.P
GoAccess panels can be reordered and their subitems expanded or collapsed from
the terminal interface, keeping the most important metrics front and center.
Chart metrics and scales are also adjustable on the fly via the interactive
menu described below.

.P
.I NOTE:
Optionally and if configured, all panels can display the average time taken to
serve the request.

.SH STORAGE
.P
There are three storage options that can be used with GoAccess. Choosing one
will depend on your environment and needs.
.TP
Default Hash Tables
In-memory storage provides better performance at the cost of limiting the
dataset size to the amount of available physical memory. GoAccess uses
in-memory hash tables. It has very good memory usage and pretty good
performance. This storage has support for on-disk persistence.
.SH CONFIGURATION
.P
Multiple options can be used to configure GoAccess. For a complete up-to-date
list of configure options, run
.I ./configure --help
.TP
\fB\-\-enable-debug
Compile with debugging symbols and turn off compiler optimizations.
.TP
\fB\-\-enable-utf8
Compile with wide character support. Ncursesw is required.
.TP
\fB\-\-enable-geoip=<legacy|mmdb>
Compile with GeoLocation support. MaxMind's GeoIP is required.
.I legacy
will utilize the original GeoIP databases.
.I mmdb
will utilize the enhanced GeoIP2 databases.
.TP
\fB\-\-with-getline
Dynamically expands line buffer in order to parse full line requests instead of
using a fixed size buffer of 4096.
.TP
\fB\-\-with-zlib
Build with zlib support for reading gzipped logs. Disabled by default.
.TP
\fB\-\-with-openssl
Compile GoAccess with OpenSSL support for its WebSocket server.
\fB\-\-with-zlib
Enables optional zlib support to allow parsing of compressed log files (e.g.,
.gz) directly without manual decompression.
.SH OPTIONS
.P
The following options can be supplied to the command or specified in the
configuration file. If specified in the configuration file, long options need
to be used without prepending -- and without using the equal sign =.
.SS
LOG/DATE/TIME FORMAT
.TP
\fB\-\-time-format=<timeformat>
The time-format variable followed by a space, specifies the log format time
containing either a name of a predefined format (see options below) or any
combination of regular characters and special format specifiers.
.IP
They all begin with a percentage (%) sign. See `man strftime`.
.I %T or %H:%M:%S.
.IP
Note that if a timestamp is given in microseconds,
.I %f
must be used as time-format.
If the timestamp is given in milliseconds
.I %*
must be used as time-format.
.TP
\fB\-\-date-format=<dateformat>
The date-format variable followed by a space, specifies the log format time
containing either a name of a predefined format (see options below) or any
combination of regular characters and special format specifiers.
.IP
They all begin with a percentage (%) sign. See `man strftime`.
.I %Y-%m-%d.
.IP
Note that if a timestamp is given in microseconds,
.I
%f
must be used as date-format.
If the timestamp is given in milliseconds
.I %*
must be used as date-format.
.TP
\fB\-\-datetime-format=<date_time_format>
The date and time format combines the two variables into a single option. This
gives the ability to get the timezone from a request and convert it to another
timezone for output. See
.I --tz=<timezone>
.IP
They all begin with a percentage (%) sign. See `man strftime`. e.g.,
.I %d/%b/%Y:%H:%M:%S %z.
.IP
Note that if --datetime-format is used,
.I %x
must be passed in the log-format variable to represent the date and time field.
.TP
\fB\-\-log-format=<logformat>
The log-format variable followed by a space or
.I \\\\t
for tab-delimited, specifies the log format string.

Note that if there are spaces within the format, the string needs to be
enclosed in single/double quotes. Inner quotes need to be escaped.
.IP
In addition to specifying the raw log/date/time formats, for simplicity, any of
the following predefined log format names can be supplied to the
log/date/time-format variables. GoAccess can also handle one predefined name in
one variable and another predefined name in another variable.
.IP
  COMBINED     - Combined Log Format,
  VCOMBINED    - Combined Log Format with Virtual Host,
  COMMON       - Common Log Format,
  VCOMMON      - Common Log Format with Virtual Host,
  W3C          - W3C Extended Log File Format,
  SQUID        - Native Squid Log Format,
  CLOUDFRONT   - Amazon CloudFront Web Distribution,
  CLOUDSTORAGE - Google Cloud Storage,
  AWSELB       - Amazon Elastic Load Balancing,
  AWSS3        - Amazon Simple Storage Service (S3)
  AWSALB       - Amazon Application Load Balancer
  CADDY        - Caddy's JSON Structured format (local/info format)
  TRAEFIKCLF   - Traefik's CLF flavor
.IP
.I Note:
Generally, you need quotes around values that include white spaces, commas,
pipes, quotes, and/or brackets. Inner quotes must be escaped.
.IP
.I Note:
Piping data into GoAccess won't prompt a log/date/time configuration dialog,
you will need to previously define it in your configuration file or in the
command line.
.IP
.I Note:
The default GoAccess format for CADDY is the 'local/info' format. Nevertheless,
if needed, you have the option to utilize a custom GoAccess log format to match
your particular configuration.
.SS
USER INTERFACE OPTIONS
.TP
\fB\-c \-\-config-dialog
Prompt log/time/date configuration window on program start. Only when curses is
initialized.
.TP
\fB\-i \-\-hl-header
Color highlight active terminal panel.
.TP
\fB\-m \-\-with-mouse
Enable mouse support on main terminal dashboard.
.TP
\fB\-\-\-color=<fg:bg[attrs, PANEL]>
Specify custom colors for the terminal output.

.I Color Syntax
  DEFINITION space/tab colorFG#:colorBG# [attributes,PANEL]

 FG# = foreground color [-1...255] (-1 = default term color)
 BG# = background color [-1...255] (-1 = default term color)

Optionally, it is possible to apply color attributes (multiple attributes are
comma separated), such as:
.I bold,
.I underline,
.I normal,
.I reverse,
.I blink

If desired, it is possible to apply custom colors per panel, that is, a metric
in the REQUESTS panel can be of color A, while the same metric in the BROWSERS
panel can be of color B.

.I Available color definitions:
  COLOR_MTRC_HITS
  COLOR_MTRC_VISITORS
  COLOR_MTRC_DATA
  COLOR_MTRC_BW
  COLOR_MTRC_AVGTS
  COLOR_MTRC_CUMTS
  COLOR_MTRC_MAXTS
  COLOR_MTRC_PROT
  COLOR_MTRC_MTHD
  COLOR_MTRC_HITS_PERC
  COLOR_MTRC_HITS_PERC_MAX
  COLOR_MTRC_VISITORS_PERC
  COLOR_MTRC_VISITORS_PERC_MAX
  COLOR_PANEL_COLS
  COLOR_BARS
  COLOR_ERROR
  COLOR_SELECTED
  COLOR_PANEL_ACTIVE
  COLOR_PANEL_HEADER
  COLOR_PANEL_DESC
  COLOR_OVERALL_LBLS
  COLOR_OVERALL_VALS
  COLOR_OVERALL_PATH
  COLOR_ACTIVE_LABEL
  COLOR_BG
  COLOR_DEFAULT
  COLOR_PROGRESS

See configuration file for a sample color scheme.
.TP
\fB\-\-color-scheme=<1|2|3>
Choose among color schemes.
.I 1
for the default grey scheme.
.I 2
for the green scheme.
.I 3
for the Monokai scheme (shown only if terminal supports 256 colors).
.TP
\fB\-\-crawlers-only
Parse and display only crawlers (bots).
.TP
\fB\-\-html-custom-css=<path/custom.css>
Specifies a custom CSS file path to load in the HTML report.
.TP
\fB\-\-html-custom-js=<path/custom.js>
Specifies a custom JS file path to load in the HTML report.
.TP
\fB\-\-html-report-title=<title>
Set HTML report page title and header.
.TP
\fB\-\-html-refresh=<secs>
Refresh the HTML report every X seconds. The value has to be between 1 and 60
seconds. The default is set to refresh the HTML report every 1 second.
.TP
\fB\-\-html-prefs=<JSON>
Set HTML report default preferences. Supply a valid JSON object containing the
HTML preferences. It allows the ability to customize each panel plot. See
example below.
.IP
.I Note:
The JSON object passed needs to be a one line JSON string. For instance,
.IP
.nf
\-\-html-prefs='{"theme":"bright","perPage":5,"layout":"horizontal","showTables":true,"visitors":{"plot":{"chartType":"bar"}}}'
.fi
.TP
\fB\-\-json-pretty-print
Format JSON output using tabs and newlines.
.IP
.I Note:
This is not recommended when outputting a real-time HTML report since the
WebSocket payload will much much larger.
.TP
\fB\-\-max-items=<number>
The maximum number of items to display per panel. The maximum can be a number
between 1 and n.
.IP
.I Note:
Only the CSV and JSON output allow a maximum number greater than the default
value of 366 (or 50 in the real-time HTML output) items per panel.
.TP
\fB\-\-no-color
Turn off colored output. This is the default output on terminals that do not
support colors.
.TP
\fB\-\-no-csv-summary
Disable summary metrics on the CSV output.
.TP
\fB\-\-no-progress
Disable progress metrics [total requests/requests per second].
.TP
\fB\-\-no-tab-scroll
Disable scrolling through panels when TAB is pressed or when a panel is
selected using a numeric key.
.TP
\fB\-\-no-html-last-updated
Do not show the last updated field displayed in the HTML generated report.
.TP
\fB\-\-no-parsing-spinner
Do now show the progress metrics and parsing spinner.
.TP
\fB\-\-tz=<timezone>
Outputs the report date/time data in the given timezone. Note that it uses the
canonical timezone name. e.g.,
.I Europe/Berlin
or
.I America/Chicago
or
.I Africa/Cairo
If an invalid timezone name is given, the output will be in GMT. See
.I --datetime-format
in order to properly specify a timezone in the date/time format.
.SS
SERVER OPTIONS
.P
.I Note
This is just a WebSocket server to provide the raw real-time data.
It is not a WebServer itself. To access your reports html file, you will
still need your own HTTP server, place the generated report in it's document
root dir and open the html file in your browser. The browser will then open
another WebSocket-connection to the ws-server you may setup here,
to keep the dashboard up-to-date.
.TP
\fB\-\-addr
Specify IP address to bind the server to. Otherwise it binds to 0.0.0.0.
.IP
Usually there is no need to specify the address, unless you intentionally would
like to bind the server to a different address within your server.
.TP
\fB\-\-daemonize
Run GoAccess as daemon (only if \fB\-\-real-time-html enabled).
.IP
Note: It's important to make use of absolute paths across GoAccess'
configuration.
.TP
\fB\-\-user-name=<username>
Run GoAccess as the specified user.
.IP
Note: It's important to ensure the user or the users' group can access the
input and output files as well as any other files needed.
Other groups the user belongs to will be ignored.
As such it's advised to run GoAccess behind a SSL proxy as it's unlikely this
user can access the SSL certificates.
.TP
\fB\-\-origin=<url>
Ensure clients send the specified origin header upon the WebSocket handshake.
.TP
\fB\-\-pid-file=<path/goaccess.pid>
Write the daemon PID to a file when used along the --daemonize option.
.TP
\fB\-\-port=<port>
Specify the port to use. By default GoAccess' WebSocket server listens on port
7890.
.TP
\fB\-\-real-time-html
Enable real-time HTML output.
.IP
GoAccess uses its own WebSocket server to push the data from the server to the
client. See http://gwsocket.io for more details how the WebSocket server works.

.TP
\fB\-\-ws-auth=<jwt[:secret]> | jwt:verify:secret\fR
Enable WebSocket authentication using a JSON Web Token (JWT). This option
supports two formats depending on whether the JWT is locally generated or
externally fetched and verified:
.IP
\fB<jwt[:secret]>\fR: Specifies a static JWT for WebSocket authentication, with
an optional secret for local generation or validation. If only "jwt" is
provided (e.g., \fB\-\-ws-auth=jwt\fR), GoAccess generates a JWT using a secret
sourced from the environment variable \fBGOACCESS_WSAUTH_SECRET\fR or a default
HS256-compatible secret if unset. If a secret is included (e.g.,
\fB\-\-ws-auth=jwt:mysecret\fR), it's used directly as the HS256 signing key or
read from a file if the value is a valid path (e.g.,
\fB\-\-ws-auth=jwt:/path/to/secret.key\fR).
.IP
\fBjwt:verify:secret\fR: Enables verification of an externally fetched JWT
(e.g., via \fB\-\-ws-auth-url\fR). The "verify" keyword indicates that the JWT
is provided by an external source, and the secret must be specified for
validation. The secret can be a direct HS256 key (e.g.,
\fB\-\-ws-auth=jwt:verify:mysecret\fR), a file path (e.g.,
\fB\-\-ws-auth=jwt:verify:/path/to/secret.key\fR), or an environment variable
name (e.g., \fB\-\-ws-auth=jwt:verify:$JWT_SECRET\fR). This format is required
when using \fB\-\-ws-auth-url\fR and optionally \fB\-\-ws-auth-refresh-url\fR
to fetch and verify JWTs from external endpoints.
.IP
When this option is used, the HTML report will not bootstrap the initial parsed
data. Instead, it will only display the report if authentication succeeds,
ensuring secure access to real-time data.
.IP
The system processes this option as follows:
.IP
For \fB<jwt[:secret]>\fR: If no secret is provided, GoAccess generates a JWT
locally using the \fBGOACCESS_WSAUTH_SECRET\fR environment variable or a
default secret. If a secret is specified, it's used to sign the JWT (either
directly or from a file).
.IP
For \fBjwt:verify:secret\fR: The secret is mandatory and used to verify
externally fetched JWTs. It must match the signing key used by the external
authentication server (e.g., at \fB\-\-ws-auth-url\fR).
.IP
Requires to build GoAccess with
.I --with-openssl.
.TP
\fB\-\-ws-auth-expire=<secs>
Set the time after which the JWT expires. Defaults to 8 hours (28800 seconds)
if not specified.
.IP
.I Only
available for locally generated JWT.
.IP
Users can specify the expiration time in various formats. The value is
converted to seconds for JWT expiration validation. Supported formats:
.RS
.IP \(bu 4
"3600"       -> 3600 seconds
.IP \(bu 4
"120s"       -> 2 minutes
.IP \(bu 4
"24h"        -> 24 hours = 86,400 seconds
.IP \(bu 4
"10m"        -> 10 minutes = 600 seconds
.IP \(bu 4
"10d"        -> 10 days = 864,000 seconds
.RE
.IP
The expiration time controls how long the JWT remains valid after issuance,
ensuring secure WebSocket connections.
.TP
\fB\-\-ws-auth-url=<url>
Specifies the URL where GoAccess fetches the initial JWT to authenticate the
WebSocket connection.
.IP
When this option is used, GoAccess sends a GET request to the specified URL to
fetch an initial JWT. The response must be a JSON object containing
\fBstatus\fR, \fBaccess_token\fR, \fBrefresh_token\fR, and \fBexpires_in\fR
fields.
.IP
Example: \fB\-\-ws-auth-url=https://site.com/api/get-auth-token\fR
.IP
When fetching the token, GoAccess uses
.I { credentials: 'include' }
as part of the request to securely retrieve the access token based on the
user’s existing authentication session in your system, ensuring token retrieval
is safe as long as your users are authenticated.
.IP
This option allows you to integrate your existing authentication system with
the GoAccess dashboard, using token retrieval endpoints.
.TP
\fB\-\-ws-auth-refresh-url=<url>
Specifies the URL where GoAccess fetches a new JWT when the current one is about to expire.
.IP
GoAccess proactively refreshes the JWT 60 seconds before expiration by sending
a POST request with the refresh_token to this URL. If not provided, it defaults
to the same URL as \fB\-\-ws-auth-url\fR.
.IP
Example: \fB\-\-ws-auth-refresh-url=https://site.com/api/refresh-token\fR
.IP
The response format should match that of the initial authentication URL.
.SS "WebSocket Authentication Flow"
.IP
GoAccess offers flexible authentication options, supporting both stateless and
stateful approaches. In the stateless approach, the refresh token is obtained
without cookies or CSRF protection; your backend validates the refresh token’s
signature and issues a new access token. Alternatively, the stateful approach
allows the initial fetch to issue JWTs along with a `csrf_token`, which is
stored in the session. The subsequent refresh request (POST) then performs a
CSRF check, requiring the `X-CSRF-TOKEN` header to match the session’s token.
.IP
\fBInitial Authentication:\fR
.RS
.IP \(bu 4
When started with \fB\-\-ws-auth-url=<url>\fR, GoAccess sends a GET request to
fetch an initial JWT.
.IP \(bu 4
The expected successful response format:
.IP
    {
        "status"        : "success",
        "access_token"  : "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
        "csrf_token"    : "3RRjNeR4RTXHmrV1cECkyUmmKeRxm4lzkI0eq41o",
        "refresh_token" : "refresh123xyz",
        "expires_in"    : 3600
    }
.IP \(bu 4
If authentication fails, the endpoint should return:
.IP
    {
        "status": "error",
        "message": "User not authenticated"
    }
.RE
.IP
\fBToken Refreshing:\fR
.RS
.IP \(bu 4
GoAccess refreshes the JWT 60 seconds before expiration by sending a POST
request to the specified URL (defaults to \fB--ws-auth-url\fR if
\fB--ws-auth-refresh-url\fR is not set):
.IP
    { "refresh_token": "refresh123xyz" }
.IP
GoAccess supports both stateless and stateful authentication. For stateless, no
cookies or CSRF are required; your backend validates the refresh token
signature. For stateful, include a \fBcsrf_token\fR in the initial response;
GoAccess sends it as \fBX-CSRF-TOKEN\fR in the refresh request, which your
backend must validate against the session.
.RE
.IP
\fBPeriodic Token Validation:\fR
.RS
.IP \(bu 4
After refreshing, GoAccess confirms the updated JWT’s validity with the
WebSocket server by sending:
.IP
    { 
Download .txt
gitextract_ui100px0/

├── .codespellrc
├── .github/
│   ├── FUNDING.yml
│   └── workflows/
│       ├── build-test.yml
│       ├── deb-packaging-buildx.yml
│       ├── deb-packaging.yml
│       ├── docker-publish.yml
│       └── spelling.yml
├── .gitignore
├── AUTHORS
├── COPYING
├── ChangeLog
├── DOCKER.md
├── Dockerfile
├── Dockerfile.debian-12
├── Makefile.am
├── NEWS
├── README.md
├── SECURITY.md
├── TODO
├── build-dynamic.sh
├── config/
│   ├── browsers.list
│   ├── goaccess.conf
│   └── podcast.list
├── configure.ac
├── docker-compose/
│   ├── README.md
│   ├── configs/
│   │   ├── goaccess.traefik.conf
│   │   ├── goaccess.vanilla.conf
│   │   └── nginx.conf
│   ├── docker-compose.traefik.yaml
│   └── docker-compose.vanilla.yaml
├── goaccess.1
├── inlang.config.js
├── po/
│   ├── LINGUAS
│   ├── Makevars
│   ├── POTFILES.in
│   ├── de.po
│   ├── es.po
│   ├── fr.po
│   ├── goaccess.pot
│   ├── it.po
│   ├── ja.po
│   ├── ka.po
│   ├── ko.po
│   ├── pt_BR.po
│   ├── ru.po
│   ├── sv.po
│   ├── uk.po
│   └── zh_CN.po
├── resources/
│   ├── cities-10m.json
│   ├── countries-110m.json
│   ├── css/
│   │   └── app.css
│   ├── js/
│   │   ├── app.js
│   │   └── charts.js
│   └── tpls.html
├── snap/
│   └── snapcraft.yaml
└── src/
    ├── base64.c
    ├── base64.h
    ├── bin2c.c
    ├── bitmap.c
    ├── bitmap.h
    ├── browsers.c
    ├── browsers.h
    ├── color.c
    ├── color.h
    ├── commons.c
    ├── commons.h
    ├── csv.c
    ├── csv.h
    ├── dialogs.c
    ├── dialogs.h
    ├── error.c
    ├── error.h
    ├── fileio.c
    ├── fileio.h
    ├── gchart.c
    ├── gchart.h
    ├── gdashboard.c
    ├── gdashboard.h
    ├── gdns.c
    ├── gdns.h
    ├── geoip1.c
    ├── geoip1.h
    ├── geoip2.c
    ├── gholder.c
    ├── gholder.h
    ├── gkhash.c
    ├── gkhash.h
    ├── gkmhash.c
    ├── gkmhash.h
    ├── gmenu.c
    ├── gmenu.h
    ├── goaccess.c
    ├── goaccess.h
    ├── gslist.c
    ├── gslist.h
    ├── gstorage.c
    ├── gstorage.h
    ├── gwsocket.c
    ├── gwsocket.h
    ├── json.c
    ├── json.h
    ├── khash.h
    ├── labels.h
    ├── opesys.c
    ├── opesys.h
    ├── options.c
    ├── options.h
    ├── output.c
    ├── output.h
    ├── parser.c
    ├── parser.h
    ├── pdjson.c
    ├── pdjson.h
    ├── persistence.c
    ├── persistence.h
    ├── settings.c
    ├── settings.h
    ├── sha1.c
    ├── sha1.h
    ├── sort.c
    ├── sort.h
    ├── tpl.c
    ├── tpl.h
    ├── ui.c
    ├── ui.h
    ├── util.c
    ├── util.h
    ├── websocket.c
    ├── websocket.h
    ├── win/
    │   ├── mman.h
    │   └── mmap.c
    ├── wsauth.c
    ├── wsauth.h
    ├── xmalloc.c
    └── xmalloc.h
Download .txt
SYMBOL INDEX (1324 symbols across 69 files)

FILE: inlang.config.js
  function defineConfig (line 6) | async function defineConfig(env) {
  function getLanguages (line 38) | async function getLanguages(env) {

FILE: resources/js/app.js
  function $ (line 6) | function $(selector) {
  function $$ (line 11) | function $$(selector, callback) {
  function delayed (line 23) | function delayed() {

FILE: resources/js/charts.js
  function truncate (line 16) | function truncate(text, width) {
  function WorldMap (line 40) | function WorldMap(selection) {
  function AreaChart (line 727) | function AreaChart(dualYaxis) {
  function BarChart (line 1334) | function BarChart(dualYaxis) {

FILE: src/bin2c.c
  function main (line 20) | int

FILE: src/bitmap.c
  function hweight (line 44) | static uint32_t
  function bitmap_sizeof (line 59) | inline uint32_t
  function free_bitmap (line 64) | void
  function bitmap_set_bit (line 70) | int
  function bitmap_get_bit (line 76) | int
  function bitmap_count_set (line 82) | uint32_t
  function bitmap_ffs (line 96) | uint32_t
  function bitmap (line 114) | bitmap *
  function bitmap_realloc (line 126) | int
  function bitmap (line 148) | bitmap *
  function bitmap_key_exists (line 162) | int

FILE: src/bitmap.h
  type word_t (line 36) | typedef uint32_t word_t;
  type bitmap (line 41) | typedef struct bitmap_ {
  function bitmap_word (line 46) | static inline uint32_t

FILE: src/browsers.c
  function free_browsers_hash (line 357) | void
  function is_dup (line 380) | static int
  function set_browser (line 395) | static void
  function parse_browser_token (line 403) | static void
  function parse_browsers_file (line 437) | void
  function is_crawler (line 477) | int

FILE: src/browsers.h
  type GBrowser (line 38) | typedef struct GBrowser_ {

FILE: src/color.c
  function GColors (line 340) | static GColors *
  function GColorPair (line 349) | static GColorPair *
  function free_color_lists (line 360) | void
  function set_normal_color (line 372) | void
  function GColors (line 391) | GColors *
  function GColors (line 397) | GColors *
  function GColors (line 403) | GColors *
  function GColors (line 409) | GColors *
  function GColors (line 415) | GColors *
  function GColors (line 421) | GColors *
  function GColors (line 427) | GColors *
  function GColors (line 433) | GColors *
  function GColors (line 439) | GColors *
  function GColors (line 445) | GColors *
  function get_color_item_enum (line 454) | static int
  function extract_color (line 463) | static int
  function parse_bg_fg_color (line 487) | static int
  function locate_attr_color (line 505) | static void
  function parse_attr_color (line 525) | static int
  function parse_module_color (line 558) | static int
  function find_color_in_list (line 582) | static int
  function find_pair_in_list (line 599) | static int
  function find_color_item_in_list (line 616) | static int
  function find_color_item_module_in_list (line 628) | static int
  function GColors (line 641) | GColors *
  function GColors (line 661) | GColors *
  function parse_color_line (line 685) | static void
  function prepend_color (line 724) | static void
  function parse_color (line 748) | static void
  function parse_colors (line 790) | static void
  function add_default_colors (line 807) | static void
  function set_colors (line 834) | void

FILE: src/color.h
  type GColorItem (line 36) | typedef enum CSTM_COLORS {
  type GSchemes (line 73) | typedef enum SCHEMES {
  type GColorPair (line 83) | typedef struct GColorPair_ {
  type GColors (line 90) | typedef struct GColors_ {

FILE: src/commons.c
  function get_max_choices_internal (line 86) | static uint32_t
  function get_max_choices (line 126) | uint32_t
  function get_max_choices_sub (line 132) | uint32_t
  function get_percentage (line 140) | float
  function display_storage (line 146) | void
  function display_default_config_file (line 152) | void
  function display_version (line 166) | void
  function str2enum (line 196) | int
  function get_module_enum (line 228) | int
  function GAgents (line 245) | GAgents *
  function free_agents_array (line 258) | void
  function has_timestamp (line 277) | int
  function enable_panel (line 287) | int
  function ignore_panel (line 305) | int
  function get_num_modules (line 323) | uint32_t
  function get_module_index (line 339) | int
  function remove_module (line 356) | int
  function get_next_module (line 373) | int
  function get_prev_module (line 386) | int
  function verify_panels (line 408) | void
  function init_modules (line 454) | int
  function intmax_t (line 477) | intmax_t

FILE: src/commons.h
  type tm (line 48) | struct tm
  type GTypeIP (line 89) | typedef enum {
  type GModule (line 96) | typedef enum MODULES {
  type GSMetric (line 124) | typedef enum GSMetric_ {
  type GPercTotals (line 148) | typedef struct GPercTotals_ {
  type GMetrics (line 155) | typedef struct GMetrics {
  type GSubList (line 194) | typedef struct GSubList_ GSubList;
  type GSubItem (line 197) | typedef struct GSubItem_ {
  type GSubList_ (line 206) | struct GSubList_ {
  type GHolderItem (line 213) | typedef struct GHolderItem_ {
  type GHolder (line 219) | typedef struct GHolder_ {
  type GEnum (line 231) | typedef struct GEnum_ {
  type GDataMap (line 237) | typedef struct GDataMap_ {
  type GAgentItem (line 242) | typedef struct GAgentItem_ {
  type GAgents (line 246) | typedef struct GAgents_ {

FILE: src/csv.c
  type tm (line 51) | struct tm
  type GPanel (line 54) | typedef struct GPanel_ {
  function GPanel (line 92) | static const GPanel *
  function escape_cvs_output (line 104) | static void
  function print_csv_metric_block (line 122) | static void
  function print_csv_sub_items (line 163) | static void
  function print_csv_data (line 196) | static void
  function print_csv_summary (line 220) | static void
  function output_csv (line 298) | void

FILE: src/dialogs.c
  function set_agents (line 55) | static int
  function GAgents (line 85) | GAgents *
  function fill_host_agents_gmenu (line 114) | static int
  function load_agent_list (line 132) | void
  function load_help_popup (line 241) | void
  function load_sort_win (line 299) | void
  function clear_confdlg_status_bar (line 475) | static void
  function draw_formats (line 504) | static void
  function load_confdlg_error (line 559) | static void
  function render_confdlg (line 615) | int
  function scheme_chosen (line 806) | static void
  function load_schemes_win (line 849) | void
  function swap_modules (line 920) | static void
  function load_panels_win (line 927) | void

FILE: src/error.c
  type sigaction (line 55) | struct sigaction
  function dbg_log_open (line 58) | void
  function dbg_log_close (line 68) | void
  function invalid_log_open (line 76) | void
  function invalid_log_close (line 86) | void
  function unknowns_log_open (line 94) | void
  function unknowns_log_close (line 104) | void
  function set_signal_data (line 111) | void
  function access_log_open (line 118) | int
  function access_log_close (line 132) | void
  function setup_sigsegv_handler (line 139) | void
  function dump_struct_data (line 150) | static void
  function dump_struct (line 161) | static void
  function sigsegv_handler (line 177) | void
  function dbg_fprintf (line 216) | void
  function invalid_fprintf (line 230) | void
  function unknowns_fprintf (line 244) | void
  function dbg_printf (line 258) | void
  function access_fprintf (line 267) | void

FILE: src/fileio.c
  function is_gzipped_file (line 41) | static int
  function GFileHandle (line 62) | GFileHandle *
  function gfile_close (line 98) | void
  function gfile_eof (line 134) | int
  function gfile_read (line 152) | int
  function gfile_seek (line 174) | int
  function gfile_tell (line 194) | long
  function gfile_error (line 212) | int

FILE: src/fileio.h
  type GFileHandle (line 44) | typedef struct GFileHandle_ {

FILE: src/gchart.c
  function sub_list_has_metric (line 166) | static int
  function metric_has_data (line 214) | int
  function get_available_metrics (line 268) | int
  function get_metric_value (line 291) | static uint64_t
  type ChartItem (line 315) | typedef struct {
  function count_sub_items_recursive_chart (line 322) | static int
  function count_visible_sub_chart (line 337) | static int
  function flatten_sub_items (line 361) | static void
  function build_chart_items (line 385) | static int
  function apply_log_scale (line 440) | static uint64_t
  function draw_vbar (line 453) | static void
  function draw_axes (line 506) | static void
  function draw_chart_indicator (line 547) | static void
  function get_chart_selected_root (line 567) | static int
  function compute_bar_window (line 585) | static void
  function compute_local_max (line 611) | static uint64_t
  function compute_chart_window (line 622) | static void
  function draw_chart_bars (line 628) | static void
  function draw_chart_caret (line 659) | static void
  function check_top_padding (line 679) | static void
  function draw_panel_chart (line 695) | void

FILE: src/gchart.h
  type GHolder (line 37) | typedef struct GHolder_ GHolder;
  type GChartMetric (line 43) | typedef enum {
  type ChartDrawCtx (line 54) | typedef struct {

FILE: src/gdashboard.c
  function reset_find (line 57) | void
  function GDash (line 73) | GDash *
  function GDashData (line 85) | GDashData *
  function free_dashboard_data (line 93) | static void
  function free_dashboard (line 111) | void
  function GModule (line 132) | static GModule
  function get_num_collapsed_data_rows (line 152) | uint32_t
  function get_num_expanded_data_rows (line 165) | uint32_t
  function get_xpos (line 176) | static int
  function set_module_from_mouse_event (line 186) | int
  function set_max_metrics (line 263) | static void
  function set_max_hit_len (line 274) | static void
  function set_max_hit_perc_len (line 288) | static void
  function set_max_visitors_len (line 302) | static void
  function set_max_visitors_perc_len (line 316) | static void
  function set_max_bw_perc_len (line 330) | static void
  function set_max_bw_len (line 343) | static void
  function set_max_avgts_len (line 358) | static void
  function set_max_cumts_len (line 376) | static void
  function set_max_maxts_len (line 394) | static void
  function set_max_method_len (line 412) | static void
  function set_max_protocol_len (line 430) | static void
  function set_max_data_len (line 448) | static void
  function set_metrics_len (line 462) | static void
  function render_data_hosts (line 482) | static void
  function render_total_label (line 509) | static void
  function render_data (line 528) | static void
  function render_method (line 564) | static void
  function render_proto (line 590) | static void
  function render_avgts (line 613) | static void
  function render_cumts (line 637) | static void
  function render_maxts (line 661) | static void
  function render_bw (line 685) | static void
  function render_percent (line 709) | static void
  function render_hits_percent (line 729) | static void
  function render_visitors_percent (line 749) | static void
  function render_bw_percent (line 769) | static void
  function render_hits (line 789) | static void
  function render_visitors (line 816) | static void
  function render_header (line 843) | static void
  function render_metrics (line 870) | static void
  function render_data_line (line 914) | static void
  function print_horizontal_dash (line 968) | static void
  function lprint_col (line 974) | static void
  function rprint_col (line 987) | static void
  function render_cols (line 1001) | static void
  function compute_layout (line 1037) | static void
  function render_chart_row (line 1058) | static void
  function render_data_row (line 1103) | static void
  function render_row (line 1117) | static void
  function render_content (line 1140) | static void
  function display_content (line 1164) | void
  function reset_scroll_offsets (line 1190) | void
  function regexp_init (line 1207) | static int
  function expand_ancestors_and_calc_idx (line 1231) | static int
  function perform_find_dash_scroll (line 1323) | static void
  function find_next_sub_item (line 1370) | static int
  function perform_next_find (line 1419) | int
  function render_find_dialog (line 1491) | int
  function set_dash_metrics (line 1525) | static void
  function count_sub_items_recursive (line 1576) | static int
  function add_sub_item_to_dash_recursive (line 1597) | static void
  function add_item_to_dash (line 1662) | static void
  function count_visible_sub (line 1677) | static int
  function count_visible_items (line 1703) | static int
  function load_data_to_dash (line 1726) | void

FILE: src/gdashboard.h
  type PanelLayout (line 76) | typedef struct {
  type GDashRender (line 90) | typedef struct GDashRender_ {
  type GDashData (line 99) | typedef struct GDashData_ {
  type GDashMeta (line 107) | typedef struct GDashMeta_ {
  type GDashModule (line 129) | typedef struct GDashModule_ {
  type GDash (line 148) | typedef struct GDash_ {

FILE: src/gdns.c
  function gqueue_init (line 63) | void
  function gqueue_size (line 74) | int
  function gqueue_empty (line 82) | int
  function gqueue_full (line 90) | int
  function gqueue_destroy (line 96) | void
  function gqueue_enqueue (line 105) | int
  function gqueue_find (line 121) | int
  type sockaddr (line 155) | struct sockaddr
  type sockaddr (line 177) | struct sockaddr
  type sockaddr_in6 (line 178) | struct sockaddr_in6
  type sockaddr_in (line 179) | struct sockaddr_in
  function dns_resolver (line 197) | void
  function dns_worker (line 211) | static void
  function gdns_init (line 245) | void
  function gdns_free_queue (line 261) | void
  function gdns_thread_create (line 267) | void

FILE: src/gdns.h
  type GDnsThread (line 36) | typedef struct GDnsThread_ {
  type GDnsQueue (line 43) | typedef struct GDnsQueue_ {

FILE: src/geoip1.c
  function is_geoip_resource (line 54) | int
  function geoip_free (line 60) | void
  function GeoIP (line 82) | static GeoIP *
  function set_geoip_db_by_type (line 95) | static int
  function set_conf_by_type (line 124) | static int
  function set_geoip_db (line 152) | static int
  function set_geoip (line 170) | static void
  function init_geoip (line 192) | void
  function geoip_set_country (line 245) | static void
  function geoip_set_city (line 255) | static void
  function geoip_set_continent (line 262) | static void
  function geoip_set_asn (line 272) | static void
  function GeoIPRecord (line 285) | static GeoIPRecord *
  function geoip_set_country_by_record (line 299) | static void
  function geoip_get_geoid (line 323) | static int
  function geoip_set_country_by_geoid (line 353) | static void
  function geoip_set_continent_by_record (line 375) | static void
  function geoip_set_continent_by_geoid (line 395) | static void
  function geoip_set_city_by_record (line 413) | static void
  function geoip_get_city (line 433) | static void
  function geoip_get_country (line 466) | void
  function geoip_get_continent (line 518) | void
  function geoip_asn (line 568) | void
  function set_geolocation (line 588) | int

FILE: src/geoip1.h
  type GO_GEOIP_DB (line 45) | typedef enum {
  type GLocation (line 51) | typedef struct GLocation_ {

FILE: src/geoip2.c
  function is_geoip_resource (line 61) | int
  function geoip_free (line 67) | void
  function set_geoip (line 79) | static void
  function init_geoip (line 110) | void
  function geoip_lookup (line 123) | static int
  function geoip_set_country (line 175) | static void
  function geoip_set_asn (line 185) | static void
  function geoip_set_city (line 195) | static void
  function geoip_set_continent (line 202) | static void
  function geoip_query_city (line 245) | static void
  function geoip_query_country (line 268) | static void
  function geoip_query_asn_code (line 288) | static int
  function geoip_query_asn_name (line 306) | static int
  function geoip_asn (line 324) | void
  function geoip_query_continent (line 348) | static void
  function geoip_get_country (line 359) | void
  function geoip_get_continent (line 368) | void
  function set_geolocation (line 381) | int

FILE: src/gholder.c
  type GPanel (line 51) | typedef struct GPanel_ {
  function GPanel (line 97) | static const GPanel *
  function GHolder (line 111) | GHolder *
  function GHolderItem (line 122) | static GHolderItem *
  function GSubList (line 132) | static GSubList *
  function GSubItem (line 145) | static GSubItem *
  function add_sub_item_back (line 159) | static void
  function delete_sub_list (line 174) | static void
  function free_holder_data (line 197) | static void
  function free_holder_by_module (line 205) | void
  function free_holder (line 223) | void
  function get_item_idx_in_holder (line 248) | static int
  function sort_single_sub_list (line 268) | static void
  function sort_sub_list (line 338) | static void
  function set_host_child_metrics (line 351) | static int
  function set_host_sub_list (line 366) | static void
  function add_host_child_to_holder (line 430) | static void
  function map_data (line 468) | static int
  function set_single_metrics (line 488) | static void
  function add_data_to_holder (line 523) | static void
  function set_host (line 539) | static void
  function add_host_to_holder (line 549) | static void
  function set_root_metrics (line 610) | static int
  function add_root_to_holder (line 639) | static void
  function GSubItem (line 701) | static GSubItem *
  function add_geo_to_holder (line 715) | static void
  function load_holder_data (line 835) | void

FILE: src/gholder.h
  type GAnonymizeLevels (line 42) | typedef enum GAnonymizeLevels_ {

FILE: src/gkhash.c
  function GKHashDB (line 55) | static GKHashDB *
  function GKDB (line 64) | static GKDB *
  function del_igsl_free (line 185) | void
  function del_ii08 (line 206) | void
  function del_ii32 (line 221) | void
  function del_is32_free (line 236) | void
  function del_iu64 (line 253) | void
  function del_si32_free (line 269) | void
  function del_su64_free (line 286) | void
  function del_u648 (line 303) | void
  function des_igsl_free (line 319) | void
  function des_ii08 (line 340) | void
  function des_ii32 (line 349) | void
  function des_is32_free (line 358) | void
  function des_iu64 (line 378) | void
  function des_si32_free (line 388) | void
  function des_su64_free (line 410) | void
  function des_u648 (line 431) | void
  function des_si08_free (line 441) | static void
  function del_si08_free (line 463) | static void
  function del_ss32_free (line 481) | static void
  function des_ss32_free (line 501) | static void
  function des_iglp (line 523) | static void
  function free_app_metrics (line 548) | static void
  function Logs (line 594) | Logs *
  function GKHashDB (line 604) | static GKHashDB *
  function ins_iglp (line 625) | int
  function GKDB (line 647) | static GKDB *
  function ins_si08 (line 702) | int
  function ins_si08_ai (line 729) | static uint8_t
  function ins_si32 (line 748) | int
  function ins_si32_inc (line 775) | uint32_t
  function ins_ii32_inc (line 803) | uint32_t
  function ins_is32 (line 831) | int
  function ins_ss32 (line 854) | static int
  function ins_ii32 (line 886) | int
  function ins_ii08 (line 908) | int
  function ins_iu64 (line 930) | int
  function ins_su64 (line 952) | int
  function ins_u648 (line 979) | int
  function inc_ii32 (line 1002) | uint32_t
  function inc_su64 (line 1027) | int
  function inc_iu64 (line 1061) | int
  function inc_si32 (line 1088) | static uint32_t
  function ins_ii32_ai (line 1121) | uint32_t
  function find_int_key_in_list (line 1150) | static int
  function ins_igsl (line 1160) | int
  function get_si32 (line 1195) | uint32_t
  function get_si08 (line 1214) | uint8_t
  function get_ii08 (line 1233) | uint8_t
  function get_ii32 (line 1293) | uint32_t
  function get_iu64 (line 1312) | uint64_t
  function get_su64 (line 1332) | uint64_t
  function GLastParse (line 1353) | static GLastParse
  function get_ii32_min_max (line 1380) | void
  function get_iu64_min_max (line 1409) | void
  function ht_get_excluded_ips (line 1429) | uint32_t
  function ht_get_invalid (line 1440) | uint32_t
  function ht_get_processed (line 1451) | uint32_t
  function ht_get_processing_time (line 1462) | uint32_t
  function ht_insert_meth_proto (line 1473) | uint8_t
  function ht_inc_cnt_overall (line 1488) | uint32_t
  function ht_insert_last_parse (line 1499) | int
  function ht_ins_seq (line 1514) | uint32_t
  function ht_insert_hostname (line 1526) | int
  function ht_insert_json_logfmt (line 1541) | int
  function GLastParse (line 1570) | GLastParse
  function init_pre_storage (line 1607) | void
  function free_igdb (line 1615) | static void
  function des_igdb (line 1631) | static void
  function free_storage (line 1647) | void

FILE: src/gkhash.h
  type GKDB (line 45) | typedef struct GKDB_ GKDB;
  type GKHashStorage (line 47) | typedef struct GKHashStorage_ GKHashStorage;
  type GKHashDB (line 79) | typedef struct GKHashDB_ {
  type GKDB_ (line 84) | struct GKDB_ {

FILE: src/gkmhash.c
  function GKHashStorage (line 78) | static GKHashStorage *
  function GKHashModule (line 87) | static GKHashModule *
  function GKHashGlobal (line 96) | static GKHashGlobal *
  function GKHashGlobal (line 105) | static GKHashGlobal *
  function init_tables (line 122) | static void
  function GKHashModule (line 136) | static GKHashModule *
  function free_global_metrics (line 154) | static void
  function free_module_metrics (line 170) | static void
  function del_module_metrics (line 186) | static void
  function free_stores (line 199) | static void
  function ins_igkh (line 220) | static int
  function GSLList (line 316) | GSLList *
  function ht_insert_unique_key (line 348) | uint32_t
  function ht_insert_agent_key (line 373) | uint32_t
  function ht_insert_agent_value (line 393) | int
  function ht_insert_keymap (line 415) | uint32_t
  function ht_insert_rootmap (line 447) | int
  function ht_insert_datamap (line 470) | int
  function ht_insert_uniqmap (line 494) | int
  function ht_insert_root (line 510) | int
  function ht_insert_hits (line 527) | uint32_t
  function ht_insert_visitor (line 543) | uint32_t
  function ht_insert_bw (line 559) | int
  function ht_insert_cumts (line 575) | int
  function ht_insert_maxts (line 592) | int
  function ht_insert_method (line 612) | int
  function ht_insert_protocol (line 637) | int
  function ht_insert_agent (line 662) | int
  function ht_insert_meta_data (line 676) | int
  function ht_insert_date (line 686) | int
  function ht_inc_cnt_valid (line 697) | uint32_t
  function ht_inc_cnt_bw (line 707) | int
  function ht_sum_valid (line 717) | uint32_t
  function ht_sum_bw (line 738) | uint64_t
  function ht_get_size_dates (line 762) | uint32_t
  function ht_get_size_datamap (line 776) | uint32_t
  function ht_get_size_uniqmap (line 790) | uint32_t
  function ht_get_hits (line 851) | uint32_t
  function ht_get_visitors (line 866) | uint32_t
  function ht_get_bw (line 880) | uint64_t
  function ht_get_cumts (line 894) | uint64_t
  function ht_get_maxts (line 908) | uint64_t
  function get_method_proto (line 918) | uint8_t
  function GSLList (line 1006) | GSLList *
  function ht_get_keymap (line 1039) | uint32_t
  function ht_get_meta_data (line 1053) | uint64_t
  function ht_get_hits_min_max (line 1076) | void
  function ht_get_visitors_min_max (line 1091) | void
  function ht_get_bw_min_max (line 1106) | void
  function ht_get_cumts_min_max (line 1121) | void
  function ht_get_maxts_min_max (line 1136) | void
  function destroy_date_stores (line 1146) | static void
  function invalidate_date (line 1157) | int
  function ins_cache_map (line 1177) | static uint32_t
  function ins_cache_ii08 (line 1186) | static int
  function ins_cache_is32 (line 1197) | static int
  function inc_cache_ii32 (line 1208) | static int
  function max_cache_iu64 (line 1219) | static int
  function inc_cache_iu64 (line 1233) | static int
  function ins_raw_num_data (line 1244) | static int
  function set_raw_num_data_date (line 1289) | static int
  function rebuild_rawdata_cache (line 1307) | int
  function init_storage (line 1321) | void
  function des_igkh (line 1331) | void
  function free_cache (line 1347) | void
  function GRawData (line 1362) | static GRawData *
  function GRawData (line 1375) | static GRawData *
  function GRawData (line 1405) | static GRawData *
  function GRawData (line 1435) | GRawData *

FILE: src/gkmhash.h
  type GKHashMetric (line 35) | typedef struct GKHashMetric_ GKHashMetric;
  type GKHashModule (line 38) | typedef struct GKHashModule_ {
  type GKHashGlobal (line 44) | typedef struct GKHashGlobal_ {
  type GKHashStorage_ (line 48) | struct GKHashStorage_ {

FILE: src/gmenu.c
  function GMenu (line 44) | GMenu *
  function draw_menu_item (line 66) | static void
  function post_gmenu (line 86) | int
  function gmenu_driver (line 112) | void

FILE: src/gmenu.h
  type ACTION (line 47) | enum ACTION {
  type GMenu (line 53) | typedef struct GMenu_ GMenu;
  type GItem (line 54) | typedef struct GItem_ GItem;
  type GItem_ (line 57) | struct GItem_ {
  type GMenu_ (line 63) | struct GMenu_ {

FILE: src/goaccess.c
  function house_keeping_holder (line 141) | static void
  function free_scroll_state (line 159) | static void
  function house_keeping (line 170) | static void
  function cleanup (line 225) | static void
  function drop_permissions (line 243) | static void
  function write_pid_file (line 264) | static void
  function daemonize (line 280) | static void
  function allocate_holder_by_module (line 328) | static void
  function allocate_holder (line 346) | static void
  function allocate_data_by_module (line 358) | static void
  function allocate_data (line 391) | static void
  function clean_stdscrn (line 404) | static void
  function render_screens (line 413) | static void
  function collapse_current_module (line 447) | static int
  function disabled_panel_msg (line 464) | static void
  function set_module_to (line 474) | static int
  function scroll_to_first_line (line 492) | static void
  function scroll_to_last_line (line 503) | static void
  function load_ip_agent_list (line 520) | static void
  function toggle_selected_item_expand (line 537) | static void
  function expand_current_module (line 596) | static void
  function expand_module_from_ypos (line 627) | static int
  function expand_on_mouse_click (line 655) | static int
  function scroll_up_dashboard (line 670) | static void
  function scroll_down_expanded_module (line 676) | static void
  function scroll_up_expanded_module (line 705) | static void
  function page_down_module (line 726) | static void
  function page_up_module (line 761) | static void
  function render_search_dialog (line 787) | static int
  function search_next_match (line 805) | static int
  function tail_term (line 819) | static void
  function tail_html (line 833) | static void
  function fast_forward_client (line 858) | static void
  function read_client (line 877) | void
  function verify_inode (line 935) | static void
  function is_gzipped_file_check (line 959) | static int
  function perform_tail_follow (line 989) | static int
  function tail_loop_html (line 1071) | static void
  function process_html (line 1095) | static void
  function next_module (line 1123) | static int
  function previous_module (line 1138) | static int
  function window_resize (line 1153) | static void
  function render_sort_dialog (line 1166) | static void
  function term_tail_logs (line 1180) | static void
  function cycle_metric (line 1199) | static int
  function get_keys (line 1236) | static void
  function set_accumulated_time (line 1472) | static void
  function init_processing (line 1481) | static void
  function standard_output (line 1496) | static void
  function curses_output (line 1519) | static void
  function set_locale (line 1530) | static void
  function open_term (line 1553) | static int
  function FILE (line 1572) | static FILE *
  function set_io (line 1623) | static void
  function parse_cmd_line (line 1635) | static void
  function handle_signal_action (line 1641) | static void
  function setup_thread_signals (line 1658) | static void
  function block_thread_signals (line 1675) | static void
  function Logs (line 1689) | static Logs *
  function spawn_ws (line 1757) | static int
  function set_standard_output (line 1779) | static void
  function set_curses (line 1799) | static void
  function main (line 1832) | int

FILE: src/gslist.c
  function GSLList (line 43) | GSLList *
  function GSLList (line 56) | GSLList *
  function GSLList (line 70) | GSLList *
  function GSLList (line 83) | GSLList *
  function GSLList (line 94) | GSLList *
  function list_remove_nodes (line 112) | int
  function list_remove_node (line 130) | int
  function list_foreach (line 151) | int
  function list_count (line 165) | int

FILE: src/gslist.h
  type GSLList (line 34) | typedef struct GSLList_ {

FILE: src/gstorage.c
  function set_country_continent (line 60) | static void
  function free_country_continent_map (line 90) | void
  function new_modulekey (line 446) | static void
  function GParse (line 465) | static const GParse *
  function GMetrics (line 479) | GMetrics *
  function free_gmetrics (line 487) | void
  function set_module_totals (line 552) | void
  function set_data_metrics (line 562) | void
  function count_bw (line 608) | static void
  function count_invalid (line 614) | static void
  function uncount_invalid (line 642) | void
  function uncount_processed (line 654) | void
  function count_valid (line 665) | static void
  function count_process (line 673) | void
  function count_process_and_invalid (line 681) | void
  function excluded_ip (line 691) | int
  function insert_dkeymap (line 705) | static int
  function insert_rkeymap (line 715) | static int
  function insert_data (line 721) | static void
  function insert_uniqmap (line 731) | static int
  function insert_rootmap (line 738) | static void
  function insert_root (line 745) | static void
  function insert_hit (line 752) | static void
  function insert_visitor (line 760) | static void
  function insert_bw (line 768) | static void
  function insert_cumts (line 776) | static void
  function insert_maxts (line 784) | static void
  function insert_method (line 790) | static void
  function insert_protocol (line 797) | static void
  function insert_agent (line 804) | static void
  function append_query_string (line 859) | static void
  function get_kdata (line 883) | static void
  function get_kroot (line 893) | static void
  function set_spec_visitor_key (line 904) | static void
  function gen_visitor_key (line 936) | static int
  function gen_req_key (line 957) | static int
  function gen_request_key (line 978) | static int
  function gen_404_key (line 991) | static int
  function gen_static_request_key (line 1003) | static int
  function gen_vhost_key (line 1015) | static int
  function gen_remote_user_key (line 1031) | static int
  function gen_cache_status_key (line 1047) | static int
  function gen_host_key (line 1063) | static int
  function set_browser_os (line 1075) | void
  function gen_browser_key (line 1103) | static int
  function gen_os_key (line 1126) | static int
  function gen_mime_type_key (line 1175) | static int
  function gen_tls_type_key (line 1222) | static int
  function gen_referer_key (line 1264) | static int
  function gen_ref_site_key (line 1280) | static int
  function gen_keyphrase_key (line 1296) | static int
  function extract_geolocation (line 1313) | static int
  function gen_geolocation_key (line 1332) | static int
  function gen_asn_key (line 1379) | static int
  function gen_status_code_key (line 1403) | static int
  function parse_time_specificity_string (line 1425) | static void
  function gen_visit_time_key (line 1443) | static int
  function insert_methods_protocols (line 1459) | void
  function include_uniq (line 1472) | static int
  function set_datamap (line 1482) | static void
  function map_log (line 1522) | static void
  function ins_agent_key_val (line 1548) | static void
  function clean_old_data_by_date (line 1558) | static int
  function process_log (line 1595) | void

FILE: src/gstorage.h
  type GAMetric (line 40) | typedef enum GAMetric_ {
  type GSMetricType (line 52) | typedef enum GSMetricType_ {
  type GKHashMetric (line 79) | typedef struct GKHashMetric_ {
  type GKeyData (line 96) | typedef struct GKeyData_ {
  type GParse (line 114) | typedef struct GParse_ {
  type httpmethods (line 131) | typedef struct httpmethods_ {
  type httpprotocols (line 136) | typedef struct httpprotocols_ {

FILE: src/gwsocket.c
  function GWSReader (line 53) | GWSReader *
  function GWSWriter (line 64) | GWSWriter *
  function write_holder (line 76) | static int
  function clear_fifo_packet (line 95) | static void
  function broadcast_holder (line 113) | int
  function send_holder_to_client (line 135) | int
  function read_fifo (line 158) | int
  function onopen (line 226) | static int
  function validate_token_message (line 256) | static int
  function onmessage (line 352) | static int
  function set_ready_state (line 387) | void
  function open_fifoout (line 397) | int
  function open_fifoin (line 414) | int
  function set_self_pipe (line 426) | void
  function stop_ws_server (line 438) | void
  function start_server (line 469) | static void
  function set_ws_opts (line 489) | static void
  function setup_ws_server (line 517) | int

FILE: src/gwsocket.h
  type GWSReader (line 38) | typedef struct GWSReader_ {
  type GWSWriter (line 50) | typedef struct GWSWriter_ {

FILE: src/json.c
  type GPanel (line 55) | typedef struct GPanel_ {
  type GPanel_ (line 66) | struct GPanel_
  function GPanel (line 103) | static const GPanel *
  function GJSON (line 117) | static GJSON *
  function free_json (line 125) | static void
  function set_json_nlines (line 135) | void
  function set_json_buffer (line 142) | static void
  function pjson (line 175) | __attribute__((format (printf, 2, 3)))
  function fpjson (line 198) | void
  function escape_json_other (line 210) | static void
  function escape_json_output (line 262) | static void
  function pskeysval (line 300) | static void
  function fpskeyaval (line 309) | void
  function fpskeysval (line 318) | void
  function fpskeyival (line 327) | void
  function pskeyu64val (line 336) | static void
  function pskeyfval (line 345) | static void
  function popen_obj (line 354) | static void
  function fpopen_obj (line 361) | void
  function popen_obj_attr (line 368) | static void
  function fpopen_obj_attr (line 375) | void
  function pclose_obj (line 382) | static void
  function fpclose_obj (line 391) | void
  function popen_arr_attr (line 400) | static void
  function fpopen_arr_attr (line 407) | void
  function pclose_arr (line 414) | static void
  function fpclose_arr (line 423) | void
  function poverall_datetime (line 432) | static void
  function poverall_start_end_date (line 443) | static void
  function poverall_requests (line 458) | static void
  function poverall_valid_reqs (line 465) | static void
  function poverall_invalid_reqs (line 472) | static void
  function poverall_processed_time (line 479) | static void
  function poverall_visitors (line 486) | static void
  function poverall_files (line 493) | static void
  function poverall_excluded (line 500) | static void
  function poverall_refs (line 506) | static void
  function poverall_notfound (line 513) | static void
  function poverall_static_files (line 520) | static void
  function poverall_log_size (line 527) | static void
  function poverall_bandwidth (line 535) | static void
  function poverall_log_path (line 540) | static void
  function poverall_log (line 552) | static void
  function phits (line 567) | static void
  function pvisitors (line 584) | static void
  function pbw (line 601) | static void
  function pavgts (line 621) | static void
  function pcumts (line 629) | static void
  function pmaxts (line 637) | static void
  function pmethod (line 645) | static void
  function pprotocol (line 654) | static void
  function pmeta_i64_data (line 662) | static void
  function pmeta_i32_data (line 701) | static void
  function pmeta_data_unique (line 741) | static void
  function pmeta_data_hits (line 759) | static void
  function pmeta_data_visitors (line 773) | static void
  function pmeta_data_bw (line 787) | static void
  function pmeta_data_avgts (line 804) | static void
  function pmeta_data_cumts (line 831) | static void
  function pmeta_data_maxts (line 848) | static void
  function print_meta_data (line 864) | static void
  function print_json_block (line 885) | static void
  function process_host_agents (line 910) | static void
  function print_json_sub_items (line 942) | static void
  function print_json_host_geo (line 981) | static void
  function print_json_host_items (line 1003) | static void
  function print_data_metrics (line 1016) | static void
  function print_json_data (line 1048) | static void
  function num_panels (line 1068) | static int
  function print_json_summary (line 1079) | static void
  function GJSON (line 1122) | static GJSON *
  function output_json (line 1173) | void

FILE: src/json.h
  type GJSON (line 42) | typedef struct GJSON_ {

FILE: src/khash.h
  type khint32_t (line 135) | typedef unsigned int khint32_t;
  type khint32_t (line 137) | typedef unsigned long khint32_t;
  type khint64_t (line 141) | typedef unsigned long khint64_t;
  type khint64_t (line 143) | typedef unsigned long long khint64_t;
  type khint32_t (line 162) | typedef khint32_t khint_t;
  type khint_t (line 163) | typedef khint_t khiter_t;
  function kh_inline (line 442) | static kh_inline khint_t
  function kh_inline (line 462) | static kh_inline khint_t

FILE: src/opesys.h
  type GOpeSys (line 36) | typedef struct GOpeSys_ {

FILE: src/options.c
  type option (line 64) | struct option
  function cmd_help (line 174) | void
  function set_array_opt (line 382) | static void
  function parse_ws_auth_expire_option (line 401) | static int
  function parse_jwt_from_file (line 469) | static int
  function parse_jwt_from_env (line 485) | static int
  function parse_jwt_verify_option (line 502) | static int
  function parse_legacy_jwt_option (line 525) | static int
  function parse_plain_jwt_option (line 539) | static int
  function parse_ws_auth_option (line 572) | static int
  function validate_url_basic (line 604) | static int
  function parse_long_opt (line 624) | static void
  function verify_global_config (line 1031) | void
  function add_dash_filename (line 1058) | void
  function read_option_args (line 1074) | void

FILE: src/output.c
  function GHTML (line 173) | static const GHTML *
  function clean_output (line 185) | static void
  function print_html_title (line 221) | static void
  function print_html_header_styles (line 230) | static void
  function print_html_header (line 246) | static void
  function print_html_body (line 288) | static void
  function print_html_footer (line 328) | static void
  function get_chartdef_cnt (line 360) | static int
  function print_d3_chart_def_axis (line 371) | static void
  function print_d3_chart_def (line 385) | static void
  function print_plot_def (line 403) | static void
  function hits_visitors_plot (line 426) | static void
  function hits_visitors_req_plot (line 445) | static void
  function hits_bw_plot (line 467) | static void
  function hits_bw_req_plot (line 486) | static void
  function print_json_data (line 508) | static void
  function print_conn_def (line 523) | static void
  function print_def_metric (line 557) | static void
  function print_def_block (line 586) | static void
  function print_def_overall_requests (line 594) | static void
  function print_def_overall_valid_reqs (line 607) | static void
  function print_def_overall_invalid_reqs (line 620) | static void
  function print_def_overall_processed_time (line 633) | static void
  function print_def_overall_visitors (line 646) | static void
  function print_def_overall_files (line 659) | static void
  function print_def_overall_excluded (line 671) | static void
  function print_def_overall_refs (line 683) | static void
  function print_def_overall_notfound (line 695) | static void
  function print_def_overall_static_files (line 707) | static void
  function print_def_overall_log_size (line 719) | static void
  function print_def_overall_bandwidth (line 731) | static void
  function print_def_hits (line 743) | static void
  function print_def_visitors (line 756) | static void
  function print_def_bw (line 769) | static void
  function print_def_avgts (line 786) | static void
  function print_def_cumts (line 803) | static void
  function print_def_maxts (line 820) | static void
  function print_def_method (line 836) | static void
  function print_def_protocol (line 857) | static void
  function print_def_city (line 878) | static void
  function print_def_asn (line 893) | static void
  function print_def_country (line 910) | static void
  function print_def_hostname (line 926) | static void
  function print_def_data (line 942) | static void
  function count_plot_fp (line 972) | static int
  function print_def_plot (line 980) | static void
  function print_host_metrics (line 999) | static void
  function print_metrics (line 1024) | static void
  function print_def_metrics (line 1044) | static void
  function print_def_meta (line 1060) | static void
  function print_def_sort (line 1072) | static void
  function print_panel_def_meta (line 1089) | static void
  function print_json_def (line 1112) | static void
  function print_def_summary (line 1130) | static void
  function print_json_i18n_def (line 1158) | static void
  function print_json_def_summary (line 1218) | static void
  function print_json_defs (line 1235) | static void
  function FILE (line 1281) | static FILE *
  function output_html (line 1296) | void

FILE: src/output.h
  type GChartType (line 45) | typedef enum GChartType_ {
  type GChartDef (line 54) | typedef struct GChartDef_ {
  type GChart (line 60) | typedef struct GChart_ {
  type GHTMLPlot (line 66) | typedef struct GHTMLPlot_ {
  type GHTML (line 76) | typedef struct GHTML_ {
  type GDefMetric (line 85) | typedef struct GDefMetric_ {

FILE: src/parser.c
  function GRawData (line 77) | GRawData *
  function GRawDataItem (line 88) | GRawDataItem *
  function free_raw_data (line 95) | void
  function reset_struct (line 102) | void
  function Logs (line 113) | Logs *
  function set_glog (line 130) | int
  function set_log (line 173) | int
  function Logs (line 184) | Logs *
  function free_logerrors (line 215) | void
  function free_logs (line 228) | void
  function GLogItem (line 251) | GLogItem *
  function free_glog (line 299) | void
  function extract_keyphrase (line 392) | static int
  function extract_referer_site (line 447) | static int
  function verify_static_content (line 486) | static int
  function is_cache_hit (line 532) | static int
  function extract_tls_version_cipher (line 616) | static int
  function get_delim (line 680) | static void
  function find_alpha (line 744) | static void
  function find_alpha_count (line 758) | static int
  function set_date (line 776) | static int
  function set_time (line 792) | static int
  function spec_err (line 809) | static int
  function set_tm_dt_logitem (line 841) | static void
  function set_tm_tm_logitem (line 848) | static void
  function set_numeric_date (line 855) | static void
  function set_agent_hash (line 863) | static void
  function handle_default_case_token (line 869) | static int
  function normalize_mime_type (line 877) | static void
  function parse_specifier (line 964) | static int
  function set_xff_host (line 1461) | static int
  function find_xff_host (line 1512) | static int
  function special_specifier (line 1547) | static int
  function parse_format (line 1565) | static int
  function valid_line (line 1622) | static int
  function strip_qstring (line 1636) | static void
  function output_logerrors (line 1647) | void
  function verify_missing_fields (line 1677) | static int
  function handle_crawler (line 1701) | static int
  function is_static (line 1716) | static int
  function ignore_status_code (line 1726) | static int
  function ignore_static (line 1744) | static int
  function is_404 (line 1755) | static int
  function ignore_line (line 1771) | static int
  function is_likely_same_log (line 1826) | static int
  function should_restore_from_disk (line 1847) | static int
  function process_invalid (line 1894) | static void
  function parse_json_specifier (line 1932) | static int
  function parse_json_format (line 1952) | static int
  function atomic_lpts_update (line 1964) | static int
  function cleanup_logitem (line 1986) | static int
  function validate_and_parse_line (line 1997) | static int
  function collect_invalid_errors (line 2012) | static void
  function handle_invalid_line (line 2032) | static int
  function apply_post_parse_processing (line 2048) | static int
  function enrich_logitem (line 2067) | static void
  function parse_line (line 2104) | int
  function GLogItem (line 2152) | static GLogItem *
  type timespec (line 2219) | struct timespec
  function init_jobs (line 2270) | static void
  function read_lines_from_file (line 2303) | static void

FILE: src/parser.h
  type GLogProp (line 64) | typedef struct GLogProp_ {
  type GLogItem (line 72) | typedef struct GLogItem_ {
  type GLastParse (line 123) | typedef struct GLastParse_ {
  type GLog (line 132) | typedef struct GLog_ {
  type Logs (line 153) | typedef struct Logs_ {
  type GJob (line 165) | typedef struct GJob_ {
  type datatype (line 174) | typedef enum {
  type GRawDataItem (line 180) | typedef struct GRawDataItem_ {
  type GRawData (line 189) | typedef struct GRawData_ {

FILE: src/pdjson.c
  type json_stack (line 51) | struct json_stack {
  function push (line 56) | static enum json_type
  function pop (line 86) | static enum json_type
  function buffer_peek (line 96) | static int
  function buffer_get (line 104) | static int
  function stream_get (line 111) | static int
  function stream_peek (line 117) | static int
  function init (line 124) | static void
  function is_match (line 146) | static enum json_type
  function pushchar (line 159) | static int
  function init_string (line 176) | static int
  function encode_utf8 (line 191) | static int
  function hexchar (line 217) | static int
  function read_unicode_cp (line 263) | static long
  function read_unicode (line 289) | static int
  function read_escaped (line 340) | static int
  function char_needs_escaping (line 374) | static int
  function utf8_seq_length (line 383) | static int
  function is_legal_utf8 (line 412) | static int
  function read_utf8 (line 465) | static int
  function read_string (line 492) | static enum json_type
  function is_digit (line 525) | static int
  function read_digits (line 530) | static int
  function read_number (line 549) | static enum json_type
  function json_isspace (line 610) | bool
  function next (line 624) | static int
  function read_value (line 633) | static enum json_type
  function json_peek (line 672) | enum json_type
  function json_next (line 682) | enum json_type
  function json_reset (line 788) | void
  function json_skip (line 796) | enum json_type
  function json_skip_until (line 824) | enum json_type
  function json_get_number (line 849) | double
  function json_get_lineno (line 860) | size_t
  function json_get_position (line 865) | size_t
  function json_get_depth (line 870) | size_t
  function json_get_context (line 884) | enum json_type
  function json_source_get (line 895) | int
  function json_source_peek (line 903) | int
  function json_open_buffer (line 908) | void
  function json_open_string (line 917) | void
  function json_open_stream (line 922) | void
  function user_get (line 930) | static int
  function user_peek (line 935) | static int
  function json_open_user (line 940) | void
  function json_set_allocator (line 950) | void
  function json_set_streaming (line 955) | void
  function json_close (line 963) | void

FILE: src/pdjson.h
  type json_type (line 20) | enum json_type {
  type json_allocator (line 26) | struct json_allocator {
  type json_stream (line 34) | typedef struct json_stream json_stream;
  type json_allocator (line 35) | typedef struct json_allocator json_allocator;
  type json_type (line 54) | enum json_type
  type json_source (line 68) | struct json_source {
  type json_stream (line 88) | struct json_stream {

FILE: src/persistence.c
  type stat (line 55) | struct stat
  function restore_global_si08 (line 83) | static void
  function persist_global_si08 (line 100) | static void
  function restore_global_si32 (line 125) | static void
  function persist_global_si32 (line 142) | static void
  function restore_global_iglp (line 167) | static void
  function persist_global_iglp (line 183) | static void
  function close_tpl (line 251) | static void
  function insert_restored_date (line 264) | static int
  function restore_si32 (line 281) | static int
  function migrate_si32_to_ii32 (line 312) | static int
  function migrate_si32_to_ii32_unique_keys (line 374) | static int
  function persist_si32 (line 406) | static int
  function migrate_is32_to_ii08 (line 436) | static int
  function restore_is32 (line 476) | static int
  function persist_is32 (line 508) | static int
  function restore_ii08 (line 538) | static int
  function restore_ii32 (line 568) | static int
  function persist_ii32 (line 596) | static int
  function persist_ii08 (line 623) | static int
  function restore_u648 (line 652) | static int
  function persist_u648 (line 681) | static int
  function restore_iu64 (line 710) | static int
  function persist_iu64 (line 739) | static int
  function restore_su64 (line 768) | static int
  function persist_su64 (line 798) | static int
  function restore_igsl (line 827) | static int
  function persist_igsl (line 855) | static int
  function restore_by_type (line 889) | static void
  function restore_metric_type (line 929) | static void
  function migrate_metric (line 938) | static int
  function persist_by_type (line 1006) | static void
  function persist_metric_type (line 1042) | static void
  function persist_dates (line 1051) | static void
  function restore_dates (line 1076) | static void
  function restore_global (line 1104) | static void
  function persist_global (line 1139) | static void
  function persist_data (line 1174) | void
  function restore_data (line 1195) | void
  function free_persisted_data (line 1223) | void

FILE: src/settings.c
  function in_ignore_cmd_opts (line 118) | static int
  function set_default_static_files (line 172) | void
  function free_formats (line 231) | void
  function free_cmd_args (line 243) | void
  function append_to_argv (line 256) | static void
  function parse_conf_file (line 270) | int
  function get_log_format_item_enum (line 356) | static int
  function get_selected_format_idx (line 378) | size_t
  function is_date_abbreviated (line 592) | static int
  function set_spec_date_time_num_format (line 639) | static void
  function set_spec_date_time_format (line 663) | static void
  function set_date_num_format (line 695) | static int
  function is_json_log_format (line 728) | int
  function dec_json_key (line 752) | static void
  function parse_json_string (line 780) | int
  function set_spec_date_format (line 874) | void
  function set_date_format_str (line 900) | void
  function set_time_format_str (line 927) | void
  function contains_specifier (line 952) | static void
  function set_log_format_str (line 971) | void

FILE: src/settings.h
  type GLogType (line 48) | typedef enum LOGTYPE {
  type GPreConfTime (line 65) | typedef struct GPreConfTime_ {
  type GPreConfDate (line 72) | typedef struct GPreConfDate_ {
  type GPreConfLog (line 80) | typedef struct GPreConfLog_ {
  type GConf (line 98) | typedef struct GConf_

FILE: src/sha1.c
  function SHA1Transform (line 50) | void
  function SHA1Init (line 165) | void
  function SHA1Update (line 179) | void
  function SHA1Final (line 202) | void

FILE: src/sha1.h
  type SHA1_CTX (line 9) | typedef struct {

FILE: src/sort.c
  function strcmp_asc (line 131) | int
  function cmp_data_asc (line 137) | static int
  function cmp_data_desc (line 145) | static int
  function cmp_num_desc (line 153) | static int
  function cmp_num_asc (line 165) | static int
  function cmp_vis_desc (line 177) | static int
  function cmp_vis_asc (line 189) | static int
  function cmp_raw_num_desc (line 201) | static int
  function cmp_raw_str_desc (line 213) | static int
  function cmp_bw_desc (line 222) | static int
  function cmp_bw_asc (line 234) | static int
  function cmp_avgts_desc (line 246) | static int
  function cmp_avgts_asc (line 258) | static int
  function cmp_cumts_desc (line 270) | static int
  function cmp_cumts_asc (line 282) | static int
  function cmp_maxts_desc (line 294) | static int
  function cmp_maxts_asc (line 306) | static int
  function cmp_proto_asc (line 318) | static int
  function cmp_proto_desc (line 326) | static int
  function cmp_mthd_asc (line 334) | static int
  function cmp_mthd_desc (line 342) | static int
  function cmp_ui32_asc (line 351) | __attribute__((no_sanitize ("implicit-conversion", "unsigned-integer-ove...
  function cmp_ui32_desc (line 360) | int
  function get_sort_field_enum (line 371) | int
  function get_sort_order_enum (line 380) | int
  function set_initial_sort (line 425) | void
  function can_sort_module (line 446) | int
  function parse_initial_sort (line 476) | void
  function sort_holder_items (line 488) | void
  function GRawData (line 552) | GRawData *
  function GRawData (line 561) | GRawData *

FILE: src/sort.h
  type GSortField (line 48) | typedef enum GSortField_ {
  type GSortOrder (line 61) | typedef enum GSortOrder_ {
  type GSort (line 67) | typedef struct GSort_ {

FILE: src/tpl.c
  type ushort (line 46) | typedef unsigned short ushort;
  type __int16 (line 47) | typedef __int16 int16_t;
  type __int32 (line 48) | typedef __int32 int32_t;
  type __int64 (line 49) | typedef __int64 int64_t;
  type tpl_pidx (line 127) | typedef struct tpl_pidx {
  type tpl_atyp (line 133) | typedef struct tpl_atyp {
  type tpl_backbone (line 141) | typedef struct tpl_backbone {
  type tpl_mmap_rec (line 153) | typedef struct tpl_mmap_rec {
  type tpl_root_data (line 160) | typedef struct tpl_root_data {
  type tpl_type_t (line 169) | struct tpl_type_t {
  type tpl_double_alignment_detector (line 207) | struct tpl_double_alignment_detector {
  type tpl_int64_alignment_detector (line 214) | struct tpl_int64_alignment_detector {
  type tpl_pound_data (line 219) | typedef struct {
  type tpl_type_t (line 240) | struct tpl_type_t
  function tpl_oops (line 258) | static int
  function tpl_node (line 268) | static tpl_node *
  type tpl_double_alignment_detector (line 305) | struct tpl_double_alignment_detector
  type tpl_int64_alignment_detector (line 309) | struct tpl_int64_alignment_detector
  function TPL_API (line 321) | TPL_API tpl_node *
  function TPL_API (line 332) | TPL_API tpl_node *
  function tpl_unmap_file (line 617) | static int
  function tpl_free_keep_map (line 629) | static void
  function TPL_API (line 727) | TPL_API void
  function tpl_node (line 839) | static tpl_node *
  function tpl_ser_osz (line 979) | static size_t
  function TPL_API (line 1050) | TPL_API int
  function tpl_dump_to_mem (line 1144) | static int
  function tpl_cpu_bigendian (line 1234) | static int
  function tpl_sanity (line 1251) | static int
  function tpl_needs_endian_swap (line 1350) | static int
  function tpl_size_for (line 1359) | static size_t
  function TPL_API (line 1369) | TPL_API char *
  function TPL_API (line 1550) | TPL_API int
  function TPL_API (line 1603) | TPL_API int
  function TPL_API (line 1682) | TPL_API int
  function tpl_free_atyp (line 1696) | static void
  function tpl_serlen (line 1771) | static int
  function tpl_mmap_output_file (line 1872) | static int
  function tpl_mmap_file (line 1906) | static int
  function TPL_API (line 1932) | TPL_API int
  function TPL_API (line 2103) | TPL_API int
  function tpl_unpackA0 (line 2254) | static int
  function tpl_byteswap (line 2330) | static void
  function tpl_fatal (line 2342) | static void
  function TPL_API (line 2355) | TPL_API int
  function tpl_gather_blocking (line 2400) | static int
  function tpl_gather_nonblocking (line 2469) | static int
  function tpl_gather_mem (line 2587) | static int

FILE: src/tpl.h
  type tpl_hook_t (line 83) | typedef struct tpl_hook_t {
  type tpl_node (line 93) | typedef struct tpl_node {
  type tpl_bin (line 105) | typedef struct tpl_bin {
  type tpl_gather_t (line 111) | typedef struct tpl_gather_t {

FILE: src/ui.c
  type Field (line 96) | typedef struct Field_ {
  function GOutput (line 109) | const GOutput *
  function init_colors (line 120) | void
  function set_input_opts (line 131) | void
  function close_win (line 147) | void
  function generate_time (line 158) | void
  function end_spinner (line 167) | void
  function set_wbkgd (line 183) | void
  function init_windows (line 196) | void
  function draw_header (line 220) | void
  function term_size (line 237) | void
  function update_active_module (line 374) | void
  function render_overall_field (line 390) | static void
  function render_overall_value (line 398) | static void
  function get_start_end_parsing_dates (line 521) | int
  function render_overall_header (line 561) | static void
  function render_overall_statistics (line 571) | static void
  function display_general (line 615) | void
  function format_stats (line 824) | static void
  function SpinnerSnapshot (line 830) | static SpinnerSnapshot
  function render_curses (line 854) | static void
  function render_plain (line 908) | static void
  function render_fallback (line 960) | static void
  function ui_spinner (line 968) | static void
  function ui_spinner_create (line 1023) | void
  function set_curses_spinner (line 1032) | void
  function lock_spinner (line 1049) | void
  function unlock_spinner (line 1056) | void
  function init_item_expanded (line 1064) | void
  function free_item_expanded (line 1075) | void
  function reset_item_expanded (line 1085) | void
  function GSpinner (line 1093) | GSpinner *

FILE: src/ui.h
  type GFind (line 145) | typedef struct GFind_ {
  type SpinnerSnapshot (line 157) | typedef struct {
  type GScrollModule (line 165) | typedef struct GScrollModule_ {
  type GScroll (line 178) | typedef struct GScroll_ {
  type GSpinner (line 185) | typedef struct GSpinner_ {
  type GOutput (line 205) | typedef struct GOutput_ {

FILE: src/util.c
  function xstrncpy (line 155) | void
  function genstr (line 166) | void
  function count_matches (line 179) | int
  function djb2 (line 197) | uint32_t
  function wc_match (line 212) | static int
  function handle_referer (line 316) | static int
  function ignore_referer (line 358) | int
  function hide_referer (line 368) | int
  function within_range (line 377) | static int
  function ip_in_range (line 418) | int
  function find_output_type (line 460) | int
  function valid_output_type (line 490) | int
  function time_t (line 568) | static time_t
  function set_tz (line 576) | void
  function parse_tz_specifier (line 609) | static int
  type tm (line 662) | struct tm
  function convert_date (line 732) | int
  function invalid_ipaddr (line 760) | int
  function u64encode (line 789) | uint64_t
  function u64decode (line 795) | void
  function off_t (line 805) | off_t
  function is_valid_http_status (line 843) | int
  function str_inarray (line 852) | int
  function decode_hex (line 986) | void
  function ptr2int (line 1017) | int
  function str2int (line 1031) | int
  function intlen (line 1043) | int
  function strip_newlines (line 1087) | void
  function append_str (line 1148) | size_t
  function is_writable_path (line 1257) | int

FILE: src/util.h
  type tm (line 103) | struct tm

FILE: src/websocket.c
  type pollfd (line 88) | struct pollfd
  function verify_utf8 (line 102) | static uint32_t
  function utf8_decode (line 122) | static uint32_t
  type pollfd (line 178) | struct pollfd
  type pollfd (line 180) | struct pollfd
  function set_pollfd (line 192) | static void
  function unset_pollfd (line 212) | static void
  function WSServer (line 240) | static WSServer *
  function WSClient (line 248) | static WSClient *
  function WSHeaders (line 257) | static WSHeaders *
  function WSFrame (line 267) | static WSFrame *
  function WSMessage (line 277) | static WSMessage *
  function WSPipeOut (line 285) | static WSPipeOut *
  function WSPipeIn (line 294) | static WSPipeIn *
  function chop_nchars (line 357) | static size_t
  function ws_find_client_sock_in_list (line 372) | static int
  function GSLList (line 382) | static GSLList *
  function WSClient (line 395) | static WSClient *
  function ws_free_frame (line 406) | static void
  function ws_free_message (line 414) | static void
  function ws_free_header_fields (line 424) | static void
  function ws_close (line 459) | static void
  function ws_clear_queue (line 466) | static void
  function ws_clear_handshake_headers (line 488) | static void
  function ws_remove_client_from_list (line 495) | static void
  function ws_shutdown_dangling_clients (line 511) | static void
  function ws_ssl_cleanup (line 521) | static void
  function ws_remove_dangling_clients (line 541) | static int
  function ws_clear_fifo_packet (line 562) | static void
  function ws_clear_pipein (line 573) | static void
  function ws_clear_pipeout (line 590) | static void
  function ws_stop (line 605) | void
  function ws_set_status (line 637) | static int
  function ws_append_str (line 645) | static void
  function initialize_ssl_ctx (line 663) | static int
  function log_return_message (line 708) | static void
  function shutdown_ssl (line 762) | static int
  function accept_ssl (line 802) | static int
  function handle_accept_ssl (line 841) | static void
  function handle_ssl_pending_rw (line 865) | static int
  function send_ssl_buffer (line 900) | static int
  function read_ssl_socket (line 938) | static int
  type sockaddr (line 978) | struct sockaddr
  type sockaddr_in (line 980) | struct sockaddr_in
  type sockaddr_in6 (line 982) | struct sockaddr_in6
  function set_nonblocking (line 986) | void
  function accept_client (line 996) | static int
  function ws_set_header_key_value (line 1084) | static void
  function ws_verify_req_headers (line 1111) | static int
  function ws_set_header_fields (line 1172) | static int
  function parse_headers (line 1223) | static int
  function ws_queue_sockbuf (line 1259) | static void
  function read_plain_socket (line 1280) | static int
  function read_socket (line 1299) | static int
  function send_plain_buffer (line 1311) | static int
  function send_buffer (line 1316) | static int
  function ws_respond_data (line 1332) | static int
  function ws_respond_cache (line 1351) | static int
  function ws_realloc_send_buf (line 1375) | static int
  function ws_respond (line 1403) | static int
  function ws_send_frame (line 1428) | static int
  function ws_error (line 1474) | static int
  function access_log (line 1492) | static void
  function http_error (line 1534) | static int
  function ws_sha1_digest (line 1545) | static void
  function ws_set_handshake_headers (line 1555) | static void
  function ws_send_handshake_headers (line 1585) | static int
  function ws_get_handshake (line 1615) | static int
  function ws_send_data (line 1693) | int
  function ws_read_header (line 1707) | static int
  function ws_read_payload (line 1727) | static int
  function ws_set_front_header_fields (line 1747) | static int
  function ws_unmask_payload (line 1765) | static void
  function ws_handle_close (line 1776) | static int
  function ws_handle_err (line 1785) | static int
  function ws_handle_pong (line 1792) | static void
  function ws_handle_ping (line 1805) | static void
  function ws_validate_string (line 1869) | int
  function ws_handle_text_bin (line 1886) | static void
  function ws_manage_payload_opcode (line 1931) | static void
  function ws_set_extended_header_size (line 1967) | static void
  function ws_set_payloadlen (line 1983) | static void
  function ws_set_masking_key (line 2005) | static void
  function ws_get_frm_header (line 2029) | static int
  function ws_realloc_frm_payload (line 2095) | static int
  function ws_get_frm_payload (line 2118) | static int
  function ws_get_message (line 2159) | static int
  function read_client_data (line 2171) | static int
  function handle_tcp_close (line 2186) | static void
  function handle_read_close (line 2227) | static void
  function handle_accept (line 2240) | static void
  function handle_reads (line 2262) | static void
  function handle_write_close (line 2289) | static void
  function handle_writes (line 2295) | static void
  function ws_setfifo (line 2325) | int
  function ws_openfifo_in (line 2344) | static void
  function ws_openfifo_out (line 2354) | static int
  function ws_fifo (line 2372) | static void
  function clear_fifo_queue (line 2381) | static void
  function ws_realloc_fifobuf (line 2402) | static int
  function ws_queue_fifobuf (line 2426) | static void
  function ws_write_fifo_data (line 2446) | static int
  function ws_write_fifo_cache (line 2471) | static int
  function ws_write_fifo (line 2499) | int
  function clear_fifo_packet (line 2528) | static void
  function ws_broadcast_fifo (line 2543) | static int
  function ws_broadcast_fifo_to_clients (line 2563) | static void
  function ws_send_strict_fifo_to_client (line 2594) | static void
  function ws_read_fifo (line 2614) | int
  function pack_uint32 (line 2631) | size_t
  function unpack_uint32 (line 2642) | size_t
  function validate_fifo_packet (line 2655) | static int
  function handle_strict_fifo (line 2672) | static void
  function handle_fixed_fifo (line 2736) | static void
  function handle_fifo (line 2768) | static void
  function ws_socket (line 2778) | static void
  function ws_start (line 2835) | void
  function ws_set_config_origin (line 2941) | void
  function ws_set_config_frame_size (line 2947) | void
  function ws_set_config_pipein (line 2953) | void
  function ws_set_config_pipeout (line 2959) | void
  function ws_set_config_accesslog (line 2965) | void
  function ws_set_config_strict (line 2974) | void
  function ws_set_config_echomode (line 2980) | void
  function ws_set_config_host (line 2986) | void
  function ws_set_config_unix_socket (line 2992) | void
  function ws_set_config_port (line 2998) | void
  function ws_set_config_sslcert (line 3004) | void
  function ws_set_config_sslkey (line 3010) | void
  function ws_set_config_auth_secret (line 3016) | void
  function ws_set_config_auth_cb (line 3021) | void
  function WSServer (line 3027) | WSServer *

FILE: src/websocket.h
  type WSStatus (line 139) | typedef enum WSSTATUS {
  type WSOpcode (line 152) | typedef enum WSOPCODE {
  type WSQueue (line 162) | typedef struct WSQueue_ {
  type WSPacket (line 167) | typedef struct WSPacket_ {
  type WSHeaders (line 175) | typedef struct WSHeaders_ {
  type WSFrame (line 199) | typedef struct WSFrame_ {
  type WSMessage (line 217) | typedef struct WSMessage_ {
  type WSClient (line 228) | typedef struct WSClient_ {
  type WSPipeIn (line 249) | typedef struct WSPipeIn_ {
  type WSPipeOut (line 259) | typedef struct WSPipeOut_ {
  type WSConfig (line 266) | typedef struct WSConfig_ {
  type WSServer (line 289) | typedef struct WSServer_ {

FILE: src/win/mmap.c
  function munmap (line 127) | int
  function msync (line 148) | int

FILE: src/wsauth.c
  type tm (line 135) | struct tm
  function verify_jwt_signature (line 155) | static int
  function validate_jwt_claims (line 220) | static int
  function verify_jwt_token (line 308) | int
Condensed preview — 135 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,528K chars).
[
  {
    "path": ".codespellrc",
    "chars": 219,
    "preview": "[codespell]\nskip=./.git,./po,./resources/js/*.min.js,./resources/css/*.min.css\ncheck-hidden=\ncheck-filenames=\nbuiltin=cl"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 642,
    "preview": "# These are supported funding model platforms\n\ngithub: allinurl\npatreon: # Replace with a single Patreon username\nopen_c"
  },
  {
    "path": ".github/workflows/build-test.yml",
    "chars": 3021,
    "preview": "name: C build and Test\n\non:\n  push:\n    branches:\n      - \"master\"\n  pull_request:\n    branches:\n      - \"master\"\n\njobs:"
  },
  {
    "path": ".github/workflows/deb-packaging-buildx.yml",
    "chars": 5706,
    "preview": "name: .deb packaging buildx\n\non:\n  workflow_dispatch:\n\njobs:\n  build_job:\n    runs-on: ubuntu-latest\n    strategy:\n     "
  },
  {
    "path": ".github/workflows/deb-packaging.yml",
    "chars": 4830,
    "preview": "name: .deb packaging\n\non:\n  workflow_dispatch:\n\njobs:\n  build_job:\n    # The host should always be linux\n    runs-on: ub"
  },
  {
    "path": ".github/workflows/docker-publish.yml",
    "chars": 2079,
    "preview": "name: Docker\non:\n  push:\n    # Publish `master` as Docker `latest` image.\n    branches:\n      - master\n    # Publish `v1"
  },
  {
    "path": ".github/workflows/spelling.yml",
    "chars": 958,
    "preview": "# yaml-language-server: $schema=https://json.schemastore.org/github-workflow\n\nname: \"Spelling\"\n\non:\n  workflow_dispatch:"
  },
  {
    "path": ".gitignore",
    "chars": 1534,
    "preview": "#custom section\nconfig.status\nconfig.guess\nconfig.sub\nconfig.rpath\nconfigure~\n**/.deps/\n/INSTALL\n/Makefile\nsrc/.dirstamp"
  },
  {
    "path": "AUTHORS",
    "chars": 7080,
    "preview": "GoAccess was designed and developed by Gerardo Orellana <goaccess@prosoftcorp.com>\n\nSpecial thanks to the following indi"
  },
  {
    "path": "COPYING",
    "chars": 1110,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2009-2022 Gerardo Orellana <hello @ goaccess.io>\n\nPermission is hereby granted, fre"
  },
  {
    "path": "ChangeLog",
    "chars": 63646,
    "preview": "Changes to GoAccess 1.10.1 - Saturday, February 14, 2026\n\n  - Fixed a crash when restoring persisted data via `--restore"
  },
  {
    "path": "DOCKER.md",
    "chars": 1201,
    "preview": "\n# Docker image features\n\n* This command uses the language set for this system. If that does not support it will be outp"
  },
  {
    "path": "Dockerfile",
    "chars": 1069,
    "preview": "# Build stage\nFROM alpine:3.20 AS builds\nRUN apk add --no-cache \\\n    autoconf \\\n    automake \\\n    build-base \\\n    cla"
  },
  {
    "path": "Dockerfile.debian-12",
    "chars": 319,
    "preview": "# Used to have all compile dependencies isolated in a container image.\nFROM debian:12\n\nRUN apt update -qqq\nRUN apt insta"
  },
  {
    "path": "Makefile.am",
    "chars": 9285,
    "preview": "#AUTOMAKE_OPTIONS = foreign\nbin_PROGRAMS = goaccess\nAUTOMAKE_OPTIONS = subdir-objects\n\ndist_noinst_DATA =               "
  },
  {
    "path": "NEWS",
    "chars": 8264,
    "preview": "Copyright (C) 2009-2026\nGerardo Orellana <goaccess@prosoftcorp.com>\n\n* Version history:\n    - 1.10.1 [Saturday, Feb 14, "
  },
  {
    "path": "README.md",
    "chars": 20190,
    "preview": "GoAccess [![C build](https://github.com/allinurl/goaccess/actions/workflows/build-test.yml/badge.svg)](https://github.co"
  },
  {
    "path": "SECURITY.md",
    "chars": 1311,
    "preview": "# Security Policy\n\nFound a security issue in [GoAccess](https://github.com/allinurl/goaccess)?\nRead on.\n\n## Reporting a "
  },
  {
    "path": "TODO",
    "chars": 362,
    "preview": "Copyright (C) 2009-2026\n6erardo Orellana <goaccess@prosoftcorp.com>\n\nFor a more comprehensive list of to-do items, pleas"
  },
  {
    "path": "build-dynamic.sh",
    "chars": 477,
    "preview": "#!/usr/bin/env sh\n# Build dynamic linked binaries on Debian.\nset -o nounset   ## set -u : exit the script if you try to "
  },
  {
    "path": "config/browsers.list",
    "chars": 3330,
    "preview": "# List of browsers and their categories\n# e.g., WORD delimited by tab(s) TYPE\n# TYPE can be any type and it's not limite"
  },
  {
    "path": "config/goaccess.conf",
    "chars": 21918,
    "preview": "######################################\n# Time Format Options (required)\n######################################\n#\n# The h"
  },
  {
    "path": "config/podcast.list",
    "chars": 1686,
    "preview": "# vim: set noexpandtab:\n#1 This file is a user agent list of various podcast-related agents (but not\n#2 limited to). It "
  },
  {
    "path": "configure.ac",
    "chars": 8747,
    "preview": "#                                               -*- Autoconf -*-\n# Process this file with autoconf to produce a configur"
  },
  {
    "path": "docker-compose/README.md",
    "chars": 1352,
    "preview": "# Docker-compose configuration\n\nHere are two docker-compose configurations for goaccess which\ncombine a static site with"
  },
  {
    "path": "docker-compose/configs/goaccess.traefik.conf",
    "chars": 202,
    "preview": "tz Europe/Zurich\ntime-format %H:%M:%S\ndate-format %Y-%m-%d\nlog-format COMBINED\nlog-file /srv/logs/access.log\noutput /srv"
  },
  {
    "path": "docker-compose/configs/goaccess.vanilla.conf",
    "chars": 253,
    "preview": "tz Europe/Zurich\ntime-format %H:%M:%S\ndate-format %Y-%m-%d\nlog-format COMBINED\nlog-file /srv/logs/access.log\noutput /srv"
  },
  {
    "path": "docker-compose/configs/nginx.conf",
    "chars": 647,
    "preview": "user  nginx;\nworker_processes  auto;\n\nerror_log  /var/log/nginx/error.log notice;\npid        /var/run/nginx.pid;\n\n\nevent"
  },
  {
    "path": "docker-compose/docker-compose.traefik.yaml",
    "chars": 828,
    "preview": "services:\n  web:\n    image: nginx\n    volumes:\n      - ./logs:/var/log/nginx\n      - ./configs/nginx.conf:/etc/nginx/ngi"
  },
  {
    "path": "docker-compose/docker-compose.vanilla.yaml",
    "chars": 540,
    "preview": "services:\n  web:\n    image: nginx\n    ports:\n      - 8080:80\n    volumes:\n      - ./logs:/var/log/nginx\n      - ./config"
  },
  {
    "path": "goaccess.1",
    "chars": 50158,
    "preview": ".TH goaccess 1 \"FEB 2026\" GNU+Linux \"User Manuals\"\n.SH NAME\ngoaccess \\- fast web log analyzer and interactive viewer.\n.S"
  },
  {
    "path": "inlang.config.js",
    "chars": 1385,
    "preview": "// init the inlang.config\n\n/**\n * @type {import(\"@inlang/core/config\").DefineConfig}\n */\nexport async function defineCon"
  },
  {
    "path": "po/LINGUAS",
    "chars": 43,
    "preview": "de\nes\nfr\nja\nka\nko\nsv\nzh_CN\npt_BR\nru\nuk\nit\n\n"
  },
  {
    "path": "po/Makevars",
    "chars": 3442,
    "preview": "# Makefile variables for PO directory in any package using GNU gettext.\n\n# Usually the message domain is the same as the"
  },
  {
    "path": "po/POTFILES.in",
    "chars": 72,
    "preview": "# List of source files which contain translatable strings.\nsrc/labels.h\n"
  },
  {
    "path": "po/de.po",
    "chars": 27755,
    "preview": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"Report-Msgid-Bugs-To: hello@goaccess.io\\n\"\n\"POT-Creation-Date: 2026-02-14 0"
  },
  {
    "path": "po/es.po",
    "chars": 26560,
    "preview": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Goaccess\\n\"\n\"Report-Msgid-Bugs-To: hello@goaccess.io\\n\"\n\"POT-Creation-Date: 2026"
  },
  {
    "path": "po/fr.po",
    "chars": 26935,
    "preview": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: goaccess 1.4\\n\"\n\"Report-Msgid-Bugs-To: hello@goaccess.io\\n\"\n\"POT-Creation-Date: "
  },
  {
    "path": "po/goaccess.pot",
    "chars": 19575,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR Free Software Foundation, Inc.\n# This file is distributed under the same "
  },
  {
    "path": "po/it.po",
    "chars": 26809,
    "preview": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Goaccess\\n\"\n\"Report-Msgid-Bugs-To: hello@goaccess.io\\n\"\n\"POT-Creation-Date: 2026"
  },
  {
    "path": "po/ja.po",
    "chars": 25032,
    "preview": "# Copyright © 2020 Kamino <67395018+err931@users.noreply.github.com>\n# Copyright © 2023, 2025 gemmaro <gemmaro.dev@gmail"
  },
  {
    "path": "po/ka.po",
    "chars": 28895,
    "preview": "# Georgian translation for goaccess.\n# Copyright (C) 2026 goaccess's authors.\n# This file is distributed under the same "
  },
  {
    "path": "po/ko.po",
    "chars": 23660,
    "preview": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: goaccess 1.6.3\\n\"\n\"Report-Msgid-Bugs-To: hello@goaccess.io\\n\"\n\"POT-Creation-Date"
  },
  {
    "path": "po/pt_BR.po",
    "chars": 26752,
    "preview": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Goaccess\\n\"\n\"Report-Msgid-Bugs-To: hello@goaccess.io\\n\"\n\"POT-Creation-Date: 2026"
  },
  {
    "path": "po/ru.po",
    "chars": 26873,
    "preview": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: goaccess 1.5.6\\n\"\n\"Report-Msgid-Bugs-To: hello@goaccess.io\\n\"\n\"POT-Creation-Date"
  },
  {
    "path": "po/sv.po",
    "chars": 28401,
    "preview": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: goaccess 1.6\\n\"\n\"Report-Msgid-Bugs-To: hello@goaccess.io\\n\"\n\"POT-Creation-Date: "
  },
  {
    "path": "po/uk.po",
    "chars": 26905,
    "preview": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: goaccess 1.5.6\\n\"\n\"Report-Msgid-Bugs-To: hello@goaccess.io\\n\"\n\"POT-Creation-Date"
  },
  {
    "path": "po/zh_CN.po",
    "chars": 22799,
    "preview": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: goaccess 1.5.6\\n\"\n\"Report-Msgid-Bugs-To: hello@goaccess.io\\n\"\n\"POT-Creation-Date"
  },
  {
    "path": "resources/cities-10m.json",
    "chars": 1156931,
    "preview": "{\"type\":\"Topology\",\"objects\":{\"cities\":{\"type\":\"GeometryCollection\",\"geometries\":[{\"type\":\"Point\",\"coordinates\":[-57.836"
  },
  {
    "path": "resources/countries-110m.json",
    "chars": 107587,
    "preview": "{\"type\":\"Topology\",\"objects\":{\"countries\":{\"type\":\"GeometryCollection\",\"geometries\":[{\"type\":\"MultiPolygon\",\"arcs\":[[[0]"
  },
  {
    "path": "resources/css/app.css",
    "chars": 29673,
    "preview": "/* GLOBAL */\nhtml,\nbody {\n\tbackground: linear-gradient(to bottom, #fdfdfd 0%, #e3e3e3 50%, #e9e9e9 100%);\n\tbackground-at"
  },
  {
    "path": "resources/js/app.js",
    "chars": 71139,
    "preview": "/*jshint sub:true*/\n(function () {\n'use strict';\n\n// Syntactic sugar\nfunction $(selector) {\n\treturn document.querySelect"
  },
  {
    "path": "resources/js/charts.js",
    "chars": 46403,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "resources/tpls.html",
    "chars": 13352,
    "preview": "<!-- TPL General  -->\n<script id=\"tpl-general\" type=\"text/template\">\n    <hgroup>\n      <h2 class=\"gheader h4\" id=\"overa"
  },
  {
    "path": "snap/snapcraft.yaml",
    "chars": 586,
    "preview": "name: goaccess\nversion: git\nsummary: Real-time web log analyzer and interactive viewer\ndescription: |\n  GoAccess is a re"
  },
  {
    "path": "src/base64.c",
    "chars": 7230,
    "preview": "/**\n * base64.c -- A basic base64 encode implementation\n *    _______       _______            __        __\n *   / ____/"
  },
  {
    "path": "src/base64.h",
    "chars": 1744,
    "preview": "/**\n *    _______       _______            __        __\n *   / ____/ |     / / ___/____  _____/ /_____  / /_\n *  / / __ "
  },
  {
    "path": "src/bin2c.c",
    "chars": 3853,
    "preview": "/*\n * This is bin2c program, which allows you to convert binary file to\n * C language array, for use as embedded resourc"
  },
  {
    "path": "src/bitmap.c",
    "chars": 4346,
    "preview": "/**\n * bitmap.c -- A quick bitmap implementation\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n"
  },
  {
    "path": "src/bitmap.h",
    "chars": 3050,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/browsers.c",
    "chars": 19473,
    "preview": "/**\n 6 browsers.c -- functions for dealing with browsers\n *    ______      ___\n *   / ____/___  /   | _____________  ___"
  },
  {
    "path": "src/browsers.h",
    "chars": 1871,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/color.c",
    "chars": 29013,
    "preview": "/**\n * color.c -- functions related to custom color\n *    ______      ___\n *   / ____/___  /   | _____________  ________"
  },
  {
    "path": "src/color.h",
    "chars": 3472,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/commons.c",
    "chars": 14247,
    "preview": "/**\n * commons.c -- holds different data types\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *"
  },
  {
    "path": "src/commons.h",
    "chars": 7363,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/csv.c",
    "chars": 9328,
    "preview": "/**\n * output.c -- output csv to the standard output stream\n *    ______      ___\n *   / ____/___  /   | _____________  "
  },
  {
    "path": "src/csv.h",
    "chars": 1614,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/dialogs.c",
    "chars": 27629,
    "preview": "/**\n * dialogs.c -- UI dialog windows\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/"
  },
  {
    "path": "src/dialogs.h",
    "chars": 1876,
    "preview": "/**\n * dialogs.h -- UI dialog windows\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/"
  },
  {
    "path": "src/error.c",
    "chars": 6581,
    "preview": "/**\n * error.c -- error handling\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\"
  },
  {
    "path": "src/error.h",
    "chars": 4029,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/fileio.c",
    "chars": 5004,
    "preview": "/**\n * fileio.c -- gFile I/O abstraction layer for goaccess\n * This provides a unified interface for reading both regula"
  },
  {
    "path": "src/fileio.h",
    "chars": 2161,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/gchart.c",
    "chars": 21040,
    "preview": "/**\n * gchart.c -- TUI chart implementation\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  /"
  },
  {
    "path": "src/gchart.h",
    "chars": 2928,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/gdashboard.c",
    "chars": 55210,
    "preview": "/**\n * gdashboard.c -- goaccess main dashboard\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *"
  },
  {
    "path": "src/gdashboard.h",
    "chars": 6183,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/gdns.c",
    "chars": 7155,
    "preview": "/**\n * gdns.c -- hosts resolver\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/"
  },
  {
    "path": "src/gdns.h",
    "chars": 2566,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/geoip1.c",
    "chars": 16635,
    "preview": "/**\n * geoip.c -- implementation of GeoIP (legacy)\n *    ______      ___\n *   / ____/___  /   | _____________  _________"
  },
  {
    "path": "src/geoip1.h",
    "chars": 2363,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/geoip2.c",
    "chars": 11593,
    "preview": "/**\n * geoip2.c -- implementation of GeoIP2\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  /"
  },
  {
    "path": "src/gholder.c",
    "chars": 26753,
    "preview": "/**\n * gholder.c -- data structure to hold raw data\n *    ______      ___\n *   / ____/___  /   | _____________  ________"
  },
  {
    "path": "src/gholder.h",
    "chars": 2232,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/gkhash.c",
    "chars": 36987,
    "preview": "/**\n * gkhash.c -- default hash table functions\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n "
  },
  {
    "path": "src/gkhash.h",
    "chars": 8086,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/gkmhash.c",
    "chars": 40402,
    "preview": "/**\n * gkhash.c -- default hash table functions\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n "
  },
  {
    "path": "src/gkmhash.h",
    "chars": 9325,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/gmenu.c",
    "chars": 4069,
    "preview": "/**\n * gmenu.c -- goaccess menus\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\"
  },
  {
    "path": "src/gmenu.h",
    "chars": 2252,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/goaccess.c",
    "chars": 49103,
    "preview": "/**\n * goaccess.c -- main log analyzer\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __"
  },
  {
    "path": "src/goaccess.h",
    "chars": 1649,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/gslist.c",
    "chars": 4496,
    "preview": "/**\n * gslist.c -- A Singly link list implementation\n *    _______       _______            __        __\n *   / ____/ | "
  },
  {
    "path": "src/gslist.h",
    "chars": 2419,
    "preview": "/**\n *    _______       _______            __        __\n *   / ____/ |     / / ___/____  _____/ /_____  / /_\n *  / / __ "
  },
  {
    "path": "src/gstorage.c",
    "chars": 44459,
    "preview": "/**\n * gstorage.c -- common storage handling\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  "
  },
  {
    "path": "src/gstorage.h",
    "chars": 5233,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/gwsocket.c",
    "chars": 15501,
    "preview": "/**\n * gwsocket.c -- An interface to send/recv data from/to Web Socket Server\n *    _______       _______            __ "
  },
  {
    "path": "src/gwsocket.h",
    "chars": 2697,
    "preview": "/**\n *    _______       _______            __        __\n *   / ____/ |     / / ___/____  _____/ /_____  / /_\n *  / / __ "
  },
  {
    "path": "src/json.c",
    "chars": 33176,
    "preview": "/**\n * output.c -- output json to the standard output stream\n *    ______      ___\n *   / ____/___  /   | _____________ "
  },
  {
    "path": "src/json.h",
    "chars": 2509,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/khash.h",
    "chars": 38858,
    "preview": "/* The MIT License\n\n   Copyright (c) 2008, 2009, 2011 by Attractive Chaos <attractor@live.co.uk>\n\n   Permission is hereb"
  },
  {
    "path": "src/labels.h",
    "chars": 23777,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/opesys.c",
    "chars": 13650,
    "preview": "/**\n * opesys.c -- functions for dealing with operating systems\n *    ______      ___\n *   / ____/___  /   | ___________"
  },
  {
    "path": "src/opesys.h",
    "chars": 1670,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/options.c",
    "chars": 42725,
    "preview": "/**\n * options.c -- functions related to parsing program options\n *    ______      ___\n *   / ____/___  /   | __________"
  },
  {
    "path": "src/options.h",
    "chars": 1723,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/output.c",
    "chars": 44040,
    "preview": "/**\n * output.c -- output to the standard output stream\n *    ______      ___\n *   / ____/___  /   | _____________  ____"
  },
  {
    "path": "src/output.h",
    "chars": 3146,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/parser.c",
    "chars": 72958,
    "preview": "/**\n * parser.c -- web log parsing\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __"
  },
  {
    "path": "src/parser.h",
    "chars": 6159,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/pdjson.c",
    "chars": 23409,
    "preview": "/**\n * Public Domain JSON Parser for C\n * By Christopher Wellons\n * https://github.com/skeeto/pdjson */\n\n#ifndef _POSIX_"
  },
  {
    "path": "src/pdjson.h",
    "chars": 3052,
    "preview": "#ifndef PDJSON_H\n#define PDJSON_H\n\n#ifndef PDJSON_SYMEXPORT\n#   define PDJSON_SYMEXPORT\n#endif\n\n#if defined(__STDC_VERSI"
  },
  {
    "path": "src/persistence.c",
    "chars": 31056,
    "preview": "/**\n * persistence.c -- on-disk persistence functionality\n *    ______      ___\n *   / ____/___  /   | _____________  __"
  },
  {
    "path": "src/persistence.h",
    "chars": 1578,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/settings.c",
    "chars": 27524,
    "preview": "/**\n * settings.c -- goaccess configuration\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  /"
  },
  {
    "path": "src/settings.h",
    "chars": 11664,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/sha1.c",
    "chars": 6363,
    "preview": "/*\nSHA-1 in C\nBy Steve Reid <steve@edmweb.com>\n100% Public Domain\n\nTest Vectors (from FIPS PUB 180-1)\n\"abc\"\n  A9993E36 4"
  },
  {
    "path": "src/sha1.h",
    "chars": 483,
    "preview": "#ifndef SHA1_H_INCLUDED\n#define SHA1_H_INCLUDED\n\n#include <sys/types.h>\n#include <stdint.h>\n\n// From http://www.mirrors."
  },
  {
    "path": "src/sort.c",
    "chars": 17280,
    "preview": "/**\n * sort.c -- functions related to sort functionality\n *    ______      ___\n *   / ____/___  /   | _____________  ___"
  },
  {
    "path": "src/sort.h",
    "chars": 3059,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/tpl.c",
    "chars": 84890,
    "preview": "/*\nCopyright (c) 2005-2013, Troy D. Hanson     http://troydhanson.github.com/tpl/\nAll rights reserved.\n\nRedistribution a"
  },
  {
    "path": "src/tpl.h",
    "chars": 4744,
    "preview": "/*\nCopyright (c) 2005-2013, Troy D. Hanson     http://troydhanson.github.com/tpl/\nAll rights reserved.\n\nRedistribution a"
  },
  {
    "path": "src/ui.c",
    "chars": 31711,
    "preview": "/**\n * ui.c -- various curses interfaces\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / "
  },
  {
    "path": "src/ui.h",
    "chars": 6930,
    "preview": "/**\n * ui.h -- various curses interfaces\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / "
  },
  {
    "path": "src/util.c",
    "chars": 32074,
    "preview": "/**\n * util.c -- a set of handy functions to help parsing\n *    ______      ___\n *   / ____/___  /   | _____________  __"
  },
  {
    "path": "src/util.h",
    "chars": 4312,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/websocket.c",
    "chars": 83036,
    "preview": "/**\n * websocket.c -- An rfc6455-complaint Web Socket Server\n *    _______       _______            __        __\n *   / "
  },
  {
    "path": "src/websocket.h",
    "chars": 10696,
    "preview": "/**\n *    _______       _______            __        __\n *   / ____/ |     / / ___/____  _____/ /_____  / /_\n *  / / __ "
  },
  {
    "path": "src/win/mman.h",
    "chars": 1725,
    "preview": "#ifndef _MMAN_H_\n#define _MMAN_H_\n\n/* Protections */\n#define PROT_NONE       0x00    /* no permissions */\n#define PROT_R"
  },
  {
    "path": "src/win/mmap.c",
    "chars": 3747,
    "preview": "#include <stdlib.h>\n#include <windows.h>\n#ifdef _WIN32\n#include <io.h>\n#endif\n#include <errno.h>\n#include \"mman.h\"\n\nstat"
  },
  {
    "path": "src/wsauth.c",
    "chars": 13470,
    "preview": "/**\n * wsauth.c - web socket authentication\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  /"
  },
  {
    "path": "src/wsauth.h",
    "chars": 1819,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  },
  {
    "path": "src/xmalloc.c",
    "chars": 2383,
    "preview": "/**\n * xmalloc.c -- *alloc functions with error handling\n *    ______      ___\n *   / ____/___  /   | _____________  ___"
  },
  {
    "path": "src/xmalloc.h",
    "chars": 1603,
    "preview": "/**\n *    ______      ___\n *   / ____/___  /   | _____________  __________\n *  / / __/ __ \\/ /| |/ ___/ ___/ _ \\/ ___/ _"
  }
]

About this extraction

This page contains the full source code of the allinurl/goaccess GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 135 files (3.1 MB), approximately 810.0k tokens, and a symbol index with 1324 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!