FileMind

Configuration

FileMind stores its configuration in a TOML file. All settings have sensible defaults — most users won't need to change anything beyond what the setup wizard and the Settings screen configure. This page lists every setting with its default.

Config File Location

PlatformPath
Windows%APPDATA%\FileMind\config.toml
macOS (when it ships)~/Library/Application Support/FileMind/config.toml

The library database, logs, and the built-in model live alongside it under %APPDATA%\FileMind. The command-line tool also accepts --config and --db to point at other locations.

API keys and other secrets pasted into Settings are stored encrypted (Windows DPAPI). A plaintext value typed into the file by hand is still accepted and is encrypted on the next save from the app.

Environment Variable Overrides

Any setting can be overridden with an environment variable using the FILEMIND_ prefix and double underscores for nesting:

FILEMIND_LLM__PROVIDER=anthropic
FILEMIND_LLM__ANTHROPIC_API_KEY=sk-ant-...
FILEMIND_RENAME__AUTO_APPROVE_THRESHOLD=0.8

Database

[db]
path = ""  # Empty = the platform app-data directory above

PDF Ingestion

[ingestion]
metadata_pages = 2                   # Pages to read for metadata (1-10)
text_quality_min_chars = 400         # Min chars for good text quality (50-5000)
text_quality_min_alpha = 0.55        # Min alphabetic character ratio (0.1-0.95)
text_quality_max_replacement = 0.01  # Max replacement-character ratio
llm_text_repair = false              # Ask the LLM to repair badly joined words (slow; off by default)

OCR

[ocr]
provider = "paddleocr"           # "paddleocr" (bundled), "null", or "external"
render_dpi = 300                 # Page render DPI for OCR (72-600)
paddleocr_lang = "en"            # Language code
paddleocr_use_gpu = false        # Enable GPU acceleration
paddleocr_use_angle_cls = false  # Enable angle classification
paddleocr_preprocess = true      # Enable image preprocessing

Embeddings

[embeddings]
provider = "sentence-transformers"
model = "BAAI/bge-small-en-v1.5"  # Bundled with the app; no download needed
dims = 384                        # Must match model output dimensions
batch_size = 32                   # Chunks per embedding batch

Libraries created with the earlier all-MiniLM-L6-v2 model are migrated automatically: the old value is dropped from the file and the next scan re-embeds the library.

Language Model

For end-to-end setup of each provider, see the Model Providers guide. The Setup Wizard and Settings → LLM Provider write this section for you.

[llm]
provider = "ollama"      # "ollama", "llamacpp", "openai", "anthropic", "gemini"
model = "llama3.2"       # Model name or id for the provider
base_url = ""            # API base URL override (Ollama, LM Studio, custom servers)
api_key = ""             # OpenAI or custom-server key
anthropic_api_key = ""   # Claude key
gemini_api_key = ""      # Gemini key
temperature = 0.1        # Sampling temperature (0.0-2.0)
max_retries = 2          # Retry count when the model's answer fails validation
timeout_seconds = 120    # Per-request timeout (5-600)
context_window = 0       # Tokens; 0 = autodetect from the provider
think = "auto"           # Ollama thinking mode: "auto", "on", "off"
vision_rescue = false    # Send page 1 as an image to an Ollama vision model when extraction fails
vision_model = ""        # e.g. "llama3.2-vision"
spend_limit_usd = 0.0    # Monthly cap on estimated cloud spend; 0 = no limit

Cloud providers use the provider-specific key fields:

[llm]
provider = "anthropic"
model = "claude-sonnet-5"
anthropic_api_key = "sk-ant-..."

# Or for OpenAI:
provider = "openai"
model = "gpt-5.4"
api_key = "sk-..."

# Or for Gemini:
provider = "gemini"
model = "gemini-3.7-flash"
gemini_api_key = "AIza..."

# Or an OpenAI-compatible local server (LM Studio, llama.cpp, vLLM):
provider = "llamacpp"
base_url = "http://localhost:1234/v1"
model = "your-model-id"

The built-in model is a llamacpp entry that FileMind manages itself, pointing at the bundled server on 127.0.0.1. It also sets a managed = true flag so that the app knows to start and stop that server. Leave that flag alone; a server you point FileMind at yourself must not carry it.

Local models are always free, and spend_limit_usd can never block them. The ollama, llamacpp and null providers are priced at zero rather than left unpriced — so the built-in model, LM Studio, and any custom OpenAI-compatible server you run yourself contribute nothing to the monthly total no matter how much you use them. The cap applies only to the cloud providers it can actually price.

Per-token prices for the spend estimate come from a bundled table. Override or add rates with pricing_overrides, in USD per million tokens:

[llm.pricing_overrides."gpt-5.4"]
input = 2.5
output = 15.0

Bibliographic Lookup

[openalex]
enabled = true                # Master switch for ALL lookups, Crossref included
skip_openalex = true          # Skip OpenAlex only; Crossref and arXiv still run (default)
enable_arxiv = true           # Ask arXiv's API first for arXiv-anchored papers
api_key = ""                  # Optional funded OpenAlex key
mailto = ""                   # Contact email sent with Crossref/OpenAlex requests
timeout_seconds = 10          # API timeout (1-60)
title_match_threshold = 0.85  # Minimum title-match confidence (0.5-1.0)

Crossref and arXiv are free and unmetered, so they run by default. OpenAlex meters anonymous use with a small daily budget that a first scan of a few hundred papers exhausts, and its wrong years were the main cause of confidently wrong proposals — so it is skipped by default. Set skip_openalex = false to opt back in, ideally with a funded key. When the OpenAlex budget does run out mid-scan, the app shows a notice in the header and carries on with Crossref and arXiv.

Rename Settings

[rename]
template = "default"           # Template style
title_max_chars = 50           # Max title portion in filename (20-200)
filename_max_chars = 160       # Max total filename length (60-255)
auto_approve_threshold = 0.75  # "High" tier — eligible for Approve High
propose_threshold = 0.55       # "Medium" tier — below this is "Needs review"

The auto_approve_threshold must be greater than propose_threshold. Both are editable under Settings → Rename Settings.

Settings showing the AI Usage card, the Embeddings card with the bge-small model, and the Rename Settings card with propose and auto-approve thresholds
The Settings screen mirrors these sections. Save Settings writes them to config.toml.

Search & Ask

[search]
default_mode = "hybrid"           # "hybrid", "fts", or "semantic"
default_limit = 40                # Default results per query
semantic_min_score = 0.15         # Minimum embedding similarity
rag_top_k = 12                    # Passages retrieved for Ask before context sizing
rag_min_score = 0.3               # Minimum passage score for Ask
reranker_enabled = true           # Cross-encoder reranking of search and Ask results
reranker_model = "cross-encoder/ms-marco-MiniLM-L-6-v2"
rag_auto_context = true           # Fit as many passages as the model's window allows
rag_context_utilization = 0.6     # Share of the context window to spend on passages (0.1-0.95)
rag_max_context_tokens = 16384    # Ceiling on passage tokens even for huge windows
rag_top_k_max = 48                # Never retrieve more than this many passages

Zotero

[zotero]
enabled = false
api_key = ""
user_id = ""
library_type = "user"      # "user" or "group"
default_collection = ""
timeout_seconds = 10

See Export & Integration for the walkthrough.

Background Jobs

[jobs]
max_concurrent = 2      # Max parallel jobs (1-8)
scan_batch_size = 50    # Files per scan batch
embed_batch_size = 32   # Chunks per embedding batch

Service

[service]
host = "127.0.0.1"   # Always localhost for security
port = 0             # 0 = auto-select a free port
workers = 1          # Uvicorn workers
log_level = "info"   # "debug", "info", "warning", "error"

License

[license]
trial_pdf_limit = 100   # PDFs indexable on the free trial (beta builds lift this)

Beta builds start the service with FILEMIND_LICENSE__TRIAL_PDF_LIMIT raised so the trial is effectively unlimited. See Licensing.