{"id":49817568,"url":"https://github.com/alexeyinwerp/boardripper","last_synced_at":"2026-06-16T19:00:39.745Z","repository":{"id":357250775,"uuid":"1186163167","full_name":"AlexeyInwerp/BoardRipper","owner":"AlexeyInwerp","description":"Web-based PCB boardview viewer for board-level repair. 11 formats (BVR1/3, BRD, BDV, BDV ASC, FZ, GenCAD, Mentor Neutral, XZZ, TVW, Allegro v15-v18). GPU-accelerated, dockable panels, self-hosted via Docker.","archived":false,"fork":false,"pushed_at":"2026-06-07T13:10:00.000Z","size":13564,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-07T15:06:43.388Z","etag":null,"topics":["agpl","boardview","docker","electronics","electronics-repair","golang","kicad","pcb","pixijs","react","repair","typescript","webgl"],"latest_commit_sha":null,"homepage":"https://www.ripperdoc.de/boardripper/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AlexeyInwerp.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-19T10:35:27.000Z","updated_at":"2026-06-07T13:10:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/AlexeyInwerp/BoardRipper","commit_stats":null,"previous_names":["alexeyinwerp/boardripper"],"tags_count":114,"template":false,"template_full_name":null,"purl":"pkg:github/AlexeyInwerp/BoardRipper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexeyInwerp%2FBoardRipper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexeyInwerp%2FBoardRipper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexeyInwerp%2FBoardRipper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexeyInwerp%2FBoardRipper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AlexeyInwerp","download_url":"https://codeload.github.com/AlexeyInwerp/BoardRipper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexeyInwerp%2FBoardRipper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34419350,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agpl","boardview","docker","electronics","electronics-repair","golang","kicad","pcb","pixijs","react","repair","typescript","webgl"],"created_at":"2026-05-13T08:09:50.132Z","updated_at":"2026-06-16T19:00:39.705Z","avatar_url":"https://github.com/AlexeyInwerp.png","language":"TypeScript","funding_links":["https://buymeacoffee.com/inwerp"],"categories":[],"sub_categories":[],"readme":"# BoardRipper\n\nWeb-based PCB boardview viewer for board-level repair. Eleven boardview formats and the matching PDF schematic, side by side, in a browser. GPU-accelerated rendering, dockable panels, self-hosted via Docker. Free, AGPL-3.0.\n\n![Boardview and PDF schematic side by side — instant cross-reference](docs/screenshots/01-board-pdf-lookup.png)\n\nA polished overview with screenshots lives at \u003chttps://www.ripperdoc.de/boardripper/\u003e. This README is the developer- and operator-facing companion: stack details, Docker setup, build instructions, license notes.\n\n\u003e **Bring your own files.** BoardRipper is the viewer only — it does not ship with any boardview files, schematics, or PDFs. The bundled board database is reference metadata (board numbers and device models), no copyrighted content.\n\n## Features\n\n- **GPU-accelerated rendering** — PixiJS v8 / WebGL, 10,000+ components at 60 fps on a modern GPU. Bench-tested down to Intel HD 4000-era integrated graphics (10–30 fps).\n- **Eleven board formats** — see table below. Both `.cad` and `.brd` are shared extensions; BoardRipper sniffs file content to pick the right parser.\n- **PDF schematic, in sync** — pan, zoom, text search, bookmarks, night mode. Right-click a net on the board to search it in the schematic.\n- **Multi-board tabs** — open several boards at once, switch between them.\n- **Multi-layer support** — show/hide top, bottom, and inner layers independently. Butterfly mode shows top and bottom side by side.\n- **Net highlight** — click a pin and the whole net lights up across the board. Chain-adjacent mode walks through neighbouring nets too.\n- **Touch input** — pinch-zoom, drag-pan, tap to select. Usable on a tablet at the bench.\n- **Customizable colors** — per-net rules by name pattern (e.g. `GND`, `VCC`, `PP*`), per-component-type fills (R / C / L / U / Q / D / J), per-layer colors, label / pin / outline tuning. Live preview before applying.\n- **Multi-line search** — each line is an extra AND-filter, useful when a component carries value and voltage on separate label lines (`20uF` ⨯ `10V` ⨯ `C12*`).\n- **Drag-and-drop import** — drop a board file or a folder onto the window and it loads. To persist drops across container restarts, mount a writable folder at `/library/incoming` (see Docker setup).\n- **Board library** — scan folders, browse by board number or model. Filenames are auto-sorted; board numbers, manufacturers, and revisions are parsed automatically.\n- **Board database with heuristics** — a bundled reference DB maps board numbers to manufacturer / ODM / laptop or phone model and groups boards by device.\n- **PDF auto-link** — boards and their schematics get matched up automatically when both are present in the same library.\n- **IndexedDB cache** — re-open without re-parsing.\n- **Self-update** — one-click signed update from the toolbar. No GitHub token required; updates are signed with an offline Ed25519 key and verified by the running container before install.\n\n![Multi-layer Allegro BRD with layer sidebar — toggle signal, power, and ground planes independently](docs/screenshots/03-multi-layer.png)\n\n- **Panel system** — Dockview: dockable, floating, and popout-to-new-window panels.\n  - Component Info (pins list, metadata)\n  - Net List (searchable, click to highlight)\n  - Search Results\n  - PDF Viewer\n  - Settings (live preview mockup, per-net color rules, label/pin/outline tuning)\n  - Debug Panel (scoped log viewer, frame-time)\n- **Electron desktop wrapper** — standalone macOS (universal + legacy) and Windows builds.\n\n![Multiple boards of different formats open simultaneously in tabs — BVR, BRD, FZ, TVW, XZZ](docs/screenshots/02-format-support.png)\n\n## Supported file formats\n\n| Format | Extension(s) | Description | Spec |\n|---|---|---|---|\n| **BVR1** | `.bvr` / `.bv` | Tab-delimited boardview, coordinates ×1000 → mils | [BVR_FORMAT.md](docs/formats/BVR_FORMAT.md) |\n| **BVR3** | `.bvr` / `.bv` | Keyword-value boardview, relative pin coordinates | [BVR_FORMAT.md](docs/formats/BVR_FORMAT.md) |\n| **BRD** | `.brd` | Apple / Mac repair, bit-rotation obfuscated binary | [BRD_FORMAT.md](docs/formats/BRD_FORMAT.md) |\n| **BDV** | `.brd` / `.bdv` | Plain-text boardview (BRDOUT / NETS / PARTS / PINS / NAILS) | [BDV_FORMAT.md](docs/formats/BDV_FORMAT.md) |\n| **BDV ASC** | `.bdv` | Honhan / Tebo-ICT obfuscated multi-section ASC (line-key cipher) | [BDV_ASC_FORMAT.md](docs/formats/BDV_ASC_FORMAT.md) |\n| **FZ** | `.fz` | ASUS, RC6-encrypted, zlib-compressed | [FZ_FORMAT.md](docs/formats/FZ_FORMAT.md) |\n| **GenCAD** | `.cad` | GenCAD 1.4 PCB interchange (text) | [CAD_FORMAT.md](docs/formats/CAD_FORMAT.md) |\n| **Mentor Neutral** | `.cad` | Mentor Boardstation neutral file (Samsung / Quanta / Compal exports) | [MENTOR_NEUTRAL_FORMAT.md](docs/formats/MENTOR_NEUTRAL_FORMAT.md) |\n| **XZZ** | `.pcb` | XZZ PCB, DES-encrypted boardview | [XZZ_FORMAT.md](docs/formats/XZZ_FORMAT.md) |\n| **TVW** | `.tvw` | Teboview binary, multi-layer + traces + drill data | [TVW_FORMAT.md](docs/formats/TVW_FORMAT.md) |\n| **Cadence Allegro BRD** | `.brd` | Cadence Allegro PCB binary, v16.x / v17.x / v18.x | [ALLEGRO_BRD_FORMAT.md](docs/formats/ALLEGRO_BRD_FORMAT.md) |\n| ↳ Allegro v15.x | `.brd` | Same parser family, partial coverage, still in beta | [ALLEGRO_V15_FORMAT.md](docs/formats/ALLEGRO_V15_FORMAT.md) |\n\n![Obscure CAD file with multiple boards stacked into one document — all outlines and components rendered correctly alongside the matching PDF](docs/screenshots/04-stacked-boards.png)\n\n## Keyboard shortcuts\n\nThe full, always-current list lives in **Settings ▸ Shortcuts** (and on the home-screen Getting Started card). The headline shortcuts:\n\n| | |\n|---|---|\n| **Open board / PDF** | `⌘O` / `⌘P` (Mac) · `Ctrl+O` / `Ctrl+P` (Win/Linux) |\n| **Find** (selection-aware) | `⌘F` / `Ctrl+F` — prefills PDF search with the selected component or net |\n| **Pan board / PDF** | `W A S D` or `Alt+arrows` |\n| **Rotate board** | `Q` / `E` (CCW / CW) or `⌘←` / `⌘→` |\n| **Mirror board** | `⌘↑` / `Ctrl+↑` |\n| **Flip layer** (top ↔ bottom) | `Space` |\n| **Zoom in / out** | `Shift+W` / `Shift+S` (centred on canvas) |\n| **Toggle Library sidebar** | `~` — the physical key left of `1` (`Backquote` / `IntlBackslash`); works on US, German, and most other layouts |\n| **Jump board ↔ PDF** | `Tab` |\n| **PDF page nav** | `PgUp` / `PgDn` (or `⌘↑` / `⌘↓` on Mac) |\n\nThe keyboard pan and zoom step sizes are configurable in **Settings ▸ Navigation ▸ Keyboard pan / zoom**. The right-click context menu adds a top-row icon strip with **Copy net / Copy part / Search net / Search part** (board) and **Copy / Search Web** (PDF text) — search opens Google in a new tab.\n\n\u003e **Layout note.** WSAD/QE/Shift+WS bind to the printed letter on your keyboard, so on AZERTY layouts the keys are physically Z/Q/S/D rather than the W/A/S/D positions — a layout-aware remapping is on the roadmap. The `~` library toggle is layout-independent.\n\n## Stack\n\n| Layer | Technology |\n|---|---|\n| Rendering | PixiJS v8 + pixi-viewport v6 (WebGL) |\n| Frontend | React 19 + TypeScript + Vite 7 |\n| Panels | Dockview v5 |\n| Backend | Go (`net/http` stdlib) |\n| Container | Docker multi-stage, scratch-based, ~25 MB image / ~13 MB compressed |\n| Desktop | Electron (macOS universal + Windows) |\n| Tests | Playwright (Chromium headless) |\n\n## Quick start\n\nBoardRipper is primarily a **server** you run on a NAS or host machine and access from any browser on your network. Standalone binaries and desktop Electron wrappers are available as alternatives.\n\n### Docker (typical deployment)\n\n```bash\ndocker compose up -d\n# → http://localhost:8081\n```\n\nOr pull directly:\n\n```bash\ndocker pull ghcr.io/alexeyinwerp/boardripper:latest\n```\n\nMount your board-file folders under `/library` to expose them in the Library panel — see Docker Setup below.\n\n### Build from source\n\n```bash\ngit clone https://github.com/AlexeyInwerp/BoardRipper.git\ncd BoardRipper\n\n# Build the frontend bundle:\ncd src/frontend \u0026\u0026 npm install \u0026\u0026 npm run build \u0026\u0026 cd ../..\n\n# Run the Go server pointing at the built bundle:\nSTATIC_DIR=./src/frontend/dist DATA_DIR=./data go run ./src/backend\n# → http://localhost:8080\n```\n\nThe released artifact is the Docker image (above) — no per-platform standalone binaries are published. If you need a portable binary, build the Go server with `CGO_ENABLED=0 go build -o boardripper ./src/backend` and ship it next to the `dist/` directory and a `STATIC_DIR=` env var. Self-update only works in Docker (it needs the host's Docker socket).\n\n### Development\n\n```bash\n# Frontend (hot reload)\ncd src/frontend \u0026\u0026 npm install \u0026\u0026 npm run dev    # http://localhost:5173\n\n# Backend (separate terminal)\ncd src/backend \u0026\u0026 go run .                       # http://localhost:8080\n```\n\n## Docker setup\n\n### docker-compose.yml\n\n```yaml\nservices:\n  boardripper:\n    image: ghcr.io/alexeyinwerp/boardripper:latest    # or build: .\n    # The image ships USER 65532:65532 (distroless `nonroot`) so a hypothetical\n    # RCE doesn't own your bind-mounted /data. The default `docker compose up`\n    # flow creates ./data as root on Linux hosts (Docker daemon runs as root),\n    # which UID 65532 can't then write — the container exits at databank.Open\n    # with \"unable to open database file\". Override to root for the compose\n    # path, matching what NASdeploy.sh already does. Alternatively, remove this\n    # line and either (a) `chown -R 65532:65532 ./data` before `up -d`, or\n    # (b) switch ./data to a named volume — Docker initializes named volumes\n    # from /data inside the image (pre-chowned to 65532 in the Dockerfile).\n    user: \"0:0\"\n    ports:\n      - \"8081:8080\"              # access at http://your-host:8081\n    volumes:\n      - ./data:/data             # uploaded board files + cache persist here\n      # Your library: mount EVERYTHING read-only (:ro) by default.\n      - /path/to/MacBooks:/library/MacBooks:ro\n      - /path/to/iPhones:/library/iPhones:ro\n      - /path/to/Schematics:/library/Schematics:ro\n      # The ONLY writable mount the container should ever see:\n      - /path/to/incoming:/library/incoming:rw\n      # Docker socket (required for self-update — see Self-Update below):\n      - /var/run/docker.sock:/var/run/docker.sock\n    environment:\n      - PORT=8080\n    restart: unless-stopped\n    deploy:\n      resources:\n        limits:\n          memory: 1024M   # pdfium/wazero pool; 512M boot-fails with SQLite OOM at databank open\n    # environment also accepts:\n    #   - PDFINDEX_POOL_MAX=2   # max concurrent pdfium/wazero PDF-index workers;\n    #                           # reduce to 1 on a NAS with \u003c1 GB free RAM\n```\n\n### Volume mounting\n\nThe Library panel browses the `/library` directory inside the container. Mount your board-file folders as **subdirectories** of `/library`:\n\n```\n-v /nas/boards/MacBooks:/library/MacBooks:ro\n-v /nas/boards/iPhones:/library/iPhones:ro\n-v /nas/schematics:/library/Schematics:ro\n-v /nas/incoming:/library/incoming:rw\n```\n\nThese appear as top-level folders in the Library panel. Use `:ro` for read-only by default. `/library/incoming` is the only path BoardRipper needs to be able to write to — that's where drag-dropped files land. The container does not need write access to your existing board folders, your schematics, or anything else.\n\n### Synology NAS (DSM 7.2+)\n\n1. Download `boardripper-\u003cversion\u003e.tar.gz` (or `latest.tar.gz`) from \u003chttps://www.ripperdoc.de/boardripper/releases/\u003e\n2. SSH into your NAS and load the image:\n   ```bash\n   docker load \u003c boardripper-docker-\u003cversion\u003e.tar.gz\n   ```\n3. Create the container:\n   ```bash\n   docker run -d \\\n     --name boardripper \\\n     -p 8090:8080 \\\n     -v /volume1/docker/boardripper/data:/data \\\n     -v /volume1/your-boards/MacBooks:/library/MacBooks:ro \\\n     -v /volume1/your-boards/iPhones:/library/iPhones:ro \\\n     -v /var/run/docker.sock:/var/run/docker.sock \\\n     -e PORT=8080 \\\n     --restart unless-stopped \\\n     ghcr.io/alexeyinwerp/boardripper:latest\n   ```\n4. Open `http://your-nas-ip:8090`\n\n## Self-update\n\nBoardRipper can update itself when running in Docker:\n\n1. Click the **version badge** in the toolbar to check for updates.\n2. If an update is available, click **Update \u0026 Restart**.\n3. The container pulls the new image and restarts automatically.\n\nRequires:\n- Docker socket mounted (`-v /var/run/docker.sock:/var/run/docker.sock`).\n\nThe signed release manifest is fetched from \u003chttps://www.ripperdoc.de/boardripper/manifest.json\u003e and verified against an Ed25519 public key **compiled into the running binary** before any I/O on the body — a hijacked mirror cannot deliver a forged update. Once the manifest verifies, the image itself is pulled by content-addressed digest from `ghcr.io/alexeyinwerp/boardripper@sha256:…`; the [signed tarball mirror](https://www.ripperdoc.de/boardripper/releases/) is the fallback if GHCR is unreachable. The pipeline also enforces a monotonic counter (replay defence), a 30-day freshness window, a 90-day expiry, and a `min_supported_version` downgrade defence. See [docs/RELEASE_RUNBOOK.md](docs/RELEASE_RUNBOOK.md) for the maintainer-side release procedure.\n\n### Drop-to-update fallback\n\nFor installs that can't reach the registry or the mirror (firewalled networks, air-gapped shops, recovery from a broken self-update):\n\n1. Download `latest-update.tar` from \u003chttps://www.ripperdoc.de/boardripper/releases/latest-update.tar\u003e (signed bundle: manifest + signature + image, ~13 MB).\n2. Drag the file anywhere on the BoardRipper UI.\n3. Confirm the prompt; the running container verifies the signature, applies the update, and restarts.\n4. The browser reloads after ~30 s.\n\nSame trust envelope as the in-app updater — the manifest signature is what grants trust, the file itself is treated as untrusted bytes until verification passes.\n\n### Manual update\n\n```bash\ndocker pull ghcr.io/alexeyinwerp/boardripper:latest\ndocker compose down \u0026\u0026 docker compose up -d\n```\n\nOr with a downloaded tarball:\n\n```bash\ndocker load \u003c boardripper-docker-\u003cnew-version\u003e.tar.gz\ndocker compose down \u0026\u0026 docker compose up -d\n```\n\n### Older versions\n\nHistorical releases live at **\u003chttps://www.ripperdoc.de/boardripper/archive.html\u003e** — Docker tarballs and signed drop-bundles for v0.19.0 onward, with per-version source links for everything older. The GitHub Releases page intentionally lists only the current release; the archive is the canonical \"give me an older version\" landing page.\n\nA handful of versions are also kept on GHCR (`v0.19.0`, `v0.19.5`, `v0.20.5`, `v0.20.8`) for direct `docker pull` — see the archive table for which ones are still pull-able vs. tarball/source-only.\n\n## Electron desktop wrapper (optional)\n\nPrebuilt Electron wrappers are published with every release (`BoardRipper-macOS-universal-\u003cversion\u003e.zip`, `BoardRipper-Windows-x64-\u003cversion\u003e.zip`). They run the same Go backend + React frontend inside an Electron shell. The Docker / server path is the primary way to deploy BoardRipper; the desktop wrapper is here for single-machine use.\n\nThe wrappers are **unsigned**, so macOS Gatekeeper and Windows SmartScreen will warn on first launch:\n\n- **macOS** — after unzipping, run `xattr -cr /Applications/BoardRipper.app` (or wherever you extracted it), then double-click. On macOS \u003c 15 you can also right-click → Open → Open once, or use System Settings → Privacy \u0026 Security → Open Anyway after the first failed launch.\n- **Windows** — SmartScreen shows \"Windows protected your PC\". Click **More info → Run anyway**.\n\n### Building the wrappers locally\n\n```bash\ncd desktop\nnpm install\nnode build-all.mjs           # builds macOS universal + legacy + Windows\nnode build-all.mjs --mac     # macOS only\nnode build-all.mjs --win     # Windows only\n```\n\nOutput in `desktop/out/` (macOS), `desktop/out-legacy/` (macOS legacy), `desktop/out-win/` (Windows).\n\n## License\n\nBoardRipper is released under the **GNU Affero General Public License v3.0** (AGPL-3.0). See [LICENSE](LICENSE) for the full text.\n\nThis project incorporates code derived from KiCad (GPL-3.0) — specifically the Cadence Allegro BRD reader in [`src/frontend/src/parsers/allegro/`](src/frontend/src/parsers/allegro/), transliterated from KiCad's `pcbnew/pcb_io/allegro/` C++ source — which is why AGPL-3.0 was chosen: it is compatible with GPL-3.0 and additionally closes the \"SaaS loophole\" by requiring source availability to users who interact with a hosted instance over a network.\n\nFor a complete list of third-party sources, libraries, and attributions, see [THIRD_PARTY.md](THIRD_PARTY.md).\n\n## Credits \u0026 references\n\nBoardRipper exists because of the reverse-engineering work already done by the boardview community. Each entry below was consulted during development; full attribution and license details are in [THIRD_PARTY.md](THIRD_PARTY.md).\n\n**Parser references**\n\n- [KiCad](https://gitlab.com/kicad/code/kicad) *(GPL-3.0)* — Cadence Allegro BRD reader, transliterated to TypeScript. The reason BoardRipper as a whole is AGPL-3.0.\n- [OpenBoardView](https://github.com/OpenBoardView/OpenBoardView) *(MIT)* — reference implementations for BVR1/BVR3, BRD (Apple), BDV (plain-text), BDV ASC (Honhan / Tebo-ICT), FZ (ASUS), GenCAD, XZZ.\n- [eagleview](https://github.com/nitrocaster/eagleview) by Pavel Kovalenko *(MIT)* — TVW / Teboview parser source.\n- [brd_parser](https://github.com/bernayigit/brd_parser) by Jeff Wheeler *(MIT)* — cross-validation reference for Allegro block layout.\n- [piernov's Honhan BDV gist](https://gist.github.com/piernov/37849a3b92375e18515160b8a1efde18) \u0026 [OpenBoardView issue #2](https://github.com/OpenBoardView/OpenBoardView/issues/2) — identified the BDV ASC signature and line-key cipher.\n- Mentor Boardstation Neutral — original reverse engineering, no third-party code or text incorporated.\n- **Cryptographic standards** — [RC6](https://people.csail.mit.edu/rivest/pubs/RRSY98.pdf) by Rivest/Robshaw/Sidney/Yin (FZ), [DES / FIPS PUB 46-3](https://csrc.nist.gov/pubs/fips/46-3/final) (XZZ). GenCAD 1.4 has no canonical online specification — see [docs/formats/CAD_FORMAT.md](docs/formats/CAD_FORMAT.md) for the BoardRipper interpretation.\n\n**Rendering \u0026 runtime**\n\n- [PixiJS](https://pixijs.com/) *(MIT)* — WebGL renderer\n- [pixi-viewport](https://github.com/davidfig/pixi-viewport) *(MIT)* — pan/zoom/culling\n- [React](https://react.dev/) *(MIT)* — UI framework\n- [Vite](https://vitejs.dev/) *(MIT)* — build pipeline\n- [Dockview](https://dockview.dev/) *(MIT)* — dockable / floating / popout panel system\n- [pdf.js](https://mozilla.github.io/pdf.js/) *(Apache-2.0)* — PDF rendering and text extraction\n- [pdf-lib](https://pdf-lib.js.org/) *(MIT)* — PDF manipulation\n- [opentype.js](https://opentype.js.org/) *(MIT)* — font glyph extraction\n- [Tabler Icons](https://tabler.io/icons) *(MIT)* — icon set\n\n**Backend**\n\n- [Go standard library](https://pkg.go.dev/std) *(BSD-3-Clause)*\n- [modernc.org/sqlite](https://gitlab.com/cznic/sqlite) *(BSD-3-Clause)* — pure-Go SQLite driver\n- [github.com/klippa-app/go-pdfium](https://github.com/klippa-app/go-pdfium) *(MIT)* — PDF text extraction for the FTS5 index (embedded `pdfium.wasm`)\n- [github.com/tetratelabs/wazero](https://github.com/tetratelabs/wazero) *(Apache-2.0)* — pure-Go WebAssembly runtime hosting `pdfium.wasm`\n- [aead.dev/minisign](https://github.com/aead/minisign) *(MIT)* — Ed25519 update-manifest signature verification\n- [golang.org/x/text](https://pkg.go.dev/golang.org/x/text) *(BSD-3-Clause)* — Unicode NFKC normalisation for watermark matching\n\n**Desktop**\n\n- [Electron](https://www.electronjs.org/) *(MIT)*, [@electron/packager](https://github.com/electron/packager) *(MIT)*, [@electron/universal](https://github.com/electron/universal) *(MIT)*\n\nCorrections and missing attributions are welcome — open an issue, or email \u003cmail@ripperdoc.de\u003e.\n\n## About this software\n\nBoardRipper is not hand-written. The codebase — parsers, renderer, panels, backend — was generated with [Claude Code](https://www.anthropic.com/claude-code), working from format specs and reference implementations from the boardview community. I review, test, and direct it; the lines of code came out of an LLM.\n\nTreat that as you would any AI-assisted software: it works on the boards I've tested, it has bugs I haven't found yet, and the right level of trust is \"a useful viewer, not a forensic tool.\" Bug reports welcome.\n\n## Feedback\n\n- Discord: **@inwerp** on the [All Things Repair](https://discord.gg/BYEkKTMNNY) server.\n- Email: \u003cmail@ripperdoc.de\u003e.\n- Bugs and feature requests: file an issue on GitHub, or reach out via Discord / email.\n\nIf BoardRipper saves you time, [buy me a coffee](https://buymeacoffee.com/inwerp).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexeyinwerp%2Fboardripper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falexeyinwerp%2Fboardripper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexeyinwerp%2Fboardripper/lists"}