Gestura.appgestura.app

User documentation

Configuration

Gestura uses a YAML configuration file located at ~/.gestura/config.yaml. Every setting can also be overridden via environment variables prefixed with GESTURA_.

API keys are never stored in the YAML file, they are persisted in your operating system's secure keychain (macOS Keychain, Windows Credential Manager, or Linux Secret Service). The api_key fields shown below are used only for initial import and are removed from the file after migration.

Full Schema Example

# ── Core ──────────────────────────────────────────────────
hotkey_listen: "Ctrl+Space"
grace_period_secs: 30
nats_url: "nats://127.0.0.1:4223"

# ── LLM Providers ────────────────────────────────────────
llm:
  primary: "anthropic"        # openai | anthropic | gemini | grok | ollama
  fallback: "ollama"
  openai:
    api_key: ""               # stored in keychain
    base_url: null             # custom endpoint (optional)
    model: "gpt-4o"
  anthropic:
    api_key: ""
    base_url: null
    model: "claude-sonnet-4-20250514"
    thinking_budget_tokens: null  # enable extended thinking (optional)
  gemini:
    api_key: ""
    base_url: null
    model: "gemini-2.0-flash"
  grok:
    api_key: ""
    base_url: null
    model: "grok-3"
  ollama:
    base_url: "http://localhost:11434"
    model: "llama3.2"

# ── Voice & Speech ───────────────────────────────────────
voice:
  provider: "local"            # local | openai | none
  audio_device: null           # null = system default
  local_model_path: null       # path to whisper.cpp .bin model
  input_path: null             # test transcription file (dev)
  openai_api_key: null
  openai_base_url: null
  openai_model: "gpt-4o-transcribe"

# ── UI ───────────────────────────────────────────────────
ui:
  theme_mode: "system"         # system | light | dark
  accent: null                 # optional CSS color

# ── Pipeline & Context ───────────────────────────────────
pipeline:
  max_history_messages: 10
  auto_compact_threshold_percent: 80
  compaction_strategy: "Summarize"  # Summarize | Truncate | Clear | Prompt | MemoryBank
  max_context_tokens: 0             # 0 = use provider default
  log_token_usage: true
  project_guardrails:
    enabled: true
    max_chars: 12000

# ── Permissions ──────────────────────────────────────────
permissions:
  default_level: "Restricted"  # Sandbox | Restricted | Full
  default_enabled_tools:
    file: true
    shell: true
    git: true
    code: true
    web: true
    web_search: true
    task: true
    screenshot: false          # privacy-sensitive
    screen_record: false
    screen: false
    a2a: false                 # advanced
    permissions: false
    mcp: false

# ── Notifications ────────────────────────────────────────
notifications:
  sound_enabled: true
  haptic_enabled: true
  sound_volume: 70             # 0-100
  haptic_intensity: 70         # 0-100
  notification_sound: "default"
  command_confirm_sound: "default"
  mcp_feedback_enabled: true
  auto_listen_on_feedback: true

# ── Web Search ───────────────────────────────────────────
web_search:
  provider: "local"            # local | serpapi | duckduckgo | brave
  serpapi_key: null
  brave_key: null
  max_results: 5
  timeout_secs: 30
  extract_content: true
  max_content_length: 10000
  fallback_providers:
    - "duckduckgo"

# ── MCP Servers ──────────────────────────────────────────
mcp_servers:
  - name: "postgres"
    type: "stdio"              # stdio | http | sse
    enabled: true
    command: "npx"
    args: ["-y", "@anthropic-ai/mcp-server-postgres"]
    env: {}
    scope: "user"              # user | project | local
    timeout_secs: 30
    auto_reconnect: true

# ── Developer ────────────────────────────────────────────
developer:
  developer_mode: false
  enable_simulators: true
  auto_discover_simulators: true
  verbose_ble_logging: false
  simulator:
    device_name_pattern: "Gestura Simulator*"
    auto_connect: true
    health_check_interval: 30
    enable_metrics: true
    discovery_port_range: [9000, 9100]

# ── Prompt Enhancement ───────────────────────────────────
prompt_enhancement:
  auto_enhance: false
  style: "concise"             # concise | detailed | technical
  max_length_multiplier_x10: 30   # ÷10 → actual multiplier (3.0×)

# ── Hooks ────────────────────────────────────────────────
hooks:
  enabled: false
  allowed_programs: []
  timeout_ms: 5000
  max_output_bytes: 65536
  hooks:
    - name: "notify-slack"
      event: "post_pipeline"   # pre_pipeline | post_pipeline | pre_tool | post_tool
      command:
        program: "curl"
        args: ["-X", "POST", "https://hooks.slack.com/..."]

# ── MDH Pointers ────────────────────────────────────────
mdh_pointers: {}

Sections

Core Settings

Top-level settings that control the global behavior of the Gestura application.

FieldTypeDefaultDescription
hotkey_listenstring"Ctrl+Space"The keyboard shortcut that activates the Gestura overlay and begins voice recording. When pressed, the app toggles between listening and idle states. Uses the standard modifier+key format (e.g. "Ctrl+Space", "Cmd+Shift+G"). The hotkey is registered globally so it works even when Gestura is not the focused application.
grace_period_secsu3230How many seconds the agent process stays alive after the last interaction before automatically shutting down. This keeps the agent warm for follow-up requests without consuming resources indefinitely. Set to 0 to keep the agent running until manually stopped.
nats_urlstring"nats://127.0.0.1:4223"Connection URL for the embedded NATS messaging server that handles internal communication between the GUI/CLI frontend and the agent backend. You should only change this if you are running NATS on a custom port or connecting to a remote instance.

LLM Providers (llm)

Define your primary and fallback inference providers. Gestura supports OpenAI, Anthropic, Gemini, Grok, and local Ollama models. If the primary provider fails, requests automatically fall back to the configured fallback.

FieldTypeDefaultDescription
primarystring"anthropic"Selects which LLM provider handles all inference requests by default. Accepted values are "openai", "anthropic", "gemini", "grok", or "ollama". The corresponding provider section below must be configured with a valid API key (or base URL for Ollama).
fallbackstring?"ollama"An optional secondary provider that Gestura automatically switches to when the primary provider returns an error (e.g. rate-limit, network timeout, or 5xx response). Set to null to disable automatic fallback. Commonly set to "ollama" so requests can continue locally if the cloud API is unavailable.

Provider Configuration

Each provider section accepts the following fields:

FieldTypeDefaultDescription
api_keystring""Your API authentication key for this provider. On first launch, Gestura migrates this value into the operating system's secure keychain and removes it from the YAML file. After migration, this field is ignored because the keychain becomes the source of truth. You can also set this via the corresponding GESTURA_*_API_KEY environment variable for CI/CD or containerized deployments.
base_urlstring?nullOverrides the default API endpoint URL for this provider. Use this to point at a self-hosted proxy, an Azure OpenAI deployment, or a compatible third-party API (e.g. Together AI, Fireworks). When null, Gestura uses the provider's official endpoint.
modelstring(varies)The specific model identifier sent in API requests. This must match a model name recognized by the provider (e.g. "gpt-4o", "claude-sonnet-4-20250514", "gemini-2.0-flash"). Changing this lets you switch between model tiers without changing providers. For example, using "gpt-4o-mini" for faster, cheaper responses.

Default models per provider:

  • OpenAI: gpt-4o
  • Anthropic: claude-sonnet-4-20250514, which also supports thinking_budget_tokens for extended reasoning
  • Gemini: gemini-2.0-flash
  • Grok: grok-3
  • Ollama: llama3.2 (base URL: http://localhost:11434)

Voice & Speech (voice)

Controls speech-to-text input. By default Gestura uses a local whisper.cpp model for privacy and speed. You can switch to OpenAI's Whisper API for higher accuracy, or disable voice entirely with "none".

FieldTypeDefaultDescription
providerstring"local"Determines which speech-to-text engine processes your voice input. "local" runs a whisper.cpp model entirely on your machine, so no audio data leaves your device. "openai" sends audio to the OpenAI Whisper API for higher-accuracy transcription (requires an API key). "none" disables voice input completely, hiding the microphone UI and hotkey recording.
audio_devicestring?nullThe name of the audio input device (microphone) to use for voice recording. When null, Gestura uses your operating system's default input device. Set this if you have multiple microphones and want to ensure a specific one is always used, such as "Blue Yeti" or "AirPods Pro". The name must match the device name exactly as reported by the OS.
local_model_pathstring?nullAbsolute file path to a whisper.cpp-compatible model file (.bin format). Larger models produce more accurate transcriptions but require more RAM and CPU time. When null, Gestura automatically downloads a default base model (~150 MB) on first use. You can point this to a custom or fine-tuned model for better accuracy with specific vocabularies.
input_pathstring?nullDevelopment-only setting. When set, Gestura reads audio from this WAV file instead of the microphone, allowing you to test transcription pipelines with pre-recorded audio without needing to speak. Ignored in production use.
openai_api_keystring?nullA separate OpenAI API key used exclusively for voice transcription requests. This lets you use a different API key (or account) for voice than for LLM inference. This is useful for billing separation or rate-limit isolation. When null, falls back to the key configured in llm.openai.api_key.
openai_base_urlstring?nullCustom API endpoint for OpenAI voice transcription. Use this if your organization proxies OpenAI requests through a gateway, or if you use an OpenAI-compatible STT service at a different URL. When null, uses the standard OpenAI API endpoint.
openai_modelstring?"gpt-4o-transcribe"The OpenAI speech-to-text model to use for transcription. "gpt-4o-transcribe" offers the best accuracy and supports more languages. You can switch to "whisper-1" for lower cost if accuracy is acceptable for your use case.

UI Preferences (ui)

Controls the Gestura desktop client appearance.

FieldTypeDefaultDescription
theme_modestring"system"Controls the color scheme of the Gestura desktop window. "system" automatically matches your OS light/dark mode preference and updates in real time when you toggle it. "light" forces a bright background with dark text. "dark" forces a dark background with light text. Must be one of these three values or validation will report an error.
accentstring?nullSets a custom accent color used for interactive elements like buttons, links, and progress indicators in the Gestura desktop UI. Accepts any valid CSS color value (e.g. "#7C3AED", "rgb(124, 58, 237)", "purple"). When null, the built-in default accent color is used.

Pipeline & Context (pipeline)

Controls how the agent pipeline manages conversation context, token limits, and auto-compaction behavior.

FieldTypeDefaultDescription
max_history_messagesusize10The maximum number of recent conversation messages (user + assistant pairs) included in the LLM prompt context. Higher values give the agent more conversational memory but consume more tokens per request, increasing cost and latency. Lower values save tokens but may cause the agent to "forget" earlier parts of the conversation.
auto_compact_threshold_percentu880When the estimated token count of the conversation history reaches this percentage of the model's context window limit, Gestura automatically triggers compaction using the configured strategy. For example, at 80% with a 128K-token model, compaction fires when history reaches ~102K tokens. Set to 100 to disable auto-compaction entirely (not recommended, as this may cause API errors from exceeding the context limit).
compaction_strategyenum"Summarize"Determines how Gestura reduces conversation history when the auto-compact threshold is exceeded. "Summarize" (default) uses the LLM to condense older messages into a brief summary, preserving key context. "Truncate" drops the oldest messages. "Clear" wipes the entire history and starts fresh. "Prompt" pauses and asks you which action to take. "MemoryBank" saves the full context to a persistent file on disk before clearing, so it can be referenced later.
max_context_tokensusize0Overrides the maximum number of tokens Gestura will use for the context window. When set to 0 (default), Gestura automatically uses the known context limit for the selected model (e.g. 128K for GPT-4o, 200K for Claude). Set this manually if you want to limit token usage below the model's maximum. This is useful for reducing cost or staying within organization-level quotas.
log_token_usagebooltrueWhen enabled, Gestura logs detailed token usage statistics (prompt tokens, completion tokens, total) after every LLM request. Useful for monitoring costs and understanding context consumption. The logs appear in the application log file and, if developer mode is on, in the debug panel.

Reflection & Learning (pipeline.reflection)

Reflection is Gestura's ERL-inspired quality-recovery system. When enabled, weak turns can trigger a structured correction phase, optionally leading to a same-turn text-only retry and promotion of strong reflections into durable memory.

FieldTypeDefaultDescription
enabledboolfalseTurns on ERL-inspired reflection for low-quality turns. This is opt-in because it adds extra model work and can increase latency and cost.
quality_threshold_percentu860Reflection only triggers when the internal quality score falls below this threshold. Lower values make reflection rarer; higher values make it more aggressive.
max_injectedusize3Maximum number of past reflections that can be injected back into later prompts as corrective guidance.
max_retry_attemptsusize1Maximum same-turn revision attempts allowed after a reflection is generated. These retries are designed to improve the answer without replaying tool side effects.
promotion_confidence_percentu875Minimum confidence required before a reflection is promoted from session-level corrective context into longer-term memory.

Project Guardrails (pipeline.project_guardrails)

Automatically discovers and injects project-level instructions (e.g. from an AGENTS.md file) into the agent's system prompt.

FieldTypeDefaultDescription
enabledbooltrueWhen enabled, Gestura searches for project-level instruction files (such as AGENTS.md, .gestura/instructions.md, or similar) in the current working directory and its parents. If found, their contents are injected into the agent's system prompt, giving the agent project-specific rules, coding conventions, or security constraints. Disable this if you want the agent to operate without project-specific context.
max_charsusize12000Limits how many characters of the guardrails file are included in the system prompt. Large guardrails files are truncated to this limit to avoid consuming excessive context window space. If your guardrails are complex, increase this value, but be aware that more characters mean fewer tokens available for conversation history.

Permissions (permissions)

Controls what the agent can do without explicit user confirmation. These are default settings. Individual sessions can override them.

FieldTypeDefaultDescription
default_levelenum"Restricted"Sets the baseline permission level that every new agent session starts with. This controls how much autonomy the agent has before asking for confirmation. See the "Permission Levels" section below for a full description of each level. Individual sessions can escalate or restrict permissions at runtime.
default_enabled_toolsmap(see below)A map of tool names to boolean values that controls which tool categories are available to the agent by default. Tools set to false are completely hidden from the agent, meaning it cannot invoke them or even see they exist. This is the first line of defense for controlling agent capabilities. See the "Default Tool States" table below for the full list.

Permission Levels

  • Sandbox: Read-only access. No file writes or shell commands.
  • Restricted (default): Can read files, but asks for confirmation before writes or shell commands.
  • Full: No confirmations. Use with caution.

Default Tool States

FieldTypeDefaultDescription
filebooltrueAllows the agent to read, write, create, and delete files on the local filesystem. This is essential for most coding workflows. When disabled, the agent cannot access any files and can only answer questions from its own knowledge.
shellbooltrueAllows the agent to execute shell commands (e.g. running scripts, installing packages, compiling code). Commands still require user confirmation under the "Restricted" permission level. Disabling this prevents all command execution.
gitbooltrueAllows the agent to run Git operations such as committing, branching, pushing, and viewing diffs. Useful for code review and version control workflows. Disable if you do not want the agent to modify your repository history.
codebooltrueEnables code analysis tools such as syntax parsing, symbol lookup, and refactoring utilities. These tools help the agent understand codebases more efficiently without reading every file line-by-line.
webbooltrueAllows the agent to fetch and read web pages by URL. Used when you ask the agent to review documentation, pull information from a specific page, or interact with web APIs. Disable to prevent all outbound HTTP requests from the agent.
web_searchbooltrueAllows the agent to perform web search queries to find relevant information, documentation, or solutions. Uses the search provider configured in the web_search section. Disable to keep the agent fully offline.
taskbooltrueEnables the task management tool that lets the agent create, update, and track tasks in the UI's task panel. This helps organize multi-step workflows. Disabling hides the task panel integration.
screenshotboolfalseAllows the agent to capture screenshots of your screen. Disabled by default because it is privacy-sensitive, as screenshots may capture sensitive information visible on your display. Enable only in trusted environments.
screen_recordboolfalseAllows the agent to record video of your screen. Disabled by default for privacy. Screen recordings are stored locally and never transmitted. Enable only when you need the agent to observe visual workflows.
screenboolfalseAllows the agent to interact with the screen by clicking, typing, and navigating UI elements. This is the most powerful screen tool and is disabled by default for safety. Enable only in controlled environments where you want full automation.
a2aboolfalseEnables agent-to-agent (A2A) delegation, allowing the agent to spawn sub-agents or communicate with external agent services. This is an advanced feature for multi-agent orchestration workflows. Disabled by default to prevent unintended agent spawning.
permissionsboolfalseAllows the agent to modify its own permission settings at runtime. Disabled by default to prevent the agent from escalating its own privileges. Enable with extreme caution, as a misconfigured agent could grant itself full access.
mcpboolfalseAllows the agent to manage MCP server connections, including adding, removing, enabling, or disabling servers at runtime. Disabled by default because MCP servers can expose external systems and APIs. Enable when you want the agent to dynamically configure its own tool integrations.

Notifications (notifications)

Controls how Gestura confirms completed actions. Supports audio sound effects and Haptic Harmony ring vibrations.

FieldTypeDefaultDescription
sound_enabledbooltrueMaster switch for all audio notifications. When enabled, Gestura plays sound effects to confirm actions like response completion, command execution, and errors. Turn off to run in silent mode (haptic feedback can still be used independently).
haptic_enabledbooltrueMaster switch for Haptic Harmony ring vibration feedback. When enabled and a Haptic Harmony ring is connected, the ring vibrates to confirm completed actions, errors, and attention-required events. Works independently of sound notifications.
sound_volumeu870Controls the volume of audio notification sounds, from 0 (silent) to 100 (maximum). This is a relative volume, so the actual output level also depends on your system volume. Values outside the 0–100 range will cause a validation warning.
haptic_intensityu870Controls the strength of Haptic Harmony ring vibrations, from 0 (no vibration) to 100 (strongest). Higher values produce more noticeable haptic patterns. Values outside the 0–100 range will cause a validation warning.
notification_soundstring"default"The sound effect played when the agent completes a response. "default" uses the built-in notification chime. You can set this to a custom sound name if custom sound packs are installed.
command_confirm_soundstring"default"The sound effect played when a shell command or tool invocation completes. Provides audio confirmation that an action has finished, which is especially helpful during long-running operations. "default" uses the built-in confirmation tone.
mcp_feedback_enabledbooltrueWhen enabled, Gestura displays visual and audio/haptic notifications when MCP servers send feedback events (e.g. progress updates, tool completion signals). Disable if MCP feedback is too noisy or distracting.
auto_listen_on_feedbackbooltrueWhen enabled, Gestura automatically reactivates voice listening mode after delivering a notification or feedback event. This creates a natural conversational flow where you can immediately give follow-up commands after hearing the response notification, without pressing the hotkey again.

Configures the built-in web search tool. The default local provider uses DuckDuckGo HTML scraping and requires no API key.

FieldTypeDefaultDescription
providerenum"local"Selects the primary search engine used by the web_search tool. "local" scrapes DuckDuckGo HTML results directly. It is free, requires no API key, but may be rate-limited. "serpapi" uses the SerpAPI service for reliable Google-quality results (requires a paid API key). "duckduckgo" uses the official DuckDuckGo API. "brave" uses the Brave Search API (requires an API key).
serpapi_keystring?nullYour SerpAPI authentication key for accessing Google search results programmatically. Required when provider is set to "serpapi". Get a key at serpapi.com. Like other API keys, this is migrated to the system keychain after first use.
brave_keystring?nullYour Brave Search API key for programmatic access to Brave's search index. Required when provider is set to "brave". Get a key at brave.com/search/api/. Migrated to keychain after first use.
max_resultsusize5The maximum number of search results returned per query. More results give the agent a broader range of sources to evaluate, but each result consumes tokens when included in the agent's context. For most tasks, 3–5 results provide a good balance of coverage and token efficiency.
timeout_secsu6430Maximum time in seconds to wait for the search provider to respond before timing out. If the primary provider times out, Gestura will attempt the fallback providers in order. Increase this if you are on a slow network connection.
extract_contentbooltrueWhen enabled, Gestura fetches the full page content from each search result URL and extracts the main text, giving the agent access to the actual information, not just the search snippet. Disable to save time and tokens if you only need search result titles and URLs.
max_content_lengthusize10000Maximum number of characters to extract from each search result page when extract_content is enabled. Longer content gives the agent more information but consumes more tokens. Pages that exceed this limit are truncated. 10,000 characters is roughly 2,500 tokens.
fallback_providerslist["duckduckgo"]An ordered list of backup search providers to try if the primary provider fails (due to errors, rate limits, or timeouts). Gestura tries each fallback in sequence until one succeeds. Empty the list to disable fallback behavior entirely.

MCP Servers (mcp_servers)

An array of MCP (Model Context Protocol) server entries. Compatible with the .mcp.json schema used by Claude Desktop / Claude Code. You can also import servers from Claude Desktop via the CLI.

FieldTypeDefaultDescription
namestringrequiredA unique identifier for this MCP server entry. Used in the UI, logs, and tool namespacing. Choose a short, descriptive name like "postgres", "github", or "jira". Server names must be unique across all entries.
typeenum"stdio"The transport protocol used to communicate with the MCP server. "stdio" launches a local process and communicates via stdin/stdout and is most common for CLI-based servers like npx packages. "http" connects to a remote server using HTTP request/response. "sse" connects to a remote server using Server-Sent Events for real-time streaming. Use "stdio" for local tools, "http" or "sse" for remote/cloud services.
enabledbooltrueControls whether this MCP server is active. When false, the server entry is preserved in the config but Gestura will not connect to it or expose its tools. Useful for temporarily disabling a server without deleting its configuration.
commandstring?nullThe executable command to run for stdio-type servers. This is the program that Gestura will spawn as a child process. Common examples: "npx" (for npm packages), "python" (for Python-based servers), "docker" (for containerized servers). Not used for http/sse transports.
argslist[]Command-line arguments passed to the stdio server command. For example, if command is "npx", args might be ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"]. Each argument is a separate string in the array.
envmap{}Environment variables injected into the stdio server process at startup. Useful for passing API keys, database connection strings, or configuration values to the server. Keys are variable names and values are strings, e.g. {"DATABASE_URL": "postgres://..."}.
urlstring?nullThe endpoint URL for http or sse transport types. For http, this is the base URL of the MCP API (e.g. "https://mcp.example.com/v1"). For sse, this is the SSE stream URL. Not used for stdio transports.
headersmap{}Custom HTTP headers included with every request to http/sse servers. Common uses include authentication tokens ("Authorization": "Bearer ...") or custom routing headers. Not used for stdio transports.
scopeenum"user"Determines when this MCP server is available. "user" makes the server globally available across all projects and sessions. "project" makes it available only when working in a specific project directory. "local" makes it available only in the current session. Project and local scoped servers are typically defined in .mcp.json files rather than the global config.
timeout_secsu6430Maximum time in seconds to wait for the initial connection to the MCP server to be established. If the server does not respond within this time, it is marked as failed. Increase for remote servers on slow networks or servers that have a lengthy startup process.
auto_reconnectbooltrueWhen enabled, Gestura automatically attempts to reconnect to this MCP server if the connection drops unexpectedly (e.g. server crash, network interruption). Reconnection uses exponential backoff. Disable for servers that should only run on-demand.

Developer Settings (developer)

Settings for Haptic Harmony ring simulator integration and development debugging.

FieldTypeDefaultDescription
developer_modeboolfalseActivates developer-only features throughout Gestura, including verbose logging to the console, a debug information panel in the GUI showing real-time agent state, and additional diagnostic data in API responses. Not recommended for normal use because it significantly increases log volume and may expose internal system details.
enable_simulatorsbooltrueAllows Gestura to connect to Haptic Harmony ring simulator instances running on your machine or local network. Simulators emulate the hardware ring's Bluetooth interface, letting you develop and test haptic feedback workflows without a physical device.
auto_discover_simulatorsbooltrueWhen enabled, Gestura automatically scans the local network for running Haptic Harmony simulator instances using UDP broadcast within the configured port range. Disable if you want to connect to simulators manually or if automatic discovery causes network noise in your environment.
verbose_ble_loggingboolfalseEnables extremely detailed logging of all Bluetooth Low Energy (BLE) communication with Haptic Harmony rings and simulators, including raw packet data, GATT characteristic reads/writes, and connection state transitions. Only useful when debugging Bluetooth connectivity issues.

Simulator (developer.simulator)

FieldTypeDefaultDescription
device_name_patternstring"Gestura Simulator*"A glob pattern used to identify simulator devices during auto-discovery. Only devices whose advertised name matches this pattern will be recognized as simulators. The default "Gestura Simulator*" matches names like "Gestura Simulator 1", "Gestura Simulator (local)", etc. Change this if your simulators use a custom naming convention.
auto_connectbooltrueWhen enabled, Gestura automatically connects to any simulator that is discovered and matches the device_name_pattern, without requiring manual approval. Disable if you want to review and manually select which simulators to connect to.
health_check_intervalu3230How often (in seconds) Gestura sends a health check ping to each connected simulator to verify it is still responsive. If a simulator fails to respond, it is marked as disconnected and auto-reconnect is attempted (if enabled). Lower values detect failures faster but generate more network traffic.
enable_metricsbooltrueWhen enabled, Gestura collects performance metrics from connected simulators, including latency, throughput, haptic pattern execution time, and memory usage. Metrics are available in the developer debug panel. Disable to reduce overhead during high-frequency haptic testing.
discovery_port_rangetuple[9000, 9100]The range of UDP ports that Gestura scans when auto-discovering simulators on the local network. Specified as a [start, end] pair. Simulators listen on a port within this range for discovery broadcasts. Widen the range if you run many simultaneous simulator instances.

Prompt Enhancement (prompt_enhancement)

LLM-powered prompt improvement that rewrites user input before sending it to the primary model.

FieldTypeDefaultDescription
auto_enhanceboolfalseWhen enabled, Gestura automatically rewrites your prompt using the LLM to make it clearer, more specific, and more effective, before sending it to the primary model. Enhancement is debounced (waits until you stop typing). This adds latency and a small token cost for the rewrite step, but can significantly improve response quality for short or ambiguous prompts.
stylestring"concise"Controls the rewriting style of the prompt enhancer. "concise" produces tight, focused rewrites that stay close to your original intent. "detailed" expands prompts with additional context and constraints for more thorough responses. "technical" adds precision, specific terminology, and structured formatting suitable for engineering tasks.
max_length_multiplier_x10u830Limits how much longer the enhanced prompt can be compared to your original input. The value is multiplied by 0.1, so 30 means the enhanced prompt can be up to 3.0× the length of the original. Valid range is 10 (1.0x, no expansion) to 50 (5.0x, very expansive). Lower values keep rewrites concise; higher values allow the enhancer to add significant detail.

Hooks (hooks)

Execute custom commands on pipeline lifecycle events. Hooks are disabled by default and require an explicit allow-list of programs for security.

FieldTypeDefaultDescription
enabledboolfalseMaster switch that controls whether any hooks execute. When false, all hook definitions are ignored regardless of their individual configuration. Enable this only after configuring your allowed_programs list, since hooks execute arbitrary commands and should be treated as a security-sensitive feature.
allowed_programslist[]A whitelist of program names that hooks are permitted to execute. Only programs in this list can be used as the command.program field in hook definitions. For example, ["curl", "python3", "node"] allows hooks to run curl, Python, and Node.js scripts. This is a critical security control; an empty list (default) means no hooks can execute even if enabled is true.
timeout_msu645000The maximum time in milliseconds that a single hook is allowed to run before being forcefully terminated. This prevents runaway hook commands from blocking the pipeline indefinitely. 5000 ms (5 seconds) is sufficient for most notification and logging hooks. Increase for hooks that call slow external APIs.
max_output_bytesusize65536The maximum number of bytes captured from a hook's combined stdout and stderr output. Output beyond this limit is silently truncated. The captured output is available in logs and, for post-event hooks, can be displayed in the UI. 65536 bytes (64 KB) is sufficient for most use cases.

Hook Definition (hooks.hooks[])

FieldTypeDefaultDescription
namestringrequiredA human-readable label for this hook, shown in the UI and included in log messages. Use descriptive names like "notify-slack", "log-to-file", or "run-linter". Does not need to be unique but should be identifiable.
eventenumrequiredThe pipeline lifecycle event that triggers this hook. "pre_pipeline" fires before the agent starts processing a request (useful for logging or setup). "post_pipeline" fires after the agent finishes a response (useful for notifications). "pre_tool" fires before each tool invocation. "post_tool" fires after each tool completes (useful for auditing or triggering CI).
command.programstringrequiredThe program to execute when this hook fires. Must exactly match one of the entries in the allowed_programs list. If it does not match, the hook will be silently skipped. Examples: "curl" for webhook notifications, "python3" for custom scripts, "osascript" for macOS automations.
command.argslist[]Arguments passed to the hook program. Supports {{key}} template placeholders that are replaced with context values at runtime. For example, {{event}} is replaced with the event name, {{tool_name}} with the tool that was invoked, and {{timestamp}} with the ISO 8601 execution time. Each argument is a separate string in the array.

MDH Pointers (mdh_pointers)

A free-form map of string keys to string values used for Machine Data Hub pointer mappings. Empty by default.

Environment Variables

All environment variables use the GESTURA_ prefix and snake_case naming. They take the highest precedence, overriding both config file values and defaults.

VariableConfig PathDescription
GESTURA_HOTKEY_LISTENhotkey_listenGlobal hotkey to toggle the app
GESTURA_GRACE_PERIOD_SECSgrace_period_secsAgent shutdown grace period (seconds)
GESTURA_NATS_URLnats_urlNATS server URL for messaging
GESTURA_LLM_PRIMARYllm.primaryPrimary LLM provider
GESTURA_LLM_FALLBACKllm.fallbackFallback LLM provider
GESTURA_OPENAI_API_KEYllm.openai.api_keyOpenAI API key
GESTURA_OPENAI_BASE_URLllm.openai.base_urlOpenAI API base URL
GESTURA_OPENAI_MODELllm.openai.modelOpenAI model name
GESTURA_ANTHROPIC_API_KEYllm.anthropic.api_keyAnthropic API key
GESTURA_ANTHROPIC_BASE_URLllm.anthropic.base_urlAnthropic API base URL
GESTURA_ANTHROPIC_MODELllm.anthropic.modelAnthropic model name
GESTURA_GEMINI_API_KEYllm.gemini.api_keyGemini API key
GESTURA_GEMINI_BASE_URLllm.gemini.base_urlGemini API base URL
GESTURA_GEMINI_MODELllm.gemini.modelGemini model name
GESTURA_GROK_API_KEYllm.grok.api_keyGrok API key
GESTURA_GROK_BASE_URLllm.grok.base_urlGrok API base URL
GESTURA_GROK_MODELllm.grok.modelGrok model name
GESTURA_OLLAMA_BASE_URLllm.ollama.base_urlOllama server URL
GESTURA_OLLAMA_MODELllm.ollama.modelOllama model name
GESTURA_VOICE_PROVIDERvoice.providerVoice provider (local, openai, none)
GESTURA_VOICE_LOCAL_MODEL_PATHvoice.local_model_pathPath to local Whisper model
GESTURA_VOICE_OPENAI_API_KEYvoice.openai_api_keyOpenAI API key for voice
GESTURA_VOICE_OPENAI_MODELvoice.openai_modelOpenAI voice model
GESTURA_VOICE_AUDIO_DEVICEvoice.audio_deviceAudio input device name
GESTURA_UI_THEME_MODEui.theme_modeTheme mode (system, light, dark)
GESTURA_UI_ACCENTui.accentAccent color
GESTURA_DEVELOPER_MODEdeveloper.developer_modeEnable developer mode
GESTURA_ENABLE_SIMULATORSdeveloper.enable_simulatorsEnable device simulators
GESTURA_VERBOSE_BLE_LOGGINGdeveloper.verbose_ble_loggingEnable verbose BLE logging
GESTURA_WEB_SEARCH_PROVIDERweb_search.providerWeb search provider
GESTURA_SERPAPI_KEYweb_search.serpapi_keySerpAPI key
GESTURA_BRAVE_SEARCH_KEYweb_search.brave_keyBrave Search API key

Examples:

export GESTURA_LLM_PRIMARY="openai"
export GESTURA_OPENAI_API_KEY="sk-..."
export GESTURA_VOICE_PROVIDER="none"
export GESTURA_UI_THEME_MODE="dark"

Validation & Health Check

Gestura validates your configuration on startup and reports errors and warnings. You can also run a manual health check via the CLI with gestura config check.

Key Validation Rules

  • ui.theme_mode must be "system", "light", or "dark".
  • notifications.sound_volume and haptic_intensity must be 0–100.
  • OpenAI keys must start with sk- (≥ 20 chars).
  • Anthropic keys must start with sk-ant- (≥ 20 chars).
  • Grok keys must start with xai- (≥ 20 chars).
  • Ollama requires a non-empty base_url (defaults to http://localhost:11434).

Configuration Precedence

Settings are resolved in the following order (highest wins):

  1. Environment variables (GESTURA_*)
  2. Config file (~/.gestura/config.yaml)
  3. Built-in defaults

© 2026 Gestura AI LLC. All rights reserved.