# songbird — how to run it. # # songbird reads Scripture from Concord, a separate Scripture engine that runs on the # network. songbird keeps only your notes; Concord provides the Bible text, the search # and the maps. So there are two ways to start, and you only need one of them. # # A. You don't have Concord yet. Start both together — songbird plus a ready-made # Concord it downloads for you: # # docker compose --profile bundled-concord up # # Then open http://localhost:8077. (The first run takes a few minutes while it # downloads Concord and builds songbird.) # # The Concord it downloads carries the public-domain translations — KJV, ASV, WEB, # BSB and a dozen more. That is everything most people need, and it is all a public # download is allowed to include: translations like the ESV or the NKJV are licensed, # so no public image can ship them. # # B. You already run your own Concord — on this machine or anywhere on your network, # perhaps one you built with translations of your own. Tell songbird where it is by # putting a line like this in a file called .env next to this one: # # CONCORD_BASE_URL=http://192.168.1.62:8000 # # ...then just: # # docker compose up # # songbird talks to that Concord and nothing else is started. Whatever translations # your Concord serves are the translations songbird shows. # # Not sure which Concord songbird ended up talking to? Open the app and click **Status**. # It names the exact address and lists every translation it found there. services: # The Scripture engine, ready-made — only for path A above. # # This is behind a "profile", which is Docker's word for a part that stays switched off # unless you ask for it. That's why path A passes `--profile bundled-concord` and path B # doesn't: if you already have your own Concord, starting a second one would just sit # there unused — and songbird would read the wrong one. concord: image: ghcr.io/kbennett2000/concord:v1.3.1 profiles: ["bundled-concord"] restart: unless-stopped # Concord is only used by songbird, on this private network. # (We don't expose it to your whole computer — songbird talks to it internally.) expose: - "8000" healthcheck: # songbird waits until Concord is actually ready before it starts. test: ["CMD", "python", "-c", "import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:8000/healthz').status==200 else 1)"] interval: 10s timeout: 5s retries: 12 start_period: 40s # The app you use. Built from this repo (quick — it's lightweight). songbird: build: . restart: unless-stopped ports: # The port songbird is reachable on, in Docker and outside it — set PORT in .env to change # it, then open http://localhost:. Only the outside changes: the container keeps # listening on 8077. - "${PORT:-8077}:8077" environment: # Where songbird looks for Concord. Set CONCORD_BASE_URL in .env to point it at your # own Concord (path B); leave it unset and songbird uses the ready-made one this file # can start for you (path A). songbird makes no assumption that Concord is on this # machine — it calls whatever address it is given. CONCORD_BASE_URL: "${CONCORD_BASE_URL:-http://concord:8000}" # Optional: a free key for YouTube's Data API. With one, songbird can look your sermon # videos up on YouTube — starting with re-dating the sermon notes you already have, so # each one carries the day the sermon was actually preached. Without a key that feature # is simply switched off and nothing else changes. # To use it, put the key in a file called .env next to this one, on a line reading # YOUTUBE_API_KEY=your-key-here # (docker compose reads that file automatically). Treat it like a password. YOUTUBE_API_KEY: "${YOUTUBE_API_KEY:-}" # How often songbird looks for new sermons on the channels you follow, in hours. 168 is # once a week, which suits a church that posts on Sundays. Set it to 0 if you would rather # it never went looking on its own — the "Check now" button on the page still works. SERMON_CHECK_INTERVAL_HOURS: "${SERMON_CHECK_INTERVAL_HOURS:-168}" # Videos shorter than this many minutes are skipped, which keeps clips, trailers and Shorts # out of your notes. It is the starting point for every channel; a single channel can be # given its own number on the Sermon sources page, and that one wins for that channel. SERMON_MIN_MINUTES: "${SERMON_MIN_MINUTES:-10}" volumes: # Your notes live here, on your computer, so they survive restarts. - songbird-data:/data depends_on: concord: condition: service_healthy # Only wait for the bundled Concord when it's actually being started (path A). On # path B it isn't, and songbird must not refuse to boot over a part nobody asked for. required: false volumes: songbird-data: