# ArchiveBox

Saves web pages and bookmarks as HTML, PDF and media for later.

- Replaces: [Pinboard](https://openlogs.fyi/alternatives/pinboard)
- Summary: Paid web page archiving services, such as Pinboard.
- Stack: Python (language)
- Deployment: docker_compose
- License: MIT (osi) [source](https://github.com/ArchiveBox/ArchiveBox/blob/c55089eaefcacf3439322eec897763f518588f37/LICENSE)
- Business model: unknown. The README at the pinned commit does not state a business model, so it stays unknown. ([source](https://github.com/ArchiveBox/ArchiveBox/blob/c55089eaefcacf3439322eec897763f518588f37/README.md), read 2026-10-22)
- Difficulty: medium. 1 service, 2 volume mounts, 4 env values to set, no elevated host access. Heuristic score 3 of 11: medium.
- Requirements: not stated
- Repository: [ArchiveBox/ArchiveBox](https://github.com/ArchiveBox/ArchiveBox)

## Install

1. Docker with the Compose plugin ([source](https://github.com/ArchiveBox/ArchiveBox/blob/c55089eaefcacf3439322eec897763f518588f37/docker-compose.yml))

   ```text
   A host with Docker and the Docker Compose plugin. This entry runs from a compose file.
   ```

2. Save the compose file as docker-compose.yml ([source](https://github.com/ArchiveBox/ArchiveBox/blob/c55089eaefcacf3439322eec897763f518588f37/docker-compose.yml))

   ```yaml
   # Usage
   #
   #     mkdir -p ~/archivebox/data && cd ~/archivebox
   #     curl -fsSL 'https://docker-compose.archivebox.io' > docker-compose.yml
   #     docker compose up -d
   #     Open /admin/ on the hostname or IP used to reach ArchiveBox e.g: http://admin.archivebox.localhost:5797/
   #
   #     docker compose exec archivebox archivebox add --depth=1 'https://news.ycombinator.com'
   #     docker compose exec -T archivebox archivebox add < ~/Downloads/bookmarks.txt
   #     docker compose exec archivebox archivebox help
   #
   # More Info: https://github.com/ArchiveBox/ArchiveBox/wiki/Docker#docker-compose
   
   services:
       archivebox:
           image: ${ARCHIVEBOX_IMAGE:-archivebox/archivebox:latest}
           restart: unless-stopped
           ports:
               - "${ARCHIVEBOX_PORT:-5797}:5797"
           volumes:
               - ./data:/data                                       # Required: main data directory must be on a fast local SSD
               # - /mnt/archivebox/data/archive:/data/archive       # Optional: store the bulky data/archive content on a slower HDD or remote network store
               - tmp:/tmp/archivebox                                # lets one-off `docker compose run` commands reuse main server's runners
           environment:
               # - ADMIN_USERNAME=admin                             # optional admin user to create on first run, skips first-time setup admin creation UI
               # - ADMIN_PASSWORD=SomeSecretPassword
               - BASE_URL                                           # canonical URL users will access this server at, can be set up via first-run wizard in the UI as well
               - SERVER_SECURITY_MODE                               # defaults to "auto", can be set up via first-run wizard in the UI as well
               - PUBLIC_ADD_VIEW=False                              # set to True to allow anonymous users to submit new URLs to archive
               - ARCHIVEDOTORG_ENABLED=True                         # set to False if you dont want to send URLs to Archive.org
               - PUID                                               # optional numeric UID for NFS/CIFS/FUSE mounts (defaults to collection owner or 911)
               - PGID                                               # optional numeric GID for NFS/CIFS/FUSE mounts (defaults to collection group or 911)
               # For all other options, it's better to use data/ArchiveBox.conf or the new Personas config feature in the admin UI...
               # - TIMEOUT=60
               # - CHECK_SSL_VALIDITY=False                         # settings here data/ArchiveBox.conf to be able to edit it in the UI
               # - USER_AGENT="..."                                 # ... move any settings like these into 
               # ...
               # For more info, see: https://github.com/ArchiveBox/ArchiveBox/wiki/Docker#configuration
           shm_size: 1gb                                            # chrome runs better when it can use a decently sized shm pool
           pids_limit: 2048                                         # avoids low systemd task caps with Chrome and parallel extractors
   
   
   ####################################################################################################################
       ### No Separate containers are needed for sonic or scheduled archiving, these are all optional addons: ###
   
       ### Optional: HTTPS ingress using Cloudflare
       #             https://developers.cloudflare.com/tunnel/reference/run-parameters/
       #
       # cloudflared:
       #     image: cloudflare/cloudflared
       #     command: tunnel --no-autoupdate --loglevel debug --retries 15 --protocol http2 --overwrite-dns --url http://archivebox:5797 --hostname archivebox.io --name archivebox.io
       #     volumes:                                                                                                                 # ^ (replace archivebox.io with your own domain)
       #         # Download a cert.pem into this folder from https://dash.cloudflare.com/argotunnel
       #         - ./etc/cloudflared:/etc/cloudflared
       
   
       ### Optional: ArchiveBox Bot + ArchiveBox AI Bot: save links and run archiving tasks from Slack, WhatsApp, etc.
       #             https://github.com/ArchiveBox/archivebox-chat-bot
       #
       # archivebox-chat-bot:
       #     build: https://github.com/ArchiveBox/archivebox-chat-bot.git#main
       #     restart: unless-stopped
       #     ports:
       #         - "127.0.0.1:5798:5798"
       #         # Open http://localhost:5798, choose a console password, then connect to http://archivebox:5797 with your API key.
       #     volumes:
       #         - ./archivebox-chat-bot:/data
       #     # Optional: set ADMIN_PASSWORD to skip the first-run password setup UI.
       #     # environment:
       #     #     ADMIN_PASSWORD: your-console-password
   
   
       ### Optional: container to run xvfb+noVNC so you can watch the ArchiveBox browser screen as it archives things /
       #             remote control it to set up a chrome profile w/ logins for sites you want to archive
       # 
       #             https://github.com/ArchiveBox/ArchiveBox/wiki/Chromium-Install#setting-up-a-chromium-user-profile
       #             https://github.com/ArchiveBox/ArchiveBox/wiki/Chromium-Install#docker-vnc-setup
       #
       # novnc:
       #     image: theasp/novnc:latest
       #     environment:
       #         - DISPLAY_WIDTH=1920
       #         - DISPLAY_HEIGHT=1080
       #         - RUN_XTERM=no
       #     healthcheck:
       #         test: ["CMD", "xdpyinfo", "-display", ":0"]
       #         interval: 2s
       #         timeout: 2s
       #         retries: 10
       #     ports:
       #         # to view/control ArchiveBox's browser, visit: http://127.0.0.1:8080/vnc.html
       #         # restricted to access from localhost by default because it has no authentication
       #         - 127.0.0.1:8080:8080
   
   
       ### Optional: VPN to your home IP to avoid rate limits and captchas
       #             https://tailscale.com/docs/features/containers/docker/how-to/connect-docker-container
       # tailscale:
       #     image: tailscale/tailscale:latest
       #     cap_add:
       #       - net_admin
       #       - net_raw
       #     environment:
       #       - TS_AUTHKEY=<tskey-YOUR-AUTH-KEY>
       #       - TS_STATE_DIR=/var/lib/tailscale
       #     volumes:
       #       - ./tailscale:/var/lib/tailscale
       #     restart: unless-stopped
   
       ### Optional: Run ChangeDetection.io to watch for changes to websites, then trigger ArchiveBox to archive them
       #             https://github.com/ArchiveBox/ArchiveBox/wiki/Change-Detection
       #
       # changedetection:
       #     image: ghcr.io/dgtlmoon/changedetection.io
       #     volumes:
       #         - ./data-changedetection:/datastore
   
   
   ### Optional: Set up remote network storage for your ./data/archive bulky files (to S3, B2, Google Drive, OneDrive, SFTP, etc.)
   #   Follow the steps here to set up the Docker RClone Plugin https://rclone.org/docker/
   #   https://github.com/ArchiveBox/ArchiveBox/wiki/Setting-Up-Storage
   #
   #     $ docker plugin install rclone/docker-volume-rclone:amd64 --grant-all-permissions --alias rclone
   #     $ nano /var/lib/docker-plugins/rclone/config/rclone.conf
   #     [examplegoogledrive]
   #     type = drive
   #     scope = drive
   #     drive_id = 1234567...
   #     root_folder_id = 0Abcd...
   #     token = {"access_token":...}
   #
   # volumes:
   #     archive:
   #         driver: rclone
   #         driver_opts:
   #             remote: 'examplegoogledrive:archivebox'
   #             allow_other: 'true'
   #             vfs_cache_mode: full
   #             poll_interval: 0
   
   
   volumes:      # if you run multiple archivebox containers (or run multiple "docker run" commands)
       tmp:      # this lets them share a single orchestrator instead of fighting over which one is the leader
   ```

3. Set the values the compose file needs ([source](https://github.com/ArchiveBox/ArchiveBox/blob/c55089eaefcacf3439322eec897763f518588f37/docker-compose.yml))

   ```text
   These variables have no default in the compose file: BASE_URL, PGID, PUID, SERVER_SECURITY_MODE. Compose reads them from the shell or from a .env file next to the compose file.
   ```

4. Start it ([source](https://github.com/ArchiveBox/ArchiveBox/blob/c55089eaefcacf3439322eec897763f518588f37/docker-compose.yml))

   ```bash
   docker compose up -d
   ```

5. Open the app ([source](https://github.com/ArchiveBox/ArchiveBox/blob/c55089eaefcacf3439322eec897763f518588f37/docker-compose.yml))

   ```text
   Open http://localhost:5797. The compose file publishes host port 5797 for the archivebox service.
   ```

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

## Gotchas and maintenance

### Gotchas

- Some images use the latest tag or no tag: Images without a pinned version: archivebox: ${ARCHIVEBOX_IMAGE:-archivebox/archivebox:latest}. A later pull can get a different version. ([source](https://github.com/ArchiveBox/ArchiveBox/blob/c55089eaefcacf3439322eec897763f518588f37/docker-compose.yml), checked 2026-10-22)
- The compose file publishes host ports: Host ports: 5797 (archivebox). A port without a host address listens on all host network interfaces. ([source](https://github.com/ArchiveBox/ArchiveBox/blob/c55089eaefcacf3439322eec897763f518588f37/docker-compose.yml), checked 2026-10-22)
- The compose file mounts host folders: Host paths mounted into containers: ./data at /data (archivebox). ([source](https://github.com/ArchiveBox/ArchiveBox/blob/c55089eaefcacf3439322eec897763f518588f37/docker-compose.yml), checked 2026-10-22)

### Signals

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

- Open issues and pull requests: 157
- Stars: 28843, forks: 1621
- Last push: 2026-10-20 (1 days ago)
- Latest release: v0.9.73 on 2026-10-06 (15 days ago)

## Sources

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

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