diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index 08cf4d8..5a7d94d 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -9,10 +9,10 @@ work without, the projects and data sources below, which keep their own terms. is **not affiliated with or endorsed by Grinding Gear Games in any way.** Item names, modifier wordings, the clipboard format the game writes on Ctrl+C, and the stat -identifiers a trade query is built from are GGG's. None of it is baked into the binary — it is +identifiers a trade query is built from are GGG's. None of it is baked into the binary - it is downloaded at runtime from [PathOfPriceCheck-Data](https://github.com/JIRPOS/PathOfPriceCheck-Data), whose [DATA-LICENSE.md](https://github.com/JIRPOS/PathOfPriceCheck-Data/blob/main/DATA-LICENSE.md) -states what that bundle contains and how it was derived. No game assets — images, sounds, models — +states what that bundle contains and how it was derived. No game assets - images, sounds, models - are copied or redistributed anywhere in this project. ### How this client uses GGG's API @@ -28,18 +28,18 @@ no API key, and never asks the user for account credentials. `X-Rate-Limit--State`, and `Retry-After` on a 429). Every GGG request goes through one shared limiter that parses those headers, tracks each window, and **delays proactively** instead of absorbing 429s. The server's own state counters outrank our tally, because they count every - client on the address — the user's browser tab included. + client on the address - the user's browser tab included. - **The limiter survives a restart.** An active restriction is written to disk and restored on the - next launch, so closing and reopening the application cannot be used — accidentally or otherwise - — to walk out of a lockout it never served. + next launch, so closing and reopening the application cannot be used - accidentally or + otherwise - to walk out of a lockout it never served. - **Requests are made only when the user asks for them.** A price check parses and displays the item without touching the network; the trade search is a button, and `auto_search` is off by default. Static data (leagues, currency symbols) is cached for 24 hours and a week respectively. -- **It fetches in the batch sizes the API specifies** — ten listing ids per `/fetch` request — and +- **It fetches in the batch sizes the API specifies** - ten listing ids per `/fetch` request - and asks only for as many listings as the user configured. - **The in-game currency exchange feed is treated as its own thing.** `web.poecdn.com/api/currency-exchange` is public and unauthenticated, and it is on the CDN rather - than the API host — so it publishes no rate-limit policy, and it is deliberately *not* sent + than the API host - so it publishes no rate-limit policy, and it is deliberately *not* sent through the limiter above, which exists to serve budgets this endpoint does not state. What stands in for one is that a published hour never changes and one download covers every item in every league: the cost is per hour of play rather than per price check, and a digest already on @@ -50,8 +50,8 @@ is the route and it will be actioned. See [CONTACT.md](CONTACT.md). ## poe.ninja -The reference price row — what a unique, a gem, a currency item or a base type is currently going -for — comes from [poe.ninja](https://poe.ninja), used under its +The reference price row - what a unique, a gem, a currency item or a base type is currently going +for - comes from [poe.ninja](https://poe.ninja), used under its [public API documentation](https://poe.ninja/docs/api). - **Only the economy endpoints are touched.** The builds and profile endpoints are explicitly @@ -65,14 +65,14 @@ for — comes from [poe.ninja](https://poe.ninja), used under its ## Path of Exile Wiki -The data bundle's per-unique modifier dataset — which modifiers a given unique can roll, and which -of them come from a random pool — is not in the game files. That grouping comes from +The data bundle's per-unique modifier dataset - which modifiers a given unique can roll, and which +of them come from a random pool - is not in the game files. That grouping comes from [poewiki](https://www.poewiki.net)'s `item_mods` cargo table, licensed **[CC BY-NC 3.0](https://creativecommons.org/licenses/by-nc/3.0/)**: attribution required, non-commercial use only, which this project is. The attribution string travels with the bundle rather than staying behind in the publisher's -repository — the manifest carries it, the installer writes it through, and Settings renders it — +repository - the manifest carries it, the installer writes it through, and Settings renders it - because an attribution that does not reach the user is not an attribution. ## Tooling behind the data bundle @@ -111,19 +111,19 @@ the typeface the game itself uses. Four faces are embedded in the executable. Fontin is free for personal and commercial use, but its license nominally forbids redistribution without the author's permission, which bundling into a released binary arguably is. That is a deliberate maintainer decision with its reasoning written down in -[assets/fonts/README.md](assets/fonts/README.md), along with how to swap the typeface out — it is +[assets/fonts/README.md](assets/fonts/README.md), along with how to swap the typeface out - it is one generated file and no code change. `PPC_FONT_DIR` already overrides the embedded faces at runtime. **If you are Jos Buivenga and would prefer this not be bundled, open an issue and it will be removed.** -For text this project did not write — trade account and character names, which are routinely -Cyrillic, Hangul or CJK, none of which Fontin covers — a fallback face is loaded from **whatever +For text this project did not write - trade account and character names, which are routinely +Cyrillic, Hangul or CJK, none of which Fontin covers - a fallback face is loaded from **whatever the operating system already ships**. Nothing is bundled for it and nothing is redistributed. ## Font Awesome Free The buttons a word does not fit on are drawn in **[Font Awesome Free](https://fontawesome.com)** -Solid, by Fonticons, Inc. Only the codepoints actually used are bundled — `scripts/fetch-glyphs.sh` +Solid, by Fonticons, Inc. Only the codepoints actually used are bundled - `scripts/fetch-glyphs.sh` subsets the release down to those and no more, and [assets/fonts/README.md](assets/fonts/README.md) says which and why. The website's navigation icons are the same set, inlined into `site/style.css` rather than fetched from anywhere. diff --git a/BUILDING.md b/BUILDING.md index 1e63906..3a43ee6 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -2,8 +2,8 @@ There is no dependency manager to set up and nothing to vendor by hand: CMake's `FetchContent` clones and builds SDL3, Dear ImGui, nlohmann/json and doctest from pinned tags in -[CMakeLists.txt](CMakeLists.txt). What the system has to provide is a compiler, CMake, git, and — -on Linux — the development headers those libraries compile against. +[CMakeLists.txt](CMakeLists.txt). What the system has to provide is a compiler, CMake, git, and - +on Linux - the development headers those libraries compile against. ```sh cmake -S . -B build -DCMAKE_BUILD_TYPE=Release @@ -19,13 +19,13 @@ of build tree. Every configure after that is cached. | | minimum | |---|---| | CMake | 3.20 (4.x works) | -| Compiler | GCC 12+, Clang 15+, or MSVC 19.3x (Visual Studio 2022) — C++20 | +| Compiler | GCC 12+, Clang 15+, or MSVC 19.3x (Visual Studio 2022) - C++20 | | git | any; `FetchContent` shells out to it | | Network | needed at configure time, for the dependency clones | **libcurl is the one dependency taken from the system where there is one.** `find_package(CURL)` decides: on Linux it finds the distro package listed below, and on Windows it finds nothing, so -curl and zlib are fetched and built statically against Schannel. That is deliberate — it keeps the +curl and zlib are fetched and built statically against Schannel. That is deliberate - it keeps the Windows release a single `.exe` with no DLL beside it and no CA bundle to ship. ## Linux @@ -37,7 +37,7 @@ An X11 client, which under a Wayland session means Xwayland. See continuously verified.** The others are its equivalents and are checked by hand; if one is wrong, the CMake error names the header it could not find, and an issue about it is welcome. -### Arch — and CachyOS, EndeavourOS, Manjaro +### Arch - and CachyOS, EndeavourOS, Manjaro ```sh sudo pacman -S --needed base-devel cmake git \ @@ -66,7 +66,7 @@ sudo apt-get update && sudo apt-get install -y \ `apt` and `apt-get` take the same package names; use whichever your distribution prefers. Mint and Pop!\_OS track the Ubuntu release they are built on, so the names are identical. -Version floors worth knowing: **Ubuntu 22.04** ships GCC 11 — install `g++-12` and configure with +Version floors worth knowing: **Ubuntu 22.04** ships GCC 11 - install `g++-12` and configure with `-DCMAKE_CXX_COMPILER=g++-12` if the build rejects C++20 constructs. **Debian 12** (bookworm, CMake 3.25 / GCC 12) is fine as shipped. @@ -86,7 +86,7 @@ list; the rest is libcurl and the X11 extensions. ### SteamOS / Steam Deck Untested, and two things are in the way rather than one. The root filesystem is read-only, so the -headers above cannot be installed onto it — build inside a container (`distrobox`, `toolbox`) or +headers above cannot be installed onto it - build inside a container (`distrobox`, `toolbox`) or just use the release tarball. Beyond that, the Deck's gaming session is gamescope rather than a plain X11 session, and the global hotkey grab and overlay have not been tried against it. @@ -118,7 +118,7 @@ ctest --test-dir build -C Release The binary lands at `build\Release\PathOfPriceCheck.exe` and is self-contained: curl, zlib, SDL3 and the fonts are all linked in, and TLS goes through Schannel, so there is no OpenSSL and no CA -bundle to install. It is a **GUI-subsystem** executable — nothing is printed to a console, because +bundle to install. It is a **GUI-subsystem** executable - nothing is printed to a console, because a console-subsystem build would pop a window beside an application whose whole UI is an overlay and a tray icon. Diagnostics go to the debug log instead (see below). @@ -136,7 +136,7 @@ winget install JRSoftware.InnoSetup iscc /DAppVersion=0.0.0 packaging\PathOfPriceCheck.iss ``` -It installs per-user and unelevated, which is a decision rather than a convenience — see +It installs per-user and unelevated, which is a decision rather than a convenience - see [docs/updater.md](docs/updater.md) for what the updater does with it. ## Runtime requirements @@ -146,7 +146,7 @@ It installs per-user and unelevated, which is a decision rather than a convenien for the X11 backend outright rather than letting it choose. So it is an X11 client either way: on a Wayland session it runs through **Xwayland**, which is how it is developed daily. - **There is no native Wayland backend and there will not be one.** Not "not yet" — the reason is + **There is no native Wayland backend and there will not be one.** Not "not yet" - the reason is the game, not the effort. Proton runs Path of Exile as an Xwayland client, and an X11 tool can see every other Xwayland client: which window is in front, what it is called, where it is, and where to send a synthetic keypress. None of that has a native-Wayland equivalent. A client cannot @@ -157,7 +157,7 @@ It installs per-user and unelevated, which is a decision rather than a convenien protocols involved as a matter of policy, so the result would not run there at all. So going native would cost a windowing rewrite and a permanent three-compositor test matrix, and - buy a build that positions the panel *worse* than this one — for as long as the game itself is an + buy a build that positions the panel *worse* than this one - for as long as the game itself is an Xwayland client. This application's dependency on X11 is not stronger than Path of Exile's. One caveat worth knowing under Wayland: copying in a **Wayland-native** application while the game @@ -175,12 +175,12 @@ It installs per-user and unelevated, which is a decision rather than a convenien | | | |---|---| - | Both downloads | `glibc` 2.35+, `libstdc++`, `libX11`, and an OpenGL driver (`libglvnd`/`libGL`). SDL's X11 backend also loads `libXcursor`, `libXi`, `libXrandr` and `libxkbcommon` where they exist, and the tray icon needs GTK 3 with `libayatana-appindicator3` — without it the app runs but has nothing to quit from. | + | Both downloads | `glibc` 2.35+, `libstdc++`, `libX11`, and an OpenGL driver (`libglvnd`/`libGL`). SDL's X11 backend also loads `libXcursor`, `libXi`, `libXrandr` and `libxkbcommon` where they exist, and the tray icon needs GTK 3 with `libayatana-appindicator3` - without it the app runs but has nothing to quit from. | | Tarball only | `libcurl` and whichever TLS stack it was built against, plus `libXext`, `libXfixes` and `libXtst`. | **That second row is the whole difference between the two downloads**: the AppImage bundles libcurl with its TLS, compression and Kerberos tree and those three X extensions, and takes - everything in the first row from the host — as it must, since libX11 and the GL driver + everything in the first row from the host - as it must, since libX11 and the GL driver belong to the session, not to the application. - **Windows 10 or later.** No runtime dependencies beyond the OS. - **The game may be the native Windows client or Wine/Proton.** The copy path carries a good deal @@ -209,8 +209,8 @@ Development environment variables, for iterating without the game running: Captures to feed `PPC_DEV_ITEM` live in [`tests/data/examples/`](tests/data/examples). -**Only one copy runs at a time.** The first one to start takes a lock — `flock` on -`/PathOfPriceCheck.lock`, a session-local named mutex on Windows — and a second launch says +**Only one copy runs at a time.** The first one to start takes a lock - `flock` on +`/PathOfPriceCheck.lock`, a session-local named mutex on Windows - and a second launch says so and exits. Both are released by the operating system when the process dies, so a crash leaves nothing to clean up. This is not tidiness: two copies would both grab the global hotkeys (X11 hands a passive grab to whoever asked first, so the *newly launched* one silently does nothing, which @@ -224,8 +224,8 @@ ctest --test-dir build # all ctest --test-dir build -R item_parse_test -V # one, verbose ``` -Tests link `ppc_core` only — the static library holding everything that needs neither a window nor -a network — so they run headless, offline, and are the fast way to work on the parser, the data +Tests link `ppc_core` only - the static library holding everything that needs neither a window nor +a network - so they run headless, offline, and are the fast way to work on the parser, the data layer, the query builder and the rate limiter. `ppc_core` links no SDL3, no ImGui, no X11 and no libcurl, and that rule is worth keeping. @@ -250,7 +250,7 @@ Both are committed, so a normal build needs neither. ``` The test fixtures under `tests/data/bundle/` are a slice of a real data release and are regenerated -by `./scripts/slice-test-bundle.py`, never edited by hand — the `.index.bin` files address the +by `./scripts/slice-test-bundle.py`, never edited by hand - the `.index.bin` files address the ndjson by byte offset, so one stray byte silently shifts every record out from under every lookup. ## Versioning diff --git a/CONTACT.md b/CONTACT.md index 8bcb75c..73be3f7 100644 --- a/CONTACT.md +++ b/CONTACT.md @@ -1,7 +1,7 @@ # Contact **[Open an issue.](https://github.com/JIRPOS/PathOfPriceCheck/issues)** That is the only contact -route, deliberately — there is no email address to publish, and an issue is read. +route, deliberately - there is no email address to publish, and an issue is read. PathOfPriceCheck identifies itself to the servers it talks to with this User-Agent: @@ -18,18 +18,18 @@ tracker for anything about the data itself. Open an issue and it will be actioned. This covers, non-exhaustively: -- **Grinding Gear Games** — anything about this client's use of the public trade API, or about the +- **Grinding Gear Games** - anything about this client's use of the public trade API, or about the game content the data bundle derives from. See [ATTRIBUTION.md](ATTRIBUTION.md) for what is used and how, and the data repository's [DATA-LICENSE.md](https://github.com/JIRPOS/PathOfPriceCheck-Data/blob/main/DATA-LICENSE.md) for the bundle. No game assets are redistributed. -- **poe.ninja** — anything about how their economy endpoints are queried or cached. -- **poewiki** — anything about the CC BY-NC 3.0 modifier groupings or their attribution. -- **Jos Buivenga / exljbris** — the Fontin faces embedded in the binary. Swapping the typeface out +- **poe.ninja** - anything about how their economy endpoints are queried or cached. +- **poewiki** - anything about the CC BY-NC 3.0 modifier groupings or their attribution. +- **Jos Buivenga / exljbris** - the Fontin faces embedded in the binary. Swapping the typeface out is one generated file and no code change; see [assets/fonts/README.md](assets/fonts/README.md). - Anyone else with a claim on something shipped here. -An issue does not have to be public-facing to be actioned, but it does have to be an issue — +An issue does not have to be public-facing to be actioned, but it does have to be an issue - there is no private channel, and pretending otherwise would be worse than saying so. This project is not affiliated with or endorsed by Grinding Gear Games. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ff19353..760883b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,9 +2,9 @@ **This project is in early development and is not accepting pull requests.** -That is not a comment on anyone's code. The layers are still moving underneath each other — the +That is not a comment on anyone's code. The layers are still moving underneath each other - the item, trade and reference-price layers are built but their seams are being redrawn as the -remaining pieces land — and reviewing patches against a design that changes weekly costs more than +remaining pieces land - and reviewing patches against a design that changes weekly costs more than it produces, for both sides. A pull request opened today would likely sit until it stopped applying, which is a worse outcome than not opening it. @@ -26,11 +26,11 @@ are worth more than a patch would be right now: fullscreen, windowed or borderless. - **The copy hotkey doing nothing.** Turn on Settings → Diagnostics → debug log, reproduce it, and quote the four-character check id from the panel footer (clicking it copies it). Read the log - before attaching it — it contains whatever was on your clipboard. See [PRIVACY.md](PRIVACY.md). + before attaching it - it contains whatever was on your clipboard. See [PRIVACY.md](PRIVACY.md). ## Forking -The code is MIT ([LICENSE](LICENSE)) and fork away — that is what it is for. Note that the fonts +The code is MIT ([LICENSE](LICENSE)) and fork away - that is what it is for. Note that the fonts and the game data have terms of their own; [ATTRIBUTION.md](ATTRIBUTION.md) says what they are, and they follow the code into a fork. diff --git a/EULA.md b/EULA.md index f43a32f..d5cecce 100644 --- a/EULA.md +++ b/EULA.md @@ -1,7 +1,7 @@ # Terms of use Plain-language summary of what you get and what you do not. The binding text is the MIT license in -[LICENSE](LICENSE) — where this document and that one differ, that one wins. +[LICENSE](LICENSE) - where this document and that one differ, that one wins. ## The software is provided as-is @@ -12,7 +12,7 @@ promised against, and there is no support obligation, no SLA and no fitness for **Prices shown are an estimate and nothing more.** They are what a public API and a public economy site said at the time of asking, filtered by heuristics that are documented but not infallible. -Trades you make are your decisions. Money — real or in-game — lost on one is yours. +Trades you make are your decisions. Money - real or in-game - lost on one is yours. ## No liability @@ -39,8 +39,8 @@ endorsed by them. The game data, the modifier groupings from poewiki (CC BY-NC 3 embedded Fontin typeface each carry their own terms, which are yours to observe as much as they are ours. [ATTRIBUTION.md](ATTRIBUTION.md) lists all of them. -**This project is non-commercial**, and one of those licenses — CC BY-NC 3.0, covering the -per-unique modifier data — requires that. Selling this, or building something commercial on the +**This project is non-commercial**, and one of those licenses - CC BY-NC 3.0, covering the +per-unique modifier data - requires that. Selling this, or building something commercial on the data bundle, is not something the license permits you to do. ## Privacy diff --git a/PRIVACY.md b/PRIVACY.md index 1040f0c..d4d012e 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -6,15 +6,15 @@ effect of anything you do. Everything the application does happens on the machin against third-party APIs that are the same ones a browser would talk to. **There is exactly one thing you can send us, and only by pressing a button that says so.** -**Report a bug** on the price-check panel opens a dialog that shows you the entire payload — the +**Report a bug** on the price-check panel opens a dialog that shows you the entire payload - the item text, what the tool made of it, four version strings, whatever you type, and a screenshot -only if you tick the box — and sends it nowhere until you press Send. It goes to a small relay of +only if you tick the box - and sends it nowhere until you press Send. It goes to a small relay of ours, described in full [below](#reporting-a-bug). That relay is the project's only backend, it exists for that one button, and nothing else in the application ever talks to it. The one thing that might sound like a phone-home is the update check, so it is worth being exact: -it downloads a small **static file** from the GitHub release page — the same bytes served to -everyone — and compares versions **on your machine**. It sends no version, no identifier and no +it downloads a small **static file** from the GitHub release page - the same bytes served to +everyone - and compares versions **on your machine**. It sends no version, no identifier and no count; GitHub sees a file being fetched, exactly as it would if you clicked the releases page yourself. It can be turned off in Settings. @@ -23,7 +23,7 @@ maintainer cannot see that you ran this, what you priced, or that you exist. ## What the application talks to -Exhaustively — this is every outbound request the binary can make. +Exhaustively - this is every outbound request the binary can make. | host | when | what leaves your machine | |---|---|---| @@ -33,11 +33,11 @@ Exhaustively — this is every outbound request the binary can make. | `www.pathofexile.com/api/trade/data/static` | before the first search; cached a week | nothing but the request | | `www.pathofexile.com/api/trade/search/` | when you press **Search** (or on open, if you turned on `auto_search`) | the search query: trade stat identifiers and numeric bounds derived from the item under your cursor, plus the league and the listing-status filter | | `www.pathofexile.com/api/trade/fetch/...` | after a search, and on **load more** | the result hashes the search returned | -| `web.poecdn.com` | when an item's picture is first needed — a currency symbol, anything the in-game exchange trades, or the artwork of each unique offered for an unidentified one; cached on disk forever after | nothing but the request | +| `web.poecdn.com` | when an item's picture is first needed - a currency symbol, anything the in-game exchange trades, or the artwork of each unique offered for an unidentified one; cached on disk forever after | nothing but the request | | `web.poecdn.com/api/currency-exchange/` | when an item is priced and the newest published hour is not already on disk; **one download covers every item and every league** | nothing but the request | | `poe.ninja/poe1/api/economy/...` | when a reference price is needed and the 30-minute cache has expired; **once per category**, not per price check | nothing but the request and the league name | | `poe.ninja/favicons/favicon-32x32.png` | once, for the reference row's source mark | nothing but the request | -| `ppc-reports.jirpos.workers.dev` | **only when you press Send in the bug reporter**, never otherwise | the report you were shown before you pressed it — see [below](#reporting-a-bug) | +| `ppc-reports.jirpos.workers.dev` | **only when you press Send in the bug reporter**, never otherwise | the report you were shown before you pressed it - see [below](#reporting-a-bug) | **Opening a search in your browser** builds the same query into a `pathofexile.com/trade/search` URL and hands it to your browser. That costs no API call, and what happens after it is between you @@ -51,7 +51,7 @@ PathOfPriceCheck/ (+https://github.com/JIRPOS/PathOfPriceCheck) GGG's public-API policy asks unregistered clients to identify themselves and offer a route to the maintainer, which is what that URL is for. It contains no machine id, no install id and no user -id — two identical installations send byte-identical headers. +id - two identical installations send byte-identical headers. As with any HTTP request, the hosts above see your IP address, and their own privacy policies apply: [Grinding Gear Games](https://www.pathofexile.com/legal/privacy-policy), @@ -66,8 +66,8 @@ publicly accessible endpoints. It cannot see your stash, your characters or your It does keep a **cookie jar** at `/cookies.txt`, because Cloudflare's `cf_clearance` and whatever anonymous session cookie `pathofexile.com` hands out are what stop every launch from re-running the edge's challenge. Those cookies are issued *to* an anonymous client, not derived -from any identity you provided. The file is created with restricted permissions — a session cookie -has no business being world-readable — and deleting it is safe at any time. +from any identity you provided. The file is created with restricted permissions - a session cookie +has no business being world-readable - and deleting it is safe at any time. ## Your clipboard @@ -75,27 +75,27 @@ The whole tool works by reading the clipboard, so this is worth being precise ab - The clipboard's **contents** are read at one moment only: after you press the price-check hotkey and the application has observed that something was actually copied. Nothing is read on a timer. -- Between those moments it watches an **ownership stamp**, not content — an opaque number the X +- Between those moments it watches an **ownership stamp**, not content - an opaque number the X server or Windows changes when someone writes the clipboard. It says *that* a copy happened, and reveals nothing about what. - If you press the hotkey while something other than an item is on your clipboard, that text is - what gets parsed. It fails to parse, nothing opens, and it is discarded. But it *was* read — so + what gets parsed. It fails to parse, nothing opens, and it is discarded. But it *was* read - so the ordinary caution applies: this is a global hotkey and the clipboard is a global thing. - Item text you priced is held in memory until the next check, and is the one thing a **bug - report** can carry off the machine — only the check you are looking at, and only if you press + report** can carry off the machine - only the check you are looking at, and only if you press Send. See [Reporting a bug](#reporting-a-bug). - **Two things write to your clipboard, both because you asked**: picking an entry from QuickPaste, which puts that entry's own text there and nothing else, and clicking the diagnostic check id in the panel footer, which copies that four-character id. On Linux the text is then served from a - window this application owns for as long as it runs — which is how the X11 clipboard works for - every program — so closing the tool takes it with it unless your desktop's clipboard manager has + window this application owns for as long as it runs - which is how the X11 clipboard works for + every program - so closing the tool takes it with it unless your desktop's clipboard manager has kept a copy. ## What is stored on your machine | path | what | |---|---| -| `/config.json` | your settings: league, hotkeys, panel geometry, listing status, result count, filter ranges, client and interface language, panel opacity, whether to update automatically — **and your QuickPaste entries, in full**, since they are text you typed for this tool to hold | +| `/config.json` | your settings: league, hotkeys, panel geometry, listing status, result count, filter ranges, client and interface language, panel opacity, whether to update automatically - **and your QuickPaste entries, in full**, since they are text you typed for this tool to hold | | `/cookies.txt` | the cookie jar above | | `/data//` | the downloaded game-data bundle, plus a `current` pointer | | `/update/` | a downloaded release of the application, waiting for the restart that applies it. One file, consumed as it is applied; absent whenever no update is pending | @@ -105,7 +105,7 @@ The whole tool works by reading the clipboard, so this is worth being precise ab | `/icons/` | downloaded item and currency symbols, keyed by URL hash | | `/trade-ratelimit.json` | the rate limiter's state, so a restart cannot walk out of a restriction | | `/PathOfPriceCheck.lock` | an empty-but-for-a-process-number file the running copy holds a lock on, so a second one refuses to start. Linux only; Windows uses a named mutex, which is not a file | -| `/logs/` | the debug log, **only if you turned it on** — see below | +| `/logs/` | the debug log, **only if you turned it on** - see below | `` is `$XDG_CONFIG_HOME/PathOfPriceCheck` (`~/.config/PathOfPriceCheck`) or `%APPDATA%\PathOfPriceCheck`. `` is `$XDG_CACHE_HOME/PathOfPriceCheck` (`~/.cache/PathOfPriceCheck`) or `%LOCALAPPDATA%\PathOfPriceCheck`. @@ -115,15 +115,15 @@ Deleting either directory is safe; the application rebuilds what it needs. short-lived.** Applying an update replaces that executable, at its own path, and briefly leaves the previous one beside it as `.old` until the next start deletes it. And when a new version is offered, an empty `.ppc-write-probe` is created and immediately deleted there, which is how the -application finds out whether it is allowed to update itself at all — asking the filesystem is the +application finds out whether it is allowed to update itself at all - asking the filesystem is the only reliable way, since the permission bits do not answer it on either platform. Nothing else on -your system is written to. On Windows the installer — -if you used it rather than the portable `.zip` — additionally creates its own program directory, +your system is written to. On Windows the installer - +if you used it rather than the portable `.zip` - additionally creates its own program directory, its shortcuts, one registry value at `HKCU\Software\PathOfPriceCheck` recording where it installed, and the usual Add/Remove Programs entry; uninstalling removes them. One optional setting is personal information you may type in yourself: **Account** in Settings -(`Name#1234`). It is stored in `config.json` and is **never sent anywhere** — nothing in the +(`Name#1234`). It is stored in `config.json` and is **never sent anywhere** - nothing in the request path reads it, the bug reporter included. It is used for one thing: marking a listing in the results as yours, and even a screenshot you choose to attach has it replaced along with every other handle on the table. @@ -137,7 +137,7 @@ The **Report a bug** button on the price-check panel. Nothing here happens unles then press **Send** in the dialog it opens. **The dialog is the disclosure.** It shows the payload in full, in the same text that goes on the -wire, before anything is sent — there is no summary standing in for the real thing and no field it +wire, before anything is sent - there is no summary standing in for the real thing and no field it does not display. Read it, and if you would rather not send some part of it, close the dialog. What a report contains, exhaustively: @@ -161,16 +161,16 @@ the moment you pressed the button, so the decision is one you can make by lookin It is a **read-back of this application's own window**, not a capture of your screen: the pixels this program drew, and only those. The game behind the transparent parts of the overlay is not in -it and cannot be — nothing here has the ability to photograph another window. Everything else on +it and cannot be - nothing here has the ability to photograph another window. Everything else on your desktop is likewise absent. **Nobody's account name is in it.** On an item that ran a search the panel shows a results table, and before the picture is taken the panel is redrawn with every seller's handle replaced by its -position — `seller 1`, `seller 2` — so what is photographed never had a name on it. Yours is +position - `seller 1`, `seller 2` - so what is photographed never had a name on it. Yours is covered by the same rule, on the row marked as yours. Prices, ages and everything else about the market are left exactly as they were, because those are the thing a mispricing is read against. -What is in it, then, is the panel as you were looking at it with the names taken out — which is +What is in it, then, is the panel as you were looking at it with the names taken out - which is still worth checking before you tick the box, and is why the preview is the size it is. ### Where it goes @@ -183,7 +183,7 @@ than promised. Cloudflare sits in front of it and sees your IP address, as any host you make a request to does; their [privacy policy](https://www.cloudflare.com/privacypolicy/) applies. The Worker uses that -address for one thing — an hourly cap, so the endpoint cannot be flooded — and it is never part of +address for one thing - an hourly cap, so the endpoint cannot be flooded - and it is never part of what reaches the channel. A report stays in that channel until it is dealt with. If you want one removed, quote its id: the @@ -201,7 +201,7 @@ and the X server fails in ways that are rare, unreproducible on demand and invis When you enable it (Settings → Diagnostics), `/logs/ppc--