Doop
Doop: 오픈소스 멀티플레이어 디자인 캔버스 및 AI 에이전트용 MCP
WCAG 2.2 AA·AAA 텍스트 색 대비와 APCA, 색각·전정·인지 검사를 수행하고 브라우저에서 실행, 데이터는 업로드되지 않음
Audit WCAG 2.2 AA and AAA text-colour contrast, plus APCA, colour-vision, vestibular, and cognitive checks. Runs in your browser. Nothing is uploaded.
디자인GitHub @timdixon82온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
저장소 정보는 아직 수집하지 않았습니다.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
An online Image Colour Contrast Checker that detects text in images and compares it to the background.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Live tool: image-colour-contrast-checker.timdixon.net
A privacy-respecting, fully client-side web app that audits images for text accessibility. Drop in one or more screenshots, get back a per-image report: for every foreground/background colour pair it runs six checks — WCAG AA, WCAG AAA, APCA, colour-vision-deficiency contrast, vestibular saturation and a cognitive verdict — alongside whole-image colour-blindness simulations, cropped failing regions, and one-click PDF or Markdown export.
Nothing is uploaded. OCR, contrast analysis, and report generation all run in your browser. See the Privacy Statement for full details.
For a full technical description of every module, the data pipeline, and how to extend the tool, see ARCHITECTURE.md.
apca-w3 into src/core/apca.js (no runtime dependency). A beta perceptual signal beyond the WCAG ratio (not a WCAG requirement).@gutenye/ocr-browser + onnxruntime-web. WebGPU on Chrome/Edge desktop; WASM fallback everywhere else.npm install
npm run dev # local dev server (http://localhost:5173)
npm run build # produces dist/ — deploy anywhere as static files
npm run preview # preview the built dist/ locally
The postinstall / prebuild / predev hooks copy the PaddleOCR ONNX models and the onnxruntime-web WASM binaries out of node_modules and into public/ so they're served as static assets.
File -> decode + downscale to 800-1400 px long edge (sRGB, no colour management)
-> canvas + ImageData
-> PaddleOCR PP-OCRv4 detection + recognition (via onnxruntime-web)
-> per-detection vertical-strip scan
-> k-means (k=2) on per-pixel luminance
-> minority cluster = text, majority = background
-> WCAG contrast ratio
-> merge similar-colour findings
-> per pair: WCAG AA/AAA, APCA, CVD contrast, vestibular, cognitive
-> rolled-up overall verdict (PASS / WARN / FAIL)
-> verdict (PASS / FAIL / NO_TEXT)
-> render summary table + per-image cards (expandable rows
+ colour-blindness simulations)
-> optional PDF / Markdown export
WCAG thresholds applied:
See src/core/contrast.js for the contrast-ratio math.
| Browser | Status | Notes |
|---|---|---|
| Chrome / Edge (desktop) | Full | WebGPU OCR acceleration |
| Safari (desktop) | Full | WASM OCR (5-15s per image) |
| Firefox (desktop) | Full | WASM OCR |
| Chrome (Android) | Full | WASM OCR |
| Safari (iOS / iPadOS) | Full | WASM OCR; WebGPU disabled (ORT's WebGPU backend is unsupported on iOS) |
First use downloads about 44 MB total (PaddleOCR detection + recognition models + ORT WASM). A service worker caches them in the Cache Storage API, so later visits load them without re-downloading.
All processing happens in your browser. No images, OCR text, or contrast data ever leaves your device. Network traffic is limited to the one-time fetch of the PaddleOCR model files and the onnxruntime-web WASM binaries (served from the same origin as the app), plus a cookieless, privacy-friendly GoatCounter page-view count — no cookies, no personal data, no cross-site tracking.
Full details: Privacy Statement
src/core/apca.js (not an npm dependency)The tool is hosted on GitHub Pages and deployed automatically from the main branch via .github/workflows/deploy.yml. The canonical live URL is:
image-colour-contrast-checker.timdixon.net
The same build is also available at the underlying Pages URL: timdixon82.github.io/Image-Colour-Contrast-Checker.
GitHub Pages cannot send custom HTTP response headers. The COOP/COEP headers needed for multi-threaded WebAssembly are instead injected by the service worker at public/sw.js. See docs/patterns/cross-origin-isolation-service-worker.md for details.
Every runtime and build-time dependency uses a permissive licence (MIT / Apache-2.0 / BSD-3-Clause / ISC / Boost-1.0). The one piece of non-permissive code is the APCA contrast math, which is vendored into the source tree rather than installed as a dependency — see A note on the APCA licence below.
The GoatCounter analytics client (public/count.js, ISC) is also vendored — self-hosted rather than loaded from gc.zgo.at so it works under the app's cross-origin isolation (see Privacy).
Declared in package.json — imported directly by the source, or consumed directly by the build:
| Package | Spec | Licence | Role |
|---|---|---|---|
| @gutenye/ocr-browser | ^1.4.8 | MIT | Browser PaddleOCR PP-OCRv4 pipeline |
| onnxruntime-web | ^1.26.0 | MIT | ONNX inference runtime — imported by src/adapters/paddle-ocr.js |
| pdfmake | ^0.2.10 | MIT | PDF export |
| @gutenye/ocr-models | ^1.4.2 | MIT | Packaged PP-OCRv4 ONNX models — copied into public/models/ by copy-models.mjs (dev dependency) |
| vite | ^5.4.10 | MIT | Build tool (dev dependency) |
onnxruntime-web is declared explicitly even though @gutenye/ocr-browser also depends on it: src/adapters/paddle-ocr.js imports it directly, so it is a first-class dependency rather than an implicit transitive one. @gutenye/ocr-models is declared for the same reason — scripts/copy-models.mjs reads its files at build time.
The APCA contrast math in src/core/apca.js is vendored verbatim from apca-w3 0.1.9 — it is not an npm dependency. Vendoring is deliberate: the apca-w3 package depends on colorparsley (AGPL v3), a CSS-colour-string parser this project never needs because colours are always parsed from hex by src/core/contrast.js. Copying only the two W3-licensed functions the tool calls (APCAcontrast and sRGBtoY) keeps APCA working while leaving the AGPL code out of the dependency tree entirely.
APCA is not permissively licensed. It is distributed under a "Limited W3 License": the W3C Software and Document License, narrowed by the APCA author to permit use only for predicting the contrast of web-based content in support of WCAG accessibility guidelines. Commercial use beyond that scope requires a separate written agreement, and uses unrelated to web-content contrast (medical, clinical, safety-related, aerospace, transportation, military) are prohibited.
This tool uses APCA solely to predict the contrast of text in web-UI screenshots for accessibility review — squarely within the licence's permitted scope. The vendored file keeps its original W3 licence header and unmodified G-4g constants. If you fork this project, be aware that src/core/apca.js is not covered by this repository's MIT licence and carries the usage restrictions above. APCA is also still in public beta and is not a WCAG requirement; it is reported here as an additional perceptual signal only.
| Package | Licence | Pulled in by |
|---|---|---|
| @gutenye/ocr-common | MIT | @gutenye/ocr-browser |
| @techstark/opencv-js | Apache-2.0 | @gutenye/ocr-browser — contour finding |
| onnxruntime-common | MIT | onnxruntime-web |
| tiny-invariant | MIT | @gutenye/ocr-browser |
| js-clipper | Boost-1.0 | @gutenye/ocr-browser |
protobufjs + @protobufjs/* | BSD-3-Clause | onnxruntime-web |
| flatbuffers, long | Apache-2.0 | onnxruntime-web |
pdfmake's @foliojs-fork/* family (pdfkit, fontkit, linebreak, restructure) | MIT | pdfmake |
| Rollup, esbuild, PostCSS | MIT | vite |
The complete, version-pinned tree is in package-lock.json.
The OCR models are PaddleOCR PP-OCRv4 (Apache-2.0), distributed by @gutenye/ocr-models and copied into public/models/ at install time:
| File | Source | Licence |
|---|---|---|
ch_PP-OCRv4_det_infer.onnx | PaddleOCR | Apache-2.0 |
ch_PP-OCRv4_rec_infer.onnx | PaddleOCR | Apache-2.0 |
ppocr_keys_v1.txt | PaddleOCR | Apache-2.0 |
The exported PDFs are typeset in Roboto, bundled inside pdfmake's vfs_fonts.js. Roboto is licenced under Apache-2.0 (upstream).
This project is released under the MIT Licence — see LICENSE.
MIT was chosen because every runtime and build-time dependency is permissively licenced (MIT, Apache-2.0, BSD-3-Clause, ISC, BlueOak-1.0.0, Boost-1.0, MIT/Zlib), and MIT is fully compatible with all of them. The one exception is the vendored APCA math in src/core/apca.js (Limited W3 License) — this repository's MIT licence covers the project's own code, not that vendored file, which keeps its own usage restrictions; see A note on the APCA licence.
If you redistribute this project, please retain attribution for the upstream projects listed above — in particular PaddleOCR (Apache-2.0) for the OCR models and OpenCV (Apache-2.0) for
@techstark/opencv-js. Apache-2.0 requires that the licence text and any NOTICE files travel with redistributed binaries. Both projects' licence files ship inside theirnode_modulesdirectories and inside the publisheddist/build.