The module does **not** start the indexer on load — something must invoke its
`start_indexer` method (via the module-viewer's invoke panel, or another module /
basecamp over the Logos API):
```
start_indexer(config_path, port)
```
*`config_path` — **absolute** path to a JSON config (see
[`config/indexer_config.json`](config/indexer_config.json)). It must be absolute:
the module runs inside the `logos_host` subprocess, whose working directory is not
your shell's.
*`port` — TCP port for the RPC server, e.g. `8779`. Passed as a **string** (see the
macOS / Qt notes below).
On success it returns `0` and the RPC server listens on `ws://localhost:<port>`;
point the explorer (or any client) there. A non-zero return is the FFI
`OperationStatus` (e.g. `2 = InitializationError`) — note the FFI does not log, so
the numeric code is all you get.
### Configuration
`config/indexer_config.json` is deserialized into the indexer's `IndexerConfig`.
Key fields:
| Field | Meaning |
|---|---|
| `bedrock_config.addr` | L1/bedrock node URL the indexer reads from (default `http://localhost:8080` — it must be reachable). |
| `home` | Directory for the indexer's RocksDB state, **relative to the host's working directory** (`"."` by default). Use an absolute path for a predictable location. |
| `channel_id` | The zone channel the indexer consumes; must match what the sequencer inscribes. |
The config keys must match the `IndexerConfig` schema of the `logos-execution-zone`
rev pinned in `flake.nix`/`flake.lock`; bumping that rev may require re-syncing this
file. Unknown keys are ignored.
### macOS / Qt notes
* **Keep the module name short.** `logos_host` derives a Qt Remote Objects `local:`
socket from it (`local:logos_<name>_<id>`), and macOS caps Unix socket paths at
104 bytes. The build emits the library with no `lib` prefix so its filename equals
the registered name (`lez_indexer_module`) — consumers derive the QtRO invoke
target from the filename, so the two must stay identical.
* **`Q_INVOKABLE` parameters are `QString`.** The QtRO `ModuleProxy` invokes via
`QMetaObject::invokeMethod` with exact type matching and delivers arguments as
`QString`, so `start_indexer` takes the port as a string and parses it internally.