# Example gallery

All examples use the exported SDK. They do not include private application
headers. The standard panels require no Qt; the independent ImGui example adds
GLFW and OpenGL. Use a disposable project and the supplied synthetic fixtures.

## Build the examples

From the extracted SDK, configure the consumer suite:

```sh
cmake -S tests -B consumer -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=/absolute/sdk -DET_SDK_BUILD_IMGUI=ON
cmake --build consumer
ctest --test-dir consumer --output-on-failure
```

Each example also has its own CMake project and preset. Follow that example's
README: existing service examples use `release`; the starter and basic examples
use `sdk` with `EPICTUNER_SDK_ROOT`. Run `cmake --list-presets` in the example
directory to see its configure presets.
Keep the extracted SDK directory tree intact: some examples share helpers or
vendored sources. See [deployment](DEPLOYMENT.md) for compiler and renderer dependencies.

## Examples

| Example | Learn | Acceptance you can reproduce |
|---|---|---|
| [Hello panels](../examples/hello-panels/README.md) | Controls, bindings, workspace/floating/modal panels, multiple instances | Edit values; focus the singleton; open independent inspectors; close/reopen and restore state |
| [Cascading selects](../examples/cascading-selects/README.md) | Dynamic Make/Model/Tune options, empty controls, typed selections and 2 × 12 preview | Choose each level; verify preview; change Make and verify downstream reset; host 0.8.3+ |
| [Live telemetry](../examples/live-telemetry/README.md) | Channel selection, timestamps/quality, bounded plot, derived RPM/2 | Connect Mock ECU; change channels; disconnect/reconnect; observe stale values and gaps |
| [Calibration workbench](../examples/calibration-workbench/README.md) | Real field/table/curve/surface prefabs, normalized previews and undo | Use synthetic INI; preview/apply; edit manually to invalidate an old proposal; save/reopen; verify RAM separately from burn |
| [Log analyzer](../examples/log-analyzer/README.md) | Ranges, background statistics, result table/chart, comparison | The supplied 256-row logs yield means 127.5 and 227.5; cancel and rerun |
| [Fuel analysis](../examples/fuel-analysis-demo/README.md) | Bounded correction calculation and explicit Apply | Analyze synthetic lambda log; change limits; reject stale previews and absent channels; no automatic burn |
| [Licensed feature](../examples/licensed-feature-demo/README.md) | Signed package, free/paid action, activation | Paid action denied before activation; accepted after valid mock online/offline activation |
| [ImGui inspector](../examples/imgui-inspector/README.md) | Worker-owned custom window and host reads | Render/input, focus, resize, close/reopen, worker-loss recovery |
| [Fault injection](../examples/fault-injection/README.md) | Intentional worker failure and invalid service calls | Host survives crash/hang; flood is bounded; invalid requests fail; restart is explicit |

## Install through the signed test catalog

The catalog builder takes binaries from that independent consumer build and
signs all eight packages with an ephemeral local test key:

```sh
python tools/test-catalog.py build --sdk /absolute/sdk --binaries /absolute/consumer --output /absolute/test-catalog
python tools/test-catalog.py verify --catalog /absolute/test-catalog --trusted-key /absolute/test-catalog/publisher.json
```

The private key is deleted when the builder exits. The catalog contains public
trust material, signed packages and hashes. The fault-injection entry is
explicitly marked test-only. Review/import the public test publisher in the
Plugins manager, then install selected `.etplugin` files. Never import this
generated identity as a production publisher. Catalog verification does not
replace the host's independent package verification.

See [publishing](PUBLISHING.md) for the package layout and third-party path.
The small [lifecycle examples](../examples/lifecycle/README.md) additionally
show C, C++ and background-task ABI fundamentals.
