Skip to content
The world does revolve around you.

Configuration#

This page documents the canonical Ostler configuration surface: where settings live, how the layers interact, and what every key does.

For the variables you can set in the shell or in the dotenv file, see Environment variables. For the local HTTP API consumers of this configuration, see the API reference.

Configuration layout#

Ostler uses two configuration files plus an environment-variable override layer:

~/.ostler/config/.env                # dotenv: identity, URLs, secrets
~/.pwg/settings.yaml                 # YAML: processing, redaction, models
process environment                  # final override layer
File Owns Edited via
~/.ostler/config/.env Identity, storage URLs, embedding model, API server, network, secrets Installer in Phase 2/3; hand-edit afterwards
~/.pwg/settings.yaml Conversation processing, locale, coaching tone, redaction policy, work geofence, model routing Installer copies a template; hand-edit afterwards
Shell environment Any of the above export VAR=value before launching

Resolution order is code defaultYAML or .env valueshell env var. The shell wins ties.

~/.ostler/config/.env#

This is the dotenv file the installer writes at the end of Phase 3. It captures the choices made in the installer prompts: who you are, where the storage lives, which embedding model is in use, and any optional integrations (CardDAV, Tailscale, Google Takeout).

Example (post-install, with placeholder values):

# Ostler configuration – generated by installer

# Identity
USER_ID="alex"
USER_NAME="Alex Example"
ASSISTANT_NAME="your-assistant-name"
TIMEZONE="Europe/London"

# Storage services (Docker containers on localhost)
OXIGRAPH_URL=http://localhost:7878
QDRANT_URL=http://localhost:6333
REDIS_URL=redis://localhost:6379

# Embedding
EMBED_OLLAMA_URL=http://localhost:11434
EMBED_MODEL=nomic-embed-text
EMBED_BATCH_SIZE=50

# Locale / phone normalisation
DEFAULT_COUNTRY_CODE=44
DEFAULT_PRIVACY_LEVEL=L2

# macOS extractor consent (comma-separated)
OSTLER_FDA_SOURCES="safari_history,safari_bookmarks,apple_notes,calendar,reminders"

# Optional: Google Takeout mbox
OSTLER_TAKEOUT_PATH=""

# Optional: Tailscale IPv4 address (set by installer when Tailscale is signed in)
OSTLER_TAILSCALE_IP=""

Every key in this file maps 1:1 to an entry in Environment variables. Editing the file is equivalent to exporting the variable before launching the Hub.

~/.pwg/settings.yaml#

The YAML config governs the conversation-processing pipeline. The installer copies a production template into place; you can hand-edit it afterwards. The Hub reads it on each pipeline run.

The YAML loader does NOT expand ${VAR} placeholders inside YAML values. Per-deployment overrides come from environment variables (see the env-var table at the bottom of this section), not from string interpolation.

Identity#

# Stable user ID. Subject suffix in graph storage, partition key in the
# observation database. Treat as immutable.
user_id: your_user_id

# Display name used in prompt templates.
user_display_name: Your Name

Locale#

# BCP-47 locale code. Drives spelling, date formatting, punctuation.
locale: en-GB

Recognised values include en-GB, en-US, en-AU, en-IE. Other locales fall through to en-GB.

Coaching#

# One of: direct, supportive, configurable.
coaching_tone: supportive
Value Effect
direct Concise, prescriptive prompts
supportive Softer framing, more open-ended prompts
configurable The Hub picks per-observation based on relationship signals

Redaction policy#

Categories tagged with mask are redacted before being written to any observation or summary. Credentials and safeguarding categories are always enforced; the categories below are user-configurable.

redaction:
  financial: mask         # mask | passthrough
  medical: mask
  legal: mask
  contact_info: mask
  policy_version: [email protected]

policy_version is an opaque tag the Hub records on each output so you can later identify which redaction policy produced a given file.

Work geofence#

Optional. When enabled, the pipeline rejects transcripts tagged as captured at one of the configured work locations.

work_geofence:
  enabled: false
  addresses: []          # list of postal addresses
  radius_m: 100          # match radius in metres

LLM endpoints and model routing#

# Local Ollama on the Hub.
ollama_url: http://localhost:11434

# Model routing. Adjust to match the compute machine's available VRAM.
ollama_classify_model: qwen3.5:9b
ollama_enrich_model: qwen3.6:35b-a3b
ollama_fact_model: qwen3.6:35b-a3b
ollama_relationship_model: qwen3.6:35b-a3b
ollama_coach_model: qwen3.6:35b-a3b
Step Description Recommended size
classify_model Quick classification of incoming items 8-9B dense
enrich_model Adds structured facts to a transcript 30B+ MoE
fact_model Extracts atomic facts 30B+ MoE
relationship_model Updates relationship signals 30B+ MoE
coach_model Generates coach observations 30B+ MoE

Smaller models can be used at the cost of structured-output quality. The Hub's ollama_classify_model should be a fast model; the others benefit from a higher-capacity MoE.

Storage#

# Vector store (semantic search).
qdrant_url: http://localhost:6333
qdrant_conversations_collection: conversations

# Graph store (relationships, facts).
oxigraph_url: http://localhost:7878

The collection name only needs to change if you are running multiple Hubs sharing a single vector store, which is not the supported topology.

Paths#

# Per-step state persistence. Never deleted automatically.
processing_state_dir: ~/.pwg/processing

# Final enriched conversation markdown output (one .md per conversation).
output_conversations_dir: ~/.pwg/conversations

# User Coach observation store (encrypted SQLite).
coach_db_path: ~/.pwg/coach/observations.db

The processing state directory accumulates per-step JSON files used for auditing and reprocessing. It is not cleaned automatically; you can delete the contents safely, but you will lose the ability to skip already-completed steps on re-run.

YAML environment-variable overrides#

The values above are literal in-file defaults. The localhost defaults work as-is once user_id and user_display_name are set, and most users will never need to change them. See Environment variables for the full list and override paths.

Power policy (MacBook Hub)#

If the Hub is running on a MacBook, an extra config file controls the power-management LaunchAgent:

~/.ostler/power.conf
POWER_POLICY=normal       # normal | aggressive | eco
Policy Behaviour
normal Pause Docker and Ollama on battery; resume on AC
aggressive Pause everything aggressively; lowest battery impact
eco Light pausing; faster resume but more battery use

The LaunchAgent reads this file on each tick. Mac Mini and Mac Studio Hubs see tier ac every tick and take no action regardless of the policy.

See also#