Documentation

How Council works

What each screen does, and — the two things people actually get stuck on — how to point it at Ollama, and where to get an API key if you would rather use a hosted model.

Getting started

Council installs with the King James Version complete — all 1,189 chapters — already inside the app. It works fully offline from the first launch, with no account, no sign-in and no configuration.

On first run it unpacks the bundled library and prepares the on-device search index. That takes a few seconds and happens once.

You do not need an AI backend. Council ships with no model selected. In that state it is a search-and-reading tool: it finds passages and shows them to you, and nothing is generated. Everything on this page after Asking questions is optional.

The library

Everything beyond the KJV is downloaded on request, from Settings → Manage content (or “Add more to your library” on the Read shelf).

Collections are grouped as Start here, then Scripture, then by era, then by tradition, then by individual author. If you only take one, take Creeds & Confessions — 8.9 MB, and the smallest set that can answer a question comparing two traditions.

Collections overlap, downloads do not

Augustine belongs to Church Fathers, Nicene & Post-Nicene Writers, Augustine of Hippo and Eastern Orthodox at once. He is only ever downloaded once. This is why a collection's size drops after you install a neighbouring one — install the Nicene & Post-Nicene writers and the Catholic collection falls from 24.8 MB to 10.6 MB, because the Latin fathers it shares with them are already on the device.

Removing a collection removes only the works no remaining collection still needs. Your highlights, notes and bookmarks are stored separately and survive.

Content is published separately from the app, so the library can grow without you waiting for an app update. New collections appear in Manage content on their own.

Reading

Read is the shelf: everything installed, grouped by tradition, each section collapsible. Bibles sit at the top rather than in alphabetical order.

  • Swipe a work right to pin it to the top of the shelf.
  • Swipe it left to star it. The row springs back either way — the gestures toggle state, they never remove anything.

Opening a work shows a provenance card first: its tradition, its author, its rights statement and the URL the text was digitised from. Then the text.

Appearance

Settings → Font Size scales type across the whole app, not just the reader. Settings → Theme offers 24 themes — Tokyo Night, Everforest, Catppuccin, Gruvbox, Nord, Solarized, Dracula, Rose Pine and more — each with a light and dark rendering, and a dark high-contrast option.

Highlights & notes

Tap any passage while reading and a floating toolbar appears over it. From there you can:

  • Highlight it in one of several colours — or erase an existing highlight, which the same palette handles.
  • Write a note against it. The quoted passage and your note are stored separately: the quote is the corpus's words and cannot be edited, the note is yours.
  • Copy or share the passage.
  • Ask about this passage — opens a conversation with that text pinned above it, so you can ask several questions in a row without losing what you were reading.

Everything you write lives in a separate database from the corpus, so adding or removing collections never touches it.

Asking questions

Ask is retrieval-augmented: your question is matched against the library by full-text and semantic search, the two result sets are fused, and the passages are handed to whichever model you have configured — along with an instruction to answer out of them.

Answers carry numbered citations. Each one names the work, its tradition and its author, and tapping it opens the passage itself. Citations can be turned off in Settings → Show Citations, though there is rarely a reason to.

Council states under every answer that it was written by a language model and can be wrong or misattributed. That is not boilerplate — it is why the citations are there.

Conversations are kept in Chat history in the sidebar.

Connecting Ollama

Ollama runs a language model on hardware you own. Answers are generated locally and your questions never leave your network.

What you need

  • A computer that can run Ollama — macOS, Windows or Linux.
  • At least one model pulled. Something in the 3–8B range is a reasonable starting point on consumer hardware; larger models give better answers and need more memory.
  • Council on the same machine, or on a device that can reach it over your network or VPN.

1. Install Ollama and pull a model

# macOS (or download the app from ollama.com)
brew install ollama

# Pull a model
ollama pull llama3.2

# Check it is serving
curl http://localhost:11434/api/tags

That last command should return JSON listing your models. If it does, Council will be able to reach it too.

2. Point Council at it

  1. Open Settings → AI Backend.
  2. Choose Ollama.
  3. Leave Host as http://localhost:11434 if Ollama is on the same machine.
  4. Leave Model blank and press Test Connection + Pull models.

On success the free-text model field is replaced by a dropdown of exactly what your server has pulled — so you cannot mistype a model name and get a silent “model not found”.

Running Council on a phone, Ollama on a computer

localhost on a phone means the phone. To reach a computer, two things have to be true:

  1. Ollama has to listen beyond loopback. By default it only accepts connections from its own machine. Set OLLAMA_HOST=0.0.0.0 before starting it:
    OLLAMA_HOST=0.0.0.0 ollama serve
    On macOS, if you run the menu-bar app instead:
    launchctl setenv OLLAMA_HOST "0.0.0.0"
    # then quit and reopen Ollama
  2. Use the computer's address, not localhost. Find it with ipconfig getifaddr en0 on macOS or hostname -I on Linux, then enter http://192.168.1.42:11434 — your address, not that one — as the Host in Council.
Only do this on a network you trust. Binding Ollama to 0.0.0.0 exposes it to everything on that network with no authentication. On a shared or public network, use a VPN such as Tailscale and give Council the VPN address instead.

On the Android emulator specifically, the host machine is http://10.0.2.2:11434.

The first answer is slow

Ollama loads the model into memory on the first request, which can take tens of seconds. Council warms it up when you select the backend, so the wait usually lands before you have finished typing your question rather than after.

Using your own API key

If you would rather use a hosted model, Council speaks to four providers directly with a key you supply. There is no Council account, no proxy and no markup — you are billed by the provider, at their rates, on your own account.

This is the one option that sends data off your device. Your question and the retrieved passages go to the provider, where their privacy policy and data-retention terms apply — not Council's. Council cannot control how long they keep your questions or what they do with them, and says so in the app.

Where to get a key

The general shape of it

  1. Create an account with the provider and add a payment method. Most require billing to be set up before a key will work at all.
  2. Create an API key and copy it. Providers usually show the key once — if you lose it, you make a new one.
  3. In Council, open Settings → AI Backend, choose Your own API key, pick the provider, paste the key and pick a model.

Council stores the key in the platform keychain — Keychain on Apple devices, the encrypted Keystore on Android — not in ordinary preferences, and never in plain text on disk.

An API key is a credential that can spend money. Treat it like a password: do not paste it into anything you did not go looking for, and revoke it from the provider's console if you think it has leaked.

Privacy

Plainly, because it is the point of the app:

  • There is no account and no sign-in.
  • There is no telemetry or analytics in the app.
  • The library, the search index and the embedding model are all on your device. Searching sends nothing anywhere.
  • Your highlights, notes, bookmarks and chat history stay on the device and are never uploaded.
  • The app makes network requests in exactly two situations: downloading a collection you asked for, and generating an answer if — and only if — you configured a backend. With Ollama that request goes to the address you typed; with an API key it goes to that provider.

Troubleshooting

“No Ollama server at …”

Check curl http://localhost:11434/api/tags on the machine running Ollama. If that fails, Ollama is not running. If it succeeds but Council still cannot connect from another device, Ollama is bound to loopback — see OLLAMA_HOST above.

The model dropdown is empty

The connection worked but no models are pulled. Run ollama pull llama3.2 and press Test Connection again.

“No API key saved”

The key was not saved, or was saved under a different provider — the key is stored per provider, so switching from Claude to Gemini needs a Gemini key.

An answer cites something I do not have

It cannot — retrieval only searches what is installed. If an answer mentions a work you do not recognise, check the citation list: those are the only texts it was given. Anything not in that list came from the model's own training, which is exactly what the disclaimer under each answer is warning you about.

A download failed part-way

Council verifies the checksum of every collection before installing it, so a truncated download is rejected rather than half-installed. Press Download again.

Something here wrong or missing? Open an issue, or ask for a work to be added.