2026-08-02 19:04:30 -04:00
|
|
|
|
# QuickSearch configuration reference.
|
|
|
|
|
|
#
|
|
|
|
|
|
# The live config is auto-created at ~/.config/quicksearch/config.toml
|
|
|
|
|
|
# (Windows: %APPDATA%\quicksearch\config.toml). A config.toml placed next
|
|
|
|
|
|
# to the quicksearch binary overrides it entirely (portable mode).
|
|
|
|
|
|
# Relative paths resolve against the directory containing the config
|
|
|
|
|
|
# file, so a portable folder can be moved wholesale.
|
|
|
|
|
|
#
|
|
|
|
|
|
# Every key is optional; missing keys take the defaults shown here.
|
|
|
|
|
|
|
|
|
|
|
|
[paths]
|
|
|
|
|
|
# One or more directory roots to index. Walked in order; duplicate and
|
|
|
|
|
|
# nested roots are de-duplicated automatically. `~` expands to home.
|
2026-08-04 23:33:28 -04:00
|
|
|
|
# Adding a folder reindexes to pick it up; removing one deletes its entries
|
|
|
|
|
|
# and leaves the rest of the index alone. Order and spelling do not matter:
|
|
|
|
|
|
# "~/docs", "/home/you/docs" and "/home/you/docs/" are one folder.
|
2026-08-02 19:04:30 -04:00
|
|
|
|
indexing_paths = ["~"]
|
|
|
|
|
|
# SQLite index location. Default: ~/.local/share/quicksearch/index.sqlite
|
2026-08-23 00:33:53 -04:00
|
|
|
|
# (Windows: %LOCALAPPDATA%\quicksearch\index.sqlite — write Windows paths
|
|
|
|
|
|
# as TOML *literal* strings, single quotes, and keep the index out of a
|
|
|
|
|
|
# roaming profile; it is far too large to synchronise). The file here is
|
|
|
|
|
|
# created if missing, and replaced if it is an index from an older
|
|
|
|
|
|
# QuickSearch layout; a SQLite database belonging to some other program
|
|
|
|
|
|
# is refused with an error, and nothing is deleted.
|
2026-08-02 19:04:30 -04:00
|
|
|
|
database_path = "~/.local/share/quicksearch/index.sqlite"
|
|
|
|
|
|
|
|
|
|
|
|
[indexing]
|
2026-08-03 03:06:19 -04:00
|
|
|
|
# The indexing mode. true = automatic: filesystem watchers apply changes a
|
2026-08-23 00:33:53 -04:00
|
|
|
|
# couple of seconds after they happen, and a full reindex runs every
|
|
|
|
|
|
# reindex_interval_minutes to cover whatever the watcher missed.
|
|
|
|
|
|
# false = manual: nothing is indexed until you ask for it. The Stop and
|
|
|
|
|
|
# Return to Automatic buttons on the Manage Index tab write this value, so
|
|
|
|
|
|
# the mode you left the app in is the mode it starts in.
|
2026-08-02 19:04:30 -04:00
|
|
|
|
auto_index = true
|
2026-08-05 18:05:04 -04:00
|
|
|
|
reindex_interval_minutes = 60
|
2026-08-23 00:33:53 -04:00
|
|
|
|
# Follow symbolic links during directory walks. Applies to links pointing
|
|
|
|
|
|
# at files as well as at directories: off, a symlink is not resolved at
|
|
|
|
|
|
# all, so its target is never indexed — a target can live outside every
|
|
|
|
|
|
# root listed above. A resolved target is stored under its own real path,
|
|
|
|
|
|
# not the link's.
|
2026-08-02 19:04:30 -04:00
|
|
|
|
follow_symlinks = false
|
2026-08-23 00:33:53 -04:00
|
|
|
|
# Index hidden files and directories: dot-files everywhere, and
|
2026-08-05 18:05:04 -04:00
|
|
|
|
# additionally anything carrying the Hidden attribute on Windows (AppData,
|
2026-08-23 00:33:53 -04:00
|
|
|
|
# $RECYCLE.BIN, System Volume Information ...). The System attribute on
|
|
|
|
|
|
# its own does not count — cloud sync roots carry it purely to get a
|
|
|
|
|
|
# branded folder icon, and are indexed normally.
|
2026-08-02 19:04:30 -04:00
|
|
|
|
include_hidden = false
|
|
|
|
|
|
# Empty = extract text from every supported format. Non-empty = content
|
|
|
|
|
|
# indexing only for these extensions; other files are still listed for
|
|
|
|
|
|
# filename search. Entries are case-insensitive, leading dot optional.
|
2026-08-03 12:33:47 -04:00
|
|
|
|
# The reserved entry "(none)" whitelists files that have no extension at
|
|
|
|
|
|
# all (Makefile, README, .bashrc); a non-empty list without it skips them.
|
2026-08-23 00:33:53 -04:00
|
|
|
|
# Inside an entry, "#" starts a comment that runs to its end:
|
2026-08-03 12:33:47 -04:00
|
|
|
|
# content_extensions = ["txt", "md # docs", "# pdf — too slow", "(none)"]
|
2026-08-23 00:33:53 -04:00
|
|
|
|
# Narrowing this drops the stored text of the files it now excludes;
|
|
|
|
|
|
# widening it reindexes to extract the ones it now allows.
|
2026-08-02 19:04:30 -04:00
|
|
|
|
content_extensions = []
|
|
|
|
|
|
# Excluded from the index entirely. A pattern without a separator matches
|
|
|
|
|
|
# any single path component (so ".git" prunes whole subtrees); patterns
|
2026-08-23 00:33:53 -04:00
|
|
|
|
# containing one match full paths. Glob syntax (*, ?, [..]); a name
|
|
|
|
|
|
# pattern must match the whole name, so ignoring an extension needs the
|
|
|
|
|
|
# wildcard ("*.jpg"). Matching is case-insensitive on Windows and macOS.
|
|
|
|
|
|
# The Windows defaults add "$RECYCLE.BIN", "System Volume Information",
|
|
|
|
|
|
# "pagefile.sys", "hiberfil.sys", "swapfile.sys", "Thumbs.db" and
|
|
|
|
|
|
# "desktop.ini"; when indexing a whole Windows drive, adding 'C:\Windows'
|
|
|
|
|
|
# and 'C:\Windows\WinSxS' by hand is worthwhile. The index's own files
|
|
|
|
|
|
# are always skipped and need no pattern here.
|
2026-08-02 19:04:30 -04:00
|
|
|
|
ignore_patterns = [".git", "node_modules", "*.tmp", ".venv", "venv"]
|
|
|
|
|
|
|
|
|
|
|
|
# Walker threads per root, keyed by the exact root string from
|
|
|
|
|
|
# indexing_paths. Absent or 0 = auto (4 on local storage, 16 on network
|
|
|
|
|
|
# mounts, detected per root). Applies at the start of the next run.
|
|
|
|
|
|
# root_workers = { "/media/share" = 24 }
|
|
|
|
|
|
|
|
|
|
|
|
[processing]
|
2026-08-23 00:33:53 -04:00
|
|
|
|
# Bytes read from the start of each file for its content hash,
|
|
|
|
|
|
# `sha256(size || first hash_length bytes)`, which backs duplicate
|
|
|
|
|
|
# detection; the same bytes are also the detection window for magic-byte
|
|
|
|
|
|
# matching and the text sniff. Known limitation: files of identical size
|
|
|
|
|
|
# whose heads match are reported as duplicates when they may not be —
|
|
|
|
|
|
# verify from the Duplicates tab before deleting anything. 8192 is tuned;
|
|
|
|
|
|
# raising it to 16384 is defensible, lowering it is not. Clamped to
|
|
|
|
|
|
# 262..1048576 on load.
|
2026-08-02 19:04:30 -04:00
|
|
|
|
hash_length = 8192
|
|
|
|
|
|
# Maximum extracted text stored per file (bytes).
|
|
|
|
|
|
maximum_text_size = 262144
|
2026-08-20 18:58:25 -04:00
|
|
|
|
# Files larger than this skip text extraction entirely (bytes). Clamped to
|
|
|
|
|
|
# 1..4294967296 on load.
|
2026-08-02 19:04:30 -04:00
|
|
|
|
maximum_text_file_size = 2097152
|
|
|
|
|
|
# Files per batch during walks / inserts / extraction.
|
2026-08-03 03:06:19 -04:00
|
|
|
|
batch_size = 500
|
2026-08-23 00:33:53 -04:00
|
|
|
|
# Writer time one indexing root's turn may take before the round-robin
|
|
|
|
|
|
# moves on (milliseconds), so a root extracting large documents cannot
|
|
|
|
|
|
# leave another root's walkers parked behind it. 0 gives each turn one
|
|
|
|
|
|
# batch_size quantum and no more. Clamped to 0..10000 on load.
|
2026-08-17 22:30:43 -04:00
|
|
|
|
writer_turn_slice_ms = 100
|
2026-08-02 19:04:30 -04:00
|
|
|
|
# Files per transaction for incremental FTS updates.
|
|
|
|
|
|
fts_update_batch_size = 1000
|
2026-08-03 03:06:19 -04:00
|
|
|
|
# How large the write-ahead log (index.sqlite-wal) may grow during an
|
2026-08-23 00:33:53 -04:00
|
|
|
|
# indexing run before the indexer forces a checkpoint (bytes); left
|
|
|
|
|
|
# alone, the log grows for the whole run. A stall-frequency knob, not a
|
|
|
|
|
|
# safety one: on a volume short of space the indexer checkpoints sooner
|
|
|
|
|
|
# than asked and stops the run with an error before the disk fills
|
|
|
|
|
|
# (which would kill the process with SIGBUS through SQLite's mmap'd
|
|
|
|
|
|
# wal-index). 0 disables it; any other value below 16777216 is raised to it.
|
2026-08-03 03:06:19 -04:00
|
|
|
|
maximum_wal_size = 536870912
|
2026-08-02 19:04:30 -04:00
|
|
|
|
# FTS5 tokenizer: 'trigram' (substring matching, the default; gets
|
|
|
|
|
|
# remove_diacritics 1 appended), 'unicode61', 'porter', or a full FTS5
|
|
|
|
|
|
# option string. See https://www.sqlite.org/fts5.html#tokenizers
|
|
|
|
|
|
tokenize = "trigram"
|
|
|
|
|
|
# Store extracted text (zstd-compressed) alongside the FTS index. Off:
|
|
|
|
|
|
# the index shrinks to roughly stock-Baloo size, but search loses snippet
|
|
|
|
|
|
# previews, occurrence ranking, case verification, and fuzzy full-text.
|
2026-08-04 23:33:28 -04:00
|
|
|
|
# Turning it off discards the stored text immediately; turning it on
|
|
|
|
|
|
# re-extracts, because the text of files already indexed was never kept.
|
2026-08-02 19:04:30 -04:00
|
|
|
|
store_text_for_snippets = true
|
|
|
|
|
|
|
2026-08-02 20:21:19 -04:00
|
|
|
|
[security]
|
|
|
|
|
|
# Encrypt the index with a password (SQLCipher). The password is asked
|
|
|
|
|
|
# for every time QuickSearch starts; turning this on or off deletes and
|
2026-08-17 19:26:18 -04:00
|
|
|
|
# rebuilds the index. Change it from the GUI (Settings → Security), not by
|
2026-08-02 20:21:19 -04:00
|
|
|
|
# hand: enabling protection also generates the KDF salt below.
|
|
|
|
|
|
password_protected = false
|
|
|
|
|
|
# Store the derived key in the OS keychain (Secret Service / KWallet on
|
|
|
|
|
|
# Linux, Credential Manager on Windows) and skip the startup prompt.
|
|
|
|
|
|
use_keychain = false
|
|
|
|
|
|
# When a password is set, the app writes a `salt` value here (32 hex
|
|
|
|
|
|
# digits). It is not a secret, but it is unique to your index: do not
|
|
|
|
|
|
# create or edit it by hand, and keep it if you copy this file — the
|
|
|
|
|
|
# password only unlocks the index together with its salt.
|
|
|
|
|
|
|
2026-08-02 19:04:30 -04:00
|
|
|
|
[ui]
|
|
|
|
|
|
# Zoom factor for the whole GUI: fonts, spacing, and widgets scale
|
|
|
|
|
|
# together (0.5 – 2.5). Ctrl +/- and Ctrl 0 adjust it temporarily at
|
|
|
|
|
|
# runtime; this value is the persistent baseline.
|
|
|
|
|
|
scale = 1.1
|
2026-08-05 18:05:04 -04:00
|
|
|
|
# Written by QuickSearch, not by you: the folders that have already shown
|
|
|
|
|
|
# the "more subfolders than the watcher can follow" warning, so restarting
|
2026-08-23 00:33:53 -04:00
|
|
|
|
# does not repeat it. Deleting it just means the warnings come back once
|
|
|
|
|
|
# each.
|
2026-08-05 18:05:04 -04:00
|
|
|
|
watch_cap_warned_roots = []
|
2026-08-09 02:58:13 -04:00
|
|
|
|
# System-wide shortcut that raises QuickSearch, switches to the Search tab
|
|
|
|
|
|
# and selects whatever is in the search box, from anywhere. Modifiers are
|
|
|
|
|
|
# Ctrl, Alt and Shift, joined to one key with "+". Leave it empty ("") for
|
|
|
|
|
|
# no shortcut. On Wayland this is only a preference: the shortcut is
|
|
|
|
|
|
# registered with your desktop, which may assign a different key and lets
|
|
|
|
|
|
# you change it in its own keyboard settings.
|
|
|
|
|
|
search_hotkey = "Ctrl+Shift+F"
|
2026-08-23 00:33:53 -04:00
|
|
|
|
# 'dark' or 'light'; anything other than 'light' is dark. Applied as soon
|
|
|
|
|
|
# as it is changed on the Settings tab. Following the desktop's own
|
|
|
|
|
|
# light/dark setting would need the session's D-Bus settings portal, so it
|
|
|
|
|
|
# is deliberately not offered.
|
2026-08-09 02:58:13 -04:00
|
|
|
|
color_scheme = "dark"
|
2026-08-17 19:26:18 -04:00
|
|
|
|
# Written by QuickSearch, not by you: whether the short introduction shown
|
|
|
|
|
|
# on a brand-new installation has been dismissed. Absent means this config
|
|
|
|
|
|
# predates that introduction - an installation that upgraded into this
|
|
|
|
|
|
# version, which is not offered it. The Help tab can show it again at any
|
|
|
|
|
|
# time.
|
|
|
|
|
|
tutorial_seen = false
|
2026-08-02 19:04:30 -04:00
|
|
|
|
|
|
|
|
|
|
[search]
|
|
|
|
|
|
# Start with the fuzzy passes enabled.
|
|
|
|
|
|
fuzzy_default = false
|
|
|
|
|
|
# Ceiling on the fuzzy stages' typo budget. The allowance grows with the
|
|
|
|
|
|
# search term, one edit per three characters, up to this value, so 2
|
|
|
|
|
|
# means "1 edit for 3-5 character terms, 2 for anything longer". 0 turns
|
|
|
|
|
|
# the fuzzy stages off. Above 3 is allowed but not recommended: matches
|
|
|
|
|
|
# become dominated by coincidence and every fuzzy pass slows down.
|
|
|
|
|
|
fuzzy_max_edits = 2
|
2026-08-20 18:58:25 -04:00
|
|
|
|
# Hard cap on results per search (the GUI's scroll list length). Clamped to
|
|
|
|
|
|
# 1..1000000 on load: at zero the cascade stops before its first pass, so
|
|
|
|
|
|
# every search returns nothing and calls the empty answer truncated.
|
2026-08-02 19:04:30 -04:00
|
|
|
|
display_limit = 1000
|
|
|
|
|
|
# Results per streamed batch (latency/overhead knob, not a page size).
|
|
|
|
|
|
results_per_page = 100
|
|
|
|
|
|
# How long the GUI waits after the last keystroke before searching (ms).
|
|
|
|
|
|
debounce_ms = 150
|
2026-08-23 00:33:53 -04:00
|
|
|
|
# Watch the visible search results and show renames, deletions and content
|
|
|
|
|
|
# changes as they happen. What a row shows is read from the file itself,
|
|
|
|
|
|
# so this works whether or not indexing is running, and the index is
|
|
|
|
|
|
# brought up to date for those files. Editing the query drops the watches.
|
2026-08-17 19:26:18 -04:00
|
|
|
|
live_results = true
|
|
|
|
|
|
|
2026-08-23 00:33:53 -04:00
|
|
|
|
# Which columns the Search tab shows; the right-click menu of any column
|
|
|
|
|
|
# header and Settings → Search both write here immediately, without an
|
|
|
|
|
|
# Apply. There is deliberately no 'path' key: the path is always shown,
|
|
|
|
|
|
# because it is the only column that identifies a result on its own.
|
2026-08-17 19:26:18 -04:00
|
|
|
|
[search.columns]
|
|
|
|
|
|
name = true
|
|
|
|
|
|
# The excerpt of a file's contents around the match. Rows that matched on
|
|
|
|
|
|
# their name or path show a dash there instead.
|
|
|
|
|
|
content_match = true
|
|
|
|
|
|
# Off by default: the width these take is usually better spent on the path
|
|
|
|
|
|
# and the matched text. Turning one on also makes it available to sort by;
|
|
|
|
|
|
# sorting by a column that is hidden falls back to sorting by rank.
|
|
|
|
|
|
size = false
|
|
|
|
|
|
modified = false
|
|
|
|
|
|
rank = true
|