# How to Run MoneyPrinterV2 in Headless Browser Mode: A Complete Configuration Guide

> Learn how to run MoneyPrinterV2 in headless browser mode. Configure true in your config.json for background YouTube uploads, Twitter posts, and affiliate marketing.

- Repository: [FujiwaraChoki/MoneyPrinterV2](https://github.com/FujiwaraChoki/MoneyPrinterV2)
- Tags: how-to-guide
- Published: 2026-03-20

---

**Set `"headless": true` in your [`config.json`](https://github.com/FujiwaraChoki/MoneyPrinterV2/blob/main/config.json) file to run MoneyPrinterV2 without visible browser windows, allowing the application to execute YouTube uploads, Twitter posts, and affiliate marketing tasks entirely in the background.**

MoneyPrinterV2 is an open-source automation framework that drives social media interactions through Selenium-based browsers. When deploying to remote servers, CI pipelines, or any environment lacking a display server, running the application in headless mode becomes essential for seamless operation.

## Understanding the Headless Configuration Flag

The headless behavior is controlled by a single boolean value in the repository root configuration file.

In [`config.json`](https://github.com/FujiwaraChoki/MoneyPrinterV2/blob/main/config.json), the `headless` key determines whether browser instances render visibly:

```json
{
  "headless": true,
  "verbose": true,
  ...
}

```

The configuration loader in [`src/config.py`](https://github.com/FujiwaraChoki/MoneyPrinterV2/blob/main/src/config.py) exposes this value through the `get_headless()` function:

```python
def get_headless() -> bool:
    """
    Gets the headless flag from the config file.
    """
    with open(os.path.join(ROOT_DIR, "config.json"), "r") as file:
        return json.load(file)["headless"]

```

This helper is imported across all provider classes to ensure consistent headless behavior throughout the application.

## How Headless Mode Works Across Providers

Each automation provider initializes a Selenium `FirefoxOptions` object and conditionally appends the `--headless` argument based on the configuration flag.

### YouTube Automation

In [`src/classes/YouTube.py`](https://github.com/FujiwaraChoki/MoneyPrinterV2/blob/main/src/classes/YouTube.py), the constructor checks the headless flag before launching the browser instance:

```python
if get_headless():
    self.options.add_argument("--headless")

```

This ensures that video uploads and channel management occur without spawning a visible Firefox window.

### Twitter Automation

The Twitter provider in [`src/classes/Twitter.py`](https://github.com/FujiwaraChoki/MoneyPrinterV2/blob/main/src/classes/Twitter.py) implements identical logic:

```python
if get_headless():
    self.options.add_argument("--headless")

```

This allows the application to post tweets and manage accounts on servers without X11 or Wayland displays.

### Affiliate Marketing (AFM)

The AFM class in [`src/classes/AFM.py`](https://github.com/FujiwaraChoki/MoneyPrinterV2/blob/main/src/classes/AFM.py) also respects the global headless configuration:

```python
if get_headless():
    self.options.add_argument("--headless")

```

By centralizing the flag check through `get_headless()`, MoneyPrinterV2 ensures that toggling one configuration value affects all browser-driven operations uniformly.

## Step-by-Step Setup Instructions

Follow this workflow to enable headless operation:

### 1. Configure config.json

Copy the example configuration and enable headless mode:

```bash
cp config.example.json config.json

```

Edit [`config.json`](https://github.com/FujiwaraChoki/MoneyPrinterV2/blob/main/config.json) to set:

```json
{
  "headless": true,
  "firefox_profile": "/path/to/your/firefox/profile",
  "email": {
    "address": "your@email.com",
    "password": "yourpassword"
  }
}

```

### 2. Run Preflight Checks

Validate that Firefox and geckodriver are installed correctly:

```bash
source venv/bin/activate
python3 scripts/preflight_local.py

```

### 3. Launch the Application

Start MoneyPrinterV2 with headless browsers:

```bash
python3 src/main.py

```

The application will now execute all automation tasks without displaying browser windows, making it suitable for VPS deployment, Docker containers, and automated cron jobs.

## Advanced: Programmatic Control

For testing scenarios where you need to override the configuration file temporarily, you can monkey-patch the `get_headless` function:

```python
from src.config import get_headless
import src.config

# Store original function

original_get_headless = get_headless

# Force headless mode regardless of config.json

def always_headless():
    return True

# Apply patch

src.config.get_headless = always_headless

# Now import and run main logic

import src.main  # Will use headless mode even if config.json says false

```

**Note:** This approach is intended for unit tests and development debugging. Production deployments should always use the [`config.json`](https://github.com/FujiwaraChoki/MoneyPrinterV2/blob/main/config.json) flag for predictable behavior.

## Summary

- **Configuration Location:** Set `"headless": true` in the repository root [`config.json`](https://github.com/FujiwaraChoki/MoneyPrinterV2/blob/main/config.json) file.
- **Implementation:** The `get_headless()` function in [`src/config.py`](https://github.com/FujiwaraChoki/MoneyPrinterV2/blob/main/src/config.py) provides the boolean value used by all browser providers.
- **Provider Coverage:** YouTube ([`src/classes/YouTube.py`](https://github.com/FujiwaraChoki/MoneyPrinterV2/blob/main/src/classes/YouTube.py)), Twitter ([`src/classes/Twitter.py`](https://github.com/FujiwaraChoki/MoneyPrinterV2/blob/main/src/classes/Twitter.py)), and AFM ([`src/classes/AFM.py`](https://github.com/FujiwaraChoki/MoneyPrinterV2/blob/main/src/classes/AFM.py)) all check this flag and append `--headless` to Firefox options when enabled.
- **Deployment Benefit:** Headless mode enables operation on servers without display servers, supports CI/CD pipelines, and reduces resource overhead.

## Frequently Asked Questions

### What is headless browser mode in MoneyPrinterV2?

Headless browser mode runs the Firefox WebDriver without rendering a graphical user interface. In MoneyPrinterV2, this means the Selenium automation for YouTube uploads, Twitter posts, and affiliate marketing actions executes entirely in the background, consuming fewer system resources and requiring no X11 or Wayland display server.

### Does headless mode affect upload success rates?

No, headless mode does not inherently affect upload success rates for YouTube videos or Twitter posts. The DOM interactions and network requests remain identical to visible browser operations. However, some websites occasionally serve different markup to headless browsers, so MoneyPrinterV2 relies on the standard Firefox user agent and geckodriver to maintain consistency between headless and GUI modes.

### Can I switch between headless and visible mode without restarting?

No, you must restart the application to switch modes. MoneyPrinterV2 reads the `headless` flag from [`config.json`](https://github.com/FujiwaraChoki/MoneyPrinterV2/blob/main/config.json) once during provider initialization when `get_headless()` is called. To change modes, edit [`config.json`](https://github.com/FujiwaraChoki/MoneyPrinterV2/blob/main/config.json), save the file, and relaunch `python3 src/main.py`. The new setting will apply to all subsequent browser sessions.

### Which browsers does MoneyPrinterV2 support for headless operation?

MoneyPrinterV2 exclusively supports **Mozilla Firefox** for headless operation. The application uses `geckodriver` and the `selenium.webdriver.Firefox` class with `FirefoxOptions`. While Selenium supports other browsers like Chrome, the source code specifically imports and configures Firefox options, meaning Chrome headless mode is not implemented in the current codebase.