# Companion app
SideQuest Companion is a native tray app for Windows, macOS and Linux that syncs the
{doc}`WoW addon `'s save file with
[sidequest-guild.com](https://sidequest-guild.com). It's built with
[GPUI](https://www.gpui.rs/), a Rust UI toolkit: no browser or webview, just a window that draws
itself.
## Main parts
| File | What's in it |
|---|---|
| `src/engine.rs` | The background engine. Owns the watch/sync/update loop and talks to the UI only through `Snapshot` (what the UI reads) and `Command` (what the UI sends). |
| `src/api.rs`, `src/sync.rs`, `src/history.rs` | The website client, upload/stage logic, and sync history. |
| `src/config.rs`, `src/secrets.rs` | Settings, and keyring access for the sync token. |
| `src/wow/` | SavedVariables reading and WoW-install discovery. |
| `src/release.rs`, `src/addon_install.rs`, `src/self_update.rs` | GitHub release checks, installing addon updates, and updating the companion itself. |
| `src/reminders.rs`, `src/notifications.rs`, `src/autostart.rs` | Raid reminders, OS notifications, and launch-at-login. |
| `src/main.rs`, `src/ui/` | The GPUI app, window and tray icon. |
```{mermaid}
flowchart LR
Companion["companion
tray app"] -->|"/api/epgp/* + sync token"| API["website: api/
Litestar backend"]
Companion <-->|"reads/writes SavedVariables"| Addon["addon
in game"]
```
## The engine-UI contract
The UI never touches the filesystem, network, or keyring directly. It only calls
`EngineHandle::snapshot()`, sends a `Command`, or calls `shutdown_blocking()`, and redraws when a
`Repaint` event fires. See {doc}`how-it-works` for what it syncs.
## Pages
- {doc}`run-locally`: build and run it
- {doc}`test`: `cargo test` and the other checks in `make ci`
- {doc}`how-it-works`: what it syncs, the tray, update checks, and where settings live
- {doc}`deploy`: tagging a release and what it builds
- {doc}`readme`: the repo's own README
```{toctree}
:maxdepth: 1
:hidden:
run-locally
test
how-it-works
deploy
readme
```