# MAM (MyAnonaMouse) Troubleshooting Reference

## Tracker Error: "Unrecognized host/PassKey"

**Full error from MAM's tracker detail page:**
```
ip          port   agent                 error
181.214.x.x 36590  -qB5230- / 5.2.3     Unrecognized host/PassKey. (181.214.x.x)
```

**Root cause:** Browser IP ≠ torrent client IP. MAM compares the IP you're browsing
from against the IP your torrent client is announcing from. When they don't match
(e.g., browser on home connection, torrent client on VPN), the passkey is rejected
even though the passkey itself and the client version are valid.

**MAM FAQ reference:**
> *"If you are running your client over a VPN, but not your browser (or browser is
> on a different vpn tunnel), such as a docker container that also runs the vpn,
> you'll first need to be approved to use a VPN by staff (per rule 1.2). Then
> you'll want to use the Dynamic Seedbox endpoint to manage the client on a
> non-matching IP."*

**Resolution:**
1. Get staff approval via MAM ticket system
2. Set up [Mousehole](https://github.com/t-mart/mousehole) to call the Dynamic
   Seedbox API: `https://www.myanonamouse.net/api/endpoint.php/3/json/dynamicSeedbox.php`

## Tracker Error: "Non-Whitelisted client or version"

**Bencoded tracker response:**
```
d8:intervali86400e12:min intervali86400e8:retry ini86400e14:failure reason58:Non-Whitelisted client or version https://s.mrd.ninja/CLNTe
```

**Check the allowed clients page:** https://s.mrd.ninja/CLNTe

**qBittorrent status on MAM:**
- Allowed: from 5.0.1 to latest 5.2.x line (confirmed as of 2026-07-09)
- qBittorrent Anonymous Mode IS rejected by MAM
- Peer ID format: `-qB5230-` for 5.2.3 on non-Windows
- User-agent: `qBittorrent/5.2.3`

**Known caveat:** The tracker-level whitelist filter may lag behind the web page.
If a new version is on the web whitelist but still getting rejected, there may be
a propagation delay.

## Fastresume Fields (via `strings`)

Key fields in `.fastresume` files that matter for troubleshooting:

| Field | Meaning |
|---|---|
| `paused` | 0 = active, 1 = paused |
| `disable_dht` | 0 = DHT enabled (should be 1 for private trackers) |
| `num_complete` | seeders count, 16777215 = sentinel (unknown) |
| `num_incomplete` | leechers count, 16777215 = sentinel (unknown) |
| `total_downloaded` | bytes downloaded so far |
| `active_time` | seconds the torrent has been active |
| `last_seen_complete` | 0 = never seen a complete copy |
| `last_download` | 0 = no downloads |

Ben code sentinel value 16777215 (0xFFFFFF) means "no data" — the tracker hasn't
returned peer information.

## Dynamic Seedbox API

- **Endpoint:** `https://www.myanonamouse.net/api/endpoint.php/3/json/dynamicSeedbox.php`
- **Requires:** Valid MAM session cookie
- **Purpose:** Registers the current IP of the calling client as an authorized
  seedbox IP for the user's account
- **Frequency:** Called periodically by Mousehole (handled automatically once
  configured)

### Docker Compose Patterns

### Adding Mousehole as a sidecar to existing gluetun + qBittorrent

Required changes to an existing docker-compose.yml:

1. **Gluetun ports:** add `- 127.0.0.1:5010:5010` (or `- 5010:5010` for LAN/KasmVNC access)
2. **Gluetun environment:** add `,5010` to `FIREWALL_VPN_INPUT_PORTS`
3. **New service:** add the mousehole service with `network_mode: "service:gluetun"`
4. **New volume:** add a `mousehole:` volume for cookie persistence

The mousehole service does NOT need to communicate with qBittorrent — it only
talks to the MAM API. It shares gluetun's network stack so outbound traffic goes
through the VPN tunnel.

### Docker Port Binding

When `docker compose restart` doesn't pick up compose file changes:

```
# This restarts with OLD config:
docker compose restart gluetun

# This recreates with NEW config:
docker compose up -d gluetun
```

To verify what ports are actually bound:
```
docker port gluetun
```

`127.0.0.1:5010` binding means host-only. If accessing from KasmVNC or another
Docker container, the port must bind to 0.0.0.0 (specify just `5010:5010` in
compose without an IP prefix).
