Security
The controls actually in the product.
This page describes the security controls that are in code, not a marketing claim about the product. Every item below maps to a file or a header in the running deployment. The technical policy is in SECURITY.md.
Supported versions
Only the most recent public release receives security fixes.
| Surface | Version | Status |
|---|---|---|
| Web application | Kingfisher 1.1 | Current. Hosted at the Vercel landing/studio host. |
| macOS application | Kingfisher 1.1.2 | Apple Silicon DMG, signed with Developer ID and notarised by Apple; opens with a double-click. |
Older release candidates are not patched. If a regression is reported against one, the answer is to upgrade.
Browser / web application
- Content Security Policy —
vercel.jsonships a strict CSP withdefault-src self, no third-partyscript-src,frame-ancestors none,base-uri self,object-src none. The onlyscript-srcallowances areself,wasm-unsafe-eval(Stockfish WebAssembly) andunsafe-inline(no scripts are inlined; this allowance is retained for Next.js style attributes and does not allow arbitrary inline JavaScript). - Cross-Origin-Opener-Policy: same-origin andCross-Origin-Embedder-Policy: credentialless are sent on every response, which is what enables
SharedArrayBufferfor the Stockfish multi-threaded build. - HSTS with
max-age=31536000; includeSubDomains; preloadand aReferrer-Policy: strict-origin-when-cross-origin header on every response. - Permissions-Policy disables
camera,microphone,geolocationandinterest-cohort(FLoC) at the document level. - Trusted remote origins for the application's network calls are listed in
connect-src: the application's own host, the GitHub Pages data mirror, Lichess, and the desktop companion's loopback range. Any other host is refused at the CSP layer. - External link restrictions — outbound links are validated against an allow-list before the application will follow them; see
src/middleware-host-rules.tsandsrc/lib/redirect-validation.ts. - Downloaded data is verified. Every reference-pack chunk and every managed engine binary is checked against a SHA-256 recorded in the manifest before it is used; a mismatch is reported, never silently accepted. See
src/reference/install.ts,src/engine/manager.tsandTHIRD_PARTY_DATA.md. - Decompression bounds — every decompression path uses
DecompressionStreamwith an explicit byte budget and rejects a chunk whose decompressed size exceeds the manifests record. - IndexedDB streaming cache — the explorer caches shards in IndexedDB with a byte budget and a TTL; cached bytes are re-verified against the manifest before they are reused.
- Backup portability — backups are portable JSON with the same schema-versioned envelope as persistence; see
docs/deployment.md.
macOS application
- The desktop shell is Electron with
contextIsolation: true,nodeIntegration: false,sandbox: truefor the renderer, and a preload that exposes a typed bridge. The bridge returnsnullin a browser, so the same application is safe to serve over a public origin. - The companion’s loopback server authenticates every request except
/healthwith a pairing token the shell mints in memory on each launch and never writes to disk; the shell and the companion are the only two processes that ever hold it. Cross-origin requests are refused by CORS. - The application is signed with a Developer ID Application certificate with the Hardened Runtime, notarised by Apple, and stapled; the build refuses to sign a bundle missing any required runtime file and launches the notarised application before it makes a disk image.
- Native engines are not sandboxed. They run with the user's own operating-system permissions, and a settings panel checkbox is the only thing that prevents them from being launched. This is documented in the Settings → Engine dialog and in
AGENTS.md. Do not describe managed engines as sandboxed. - The window cannot open a file that was not chosen in a dialog or dropped on the window; there is no
readFile(path)on the bridge. - The shell holds no chess state. A desktop feature that needs a second copy of the board, the move tree, the engine session or the query is a bug in the arrangement, not a feature of it.
What the product deliberately does not do
- No cross-device Sync. Studies, repertoire, training, notes and preferences are local to one browser profile. The documented way to move work between machines is Settings → Database → Export backup and Import on the other side.
- No telemetry, no analytics, no third-party scripts. The web build does not load Google Analytics, Plausible, Hotjar, Segment, or any equivalent. CSP would refuse them anyway.
- No advertising cookies, no advertising scripts. The web build does not set any cookie; what state the application needs is held in
localStorageand IndexedDB, scoped to the origin. - No background update. The macOS application checks for a newer release only when you choose Kingfisher → Check for Updates…, and installs one only when you click Install Update; the download is verified against the release feed and your work is saved before the application is replaced. The web build is whatever is currently deployed; if a fix is urgent, a manual refresh picks it up.
How to report a vulnerability
Do not open a public GitHub issue, discussion, tweet or forum post for a security problem. Public issues are indexed by search engines and will be read by every attacker in the world before a fix is in the next release.
Use the private GitHub Security Advisory flow:
https://github.com/mardakurt/kingfisher/security/advisories/new
If the GitHub security flow is unavailable for any reason, open a private issue at the same repository with the word SECURITY: at the start of the title andwithout exploit detail in the body — the maintainer will move the conversation to the private advisory flow.
The report should include:
- the affected version (e.g.
Kingfisher 1.1for the web build orKingfisher 1.1.2and its build number for the macOS application); - a minimal reproduction;
- what you observed and what you expected;
- any workarounds you tried.
A diagnostic export from Settings → Diagnostics is safe to attach. The export never includes Lichess tokens, API keys, the companion pairing token, home-directory paths or full PGN libraries.
What to expect
The maintainer aims to:
- acknowledge the report within seven days;
- ship a fix in the next release, or sooner if the issue is severe;
- publish a CVE if the report warrants one;
- credit the reporter in the release notes (unless the reporter prefers to remain anonymous).
Out of scope
- Engine binary vulnerabilities. Kingfisher verifies the SHA-256 of every engine it downloads against the manifest shipped in the repository, but the engines themselves are third-party and are covered by their own security policies.
- Reference data vulnerabilities. Kingfisher verifies the SHA-256 of every chunk it downloads against the manifest shipped in the data repository.
- Phishing, social engineering, or supply-chain attacks on the users machine.Kingfisher is local-first; the product is not a hosted service.
Non-security issues
For bugs, regressions and product questions, open an issue atthe issue tracker. Paste the Settings → Diagnostics → Copy support information line so the report includes version, machine and source/engine state.