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.
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.
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.
Searching
The field at the bottom of the Read shelf does two things in sequence. As you type it filters the shelf by work and author. If nothing on the shelf matches, it offers to search inside the texts — press return, and it does.
Why there are two kinds of search
Full-text search (SQLite FTS5) nails exact terminology — homoousion,
a quoted phrase, a proper name — but returns nothing when your words and
the text's words differ. Embeddings match meaning across vocabulary, but
drift on rare proper nouns and can rank a merely topical passage above an
exact quotation.
Council runs both and fuses the two rankings by reciprocal rank rather than by score, because BM25 and cosine similarity are on incomparable scales. The embedding model runs on your device — nothing is sent anywhere to search.
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
- Open Settings → AI Backend.
- Choose Ollama.
- Leave Host as
http://localhost:11434if Ollama is on the same machine. - 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:
-
Ollama has to listen beyond loopback. By default it
only accepts connections from its own machine. Set
OLLAMA_HOST=0.0.0.0before starting it:
On macOS, if you run the menu-bar app instead:OLLAMA_HOST=0.0.0.0 ollama servelaunchctl setenv OLLAMA_HOST "0.0.0.0" # then quit and reopen Ollama -
Use the computer's address, not localhost. Find it
with
ipconfig getifaddr en0on macOS orhostname -Ion Linux, then enterhttp://192.168.1.42:11434— your address, not that one — as the Host in Council.
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.
Where to get a key
| Provider | Shown as | Get a key |
|---|---|---|
| Anthropic | Claude | console.anthropic.com → Settings → API Keys |
| OpenAI | ChatGPT | platform.openai.com → API keys |
| Gemini | aistudio.google.com → Get API key | |
| xAI | Grok | console.x.ai |
The general shape of it
- 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.
- Create an API key and copy it. Providers usually show the key once — if you lose it, you make a new one.
- 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.
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.