Docs

What you are actually running

Poltergeist is a native Windows desktop binary: the UI is Slint; the engine and IO layers are Rust. There is no separate web server in the loop - hotkeys, focus tracking, and injection go straight through platform code. That keeps latency and failure modes understandable for a tray-resident tool.

The workspace splits responsibilities so each crate has one story:

  • poltergeist-app - Slint UI, tray, picker popup, wiring between settings and runtime.
  • poltergeist-core - token evaluation, snippet/folder models, match rules and filters.
  • poltergeist-io - JSON config, team pack sync, DeepL and database file access.
  • poltergeist-platform-win - global hotkeys, foreground window awareness, clipboard and SendInput injection helpers, single-instance behaviour.

If you are sketching architecture on a whiteboard, draw four boxes in a row: UI → core → IO → platform. Data flows toward the target window at the right edge; config and team packs enter from disk and network on the left.

Injection modes exist because “paste” is not one thing: clipboard paths cover most apps; Shift+Insert suits many terminals; synthetic key events satisfy editors that strip rich paste; a dedicated web-terminal path exists when scan codes matter. Choosing the wrong mode looks like “Poltergeist is broken” - which is usually the target app being strict, not the snippet text.

Team share treats remote content as downstream: manifest and JSON describe what to fetch; a local team_cache/ keeps last-known-good copies when shares or HTTPS endpoints go quiet. Publishing from the app targets folder/UNC flows; HTTP(S) consumption is read-only by design.

Editions: the default build can resolve user vs admin at runtime (POLTERGEIST_EDITION, _admin.flag, or default user). A separate admin-edition compile pins Admin regardless - useful when you ship a fixed binary to operators who must not flip edition by accident.

Network notes: outbound requests use reqwest with native TLS roots where relevant, which tends to behave better under corporate inspection than a minimal CA bundle alone.

For authors, the long-form syntax reference lives in TUTORIAL.md in the repository - tokens, filters, conditionals, and worked examples. Treat that file as the ground truth when the UI tooltip is too short.