# Chrome User Data Directories & Profiles PinchTab manages Chrome instances using dedicated **User Data Directories** (profiles). This document explains how these directories are resolved, how locks are managed, and how to handle parallel browser instances. ## Profile Resolution PinchTab determines the Chrome `--user-data-dir` (profile) using the following precedence: 1. **Explicit `ProfileDir`**: If a specific path is provided in the configuration or as a flag, PinchTab uses that exact directory. 2. **Named Profile**: If a profile name is provided (e.g., via the dashboard or CLI), PinchTab resolves it to a subdirectory within the `ProfilesBaseDir`. 3. **Default Profile**: If no profile is specified, it defaults to `~/.config/pinchtab/profiles/default` (on Linux/macOS). ## The Singleton Model Chrome enforces a **Singleton** model per User Data Directory. This means: * Only **one** Chrome process can use a specific profile directory at any given time. * If a second process attempts to use the same directory, Chrome will either fail to start or (in some configurations) attempt to open a new window in the existing process. PinchTab adds an additional layer of protection using a `pinchtab.pid` file within the profile directory to ensure that only one PinchTab instance manages a specific profile. ## New Headless & Parallel Instances With the introduction of **New Headless mode** (`--headless=new`), Chrome's profile sharing behavior has become stricter: * **No Sharing**: You cannot reuse the same `--user-data-dir` across multiple concurrent instances. * **Separate Directories Required**: Parallel browsers **must** use separate directories to avoid random startup errors and lock conflicts. ### Headless Auto-Fallback To support parallel automation tasks, PinchTab implements an **automatic fallback for headless instances**: 1. If a headless instance tries to start using a profile that is already locked by another PinchTab process, it will **automatically create a unique temporary directory** (e.g., `/tmp/pinchtab-profile-*`). 2. This allows you to run multiple headless tasks in parallel without manually managing profile paths. ### Manual Parallelism (Headed Mode) In **headed mode**, PinchTab does *not* automatically fall back to a temporary directory (to avoid losing user session data unexpectedly). If you need to run multiple headed browsers in parallel, you must: * Use different named profiles. * Explicitly provide a unique `--user-data-dir` for each instance. ## Best Practices for AI Agents When building agents that use PinchTab, follow these guidelines: * **Persistence**: Use named profiles (e.g., `agent-alpha`, `agent-beta`) if you need the browser to remember logins, cookies, or history across sessions. * **Isolation**: For one-off tasks or high-concurrency scraping, rely on the default headless mode which handles directory isolation automatically if conflicts occur. * **Cleanup**: If you manually create temporary directories, ensure they are cleaned up after the task is complete to avoid filling up disk space. ## Troubleshooting If you see the error `"The profile appears to be in use by another Chromium process"`: 1. **Check for active instances**: Ensure you don't have another PinchTab or Chrome process already using that profile. 2. **Stale Locks**: If no process is active, PinchTab will attempt to automatically clear stale `SingletonLock` files on the next startup. 3. **Manual Fix**: In rare cases, you may need to manually remove the `SingletonLock` file from the profile directory. For more details on how PinchTab recovers from crashes, see [Chrome Profile Lock Recovery](docs/implementations/chrome-profile-lock-recovery.md).