Case study · Desktop repair tool to web app

A desktop board viewer, rebuilt for the browser

We ported the file readers of OpenBoardView, an open-source C++ boardview viewer, to TypeScript and built a new browser interface around them, with a schematic linked both ways and known-good readings from OpenBoardData. A real open board in three forms checked the port pin by pin: 1,145 pins matched, every one on the same net. Files stay on the visitor’s computer.

Last updated

Built November 2026C++ desktop → TypeScript in the browserFiles never uploaded

Boardview software shows electronics repair people where every part, pin and net sits on a circuit board. The good tools are desktop programs. We took the file knowledge in OpenBoardView, an open-source C++ viewer, and rebuilt it for the browser, with a linked schematic and known-good meter readings.

Open the board viewerThe original

Based on OpenBoardView (MIT). Not made or endorsed by its authors.

14 readers12 ported from the C++, 2 written from public documentation
1,145 pinsmatched across two versions of one real board, every one on the same net
2,700 damaged filesrefused cleanly, with no crash
38 msto read a real laptop board of 9,388 pins
The brief

A repair tool that needs no install

A desktop viewer is fine at your own bench. It’s no use on a shop’s locked-down PC or a borrowed laptop. The brief was a viewer that opens from a link, reads files on the visitor’s own computer, and does the things a repair tech reaches for: both sides of the board, a net traced across them, the schematic linked to the board, and a known-good reading to compare with the meter.

Challenge

Undocumented file formats, scrambled and encrypted files, no way to run the original beside ours, and files from strangers that must never crash the page.

Approach

Port the C++ readers’ rules to TypeScript, build a new canvas interface, and check the result against real boards in more than one form.

Result

A browser viewer that opens most classic formats, links the PDF schematic both ways, and shows community readings for about 100 boards.

What moved where

From desktop to browser

We didn’t compile the C++ to WebAssembly. That would have brought the desktop interface along, and this site’s security policy allows WebAssembly only on the few pages that need it. The page also has to pre-render as plain HTML like every other page here.

On the desktopIn the browser
A C++ program installed on each computerA web page: open a link, nothing to install
File readers in C++, on raw memoryThe same rules in TypeScript, every count and offset checked
Its interface drawn in a desktop windowA new interface on an HTML canvas, in React
Schematics in a separate PDF programPDF.js in the page, linked both ways, in its own window if wanted
Lines from a picked pin to every other pin on the netA tree from pin to nearest pin, so a big rail stays readable
Keys for encrypted files saved in a settings fileA key pasted for one file, used once, never saved
Files read from the local diskFiles read in the browser tab, never uploaded
Proof

Testing a port without the original

We had a gift: Glasgow, an open-source board, exists as a KiCad design and as two boardview exports made from it. Three routes to the same answer meant the readers could check each other, pin by pin.

CheckResult
The same board, twiceThe Glasgow board exists as a .brd and a .bvr export. Every pin agrees on side and net, within 1 mil: the exporter rounds a mirrored coordinate.
The source designIts KiCad file matches the export on 1,145 pins, with 0 net mismatches. The other 4 are bare mounting holes.
A different tool’s boardOn a real Eagle board, every signal pin lands on the end of a routed wire, mirrored parts included.
Real MacBook boardsTwo scrambled .brd boards of over 8,000 pins each opened in under 30 ms. On one, 1,668 of 1,672 parts and 1,578 of 1,579 nets linked to its 75-page schematic.
Copper as a witnessA pin in the right place sits on a track of its own net. On real GenCAD and Altium boards every signal pin does. Ground is left out, because it’s usually a copper pour.
Damaged files2,700 cut and corrupted copies through the readers. A reader may refuse a file, but it may not crash.
Zip bombsA compressed stream that expands past the limit is stopped, not unpacked.
The cryptoDES passes its published test vector. The RC6 mode is tested round trip.
What we found

Seven things testing turned up

FoundWhat happenedWhat we did
U1 turned up 142 timesMatching schematic text against the board ignoring case linked U1 to every “u1” on the sheet. That’s how the schematic writes a 0.1 µF capacitor’s value.Changed: case counts. U1 now has its 5 real places, and the word “reset” in a note no longer links to the net RESET.
A chip’s box as big as the boardDrawing a part’s box from its largest pin made sense until one chip’s thermal pad set the margin for all 87 pins.Changed: the box uses the middle pin’s size, so one big pad can’t inflate it.
Clicks that looked ignoredThe original skips net lines on ground, and we kept that. On a real board it looked random: a click sometimes drew lines and sometimes didn’t.Changed: ground draws to the 32 nearest pins, where a probe would go, and small parts show their nets when you click the body.
Unconnected pins that looked connectedThe readers looked for the word UNCONNECTED in capitals. KiCad writes unconnected-(U1-Pad46), so 24 of them became nets of one pin.Fixed: the check ignores case.
Flipped parts half a turn outA real GenCAD file from KiCad had one flipped connector. The port followed the original’s rule for mirrored shapes, and the same connector in the design’s KiCad file showed every pin in the wrong place.Changed: a shape is mirrored, then turned. Every pin now lands exactly on the KiCad file. Our own test file had agreed with the old rule, so only a real file showed it.
A board a tenth of its sizeOne real MacBook file has a pin ten times beyond the board’s edge. The view fitted everything in the file, so the board opened as a speck in the corner.Changed: the outline sets the view, and a pin far outside it is ignored for that.
Every page 200, and the schematic deadpdf.js starts a worker from an .mjs file. Our server sends that type as a generic download and the browser refuses it. The deploy’s checks all passed.Fixed in the build: the worker ships as .js. Only opening the live page in a real browser showed it.
Past the port

What the web made easy to add

  • A linked schematic. PDF.js reads each word and where it sits, including vertical labels. Words are matched to the board’s part and net names, and one window on a second monitor stays linked to the other. A label that could mean two nets stays unlinked.
  • Known-good readings. OpenBoardData, a community archive under the Open Database License, holds diode, voltage and resistance readings and diagnostic notes. Its server doesn’t allow browser requests, so the site serves a dated snapshot. A note’s parts and nets became links to the board.
  • Tracing power. Apple writes the power state into a rail’s name, so the Power AI tab sorts rails into startup stages and draws them on the board with no AI at all. For the real order, it gives the visitor a prompt for their own AI with the board’s rail names in it. The schematic goes to their AI, never to us, and only names on the board are kept.
  • An AI that answers once. The Ask tab sends only the selected part or net, its readings and the repair notes. Each value in an answer has to trace to that data and any name that isn’t on the board gets marked. An answer that passes goes into our own library, tied to the exact data behind it, so the next person with the same question gets it with no AI call. In a live test the AI refused a fake reading and a part that doesn’t exist, and it isn’t perfect, so visitors can report an answer and enough reports withdraw it.
  • Views from people who do this work. The net tree, the folded view of both sides and the schematic link were inspired by FlexBV, the desktop tool an experienced repair tech compared us against. For full-time bench work, it’s the one to use.
Honest limits

What it doesn’t do yet

  • FZ, CAE, XZZ, ASC, BDV, BVR 1, CAD and CST readers have been tested only on files we made ourselves, so real files may turn up surprises, as they did for GenCAD. Real boards have opened in BRD, BVR 3, KiCad, Eagle, GenCAD and Altium ASCII.
  • We could not run the original readers beside ours, so the port has not been compared with the C++ line for line on the same files.
  • Binary Allegro, ODB++, Fabmaster, HyperLynx and Teboview files don’t open yet.
  • Encrypted files need the visitor’s own key. We don’t ship or supply keys.
  • Known-good readings cover about 100 boards, nearly all Apple.
Lessons

What we’d tell anyone moving a desktop tool to the web

  1. Port the knowledge, not the program. The value was in the file rules, not the window around them. Keeping the rules and replacing the rest gave a page that loads, pre-renders and fits the site’s security policy.
  2. Look for a second opinion in the data. With no way to run the original here, a board that exists in several exported forms did the same job.
  3. Treat files as hostile. C++ can read past a buffer and carry on. A web page must refuse clearly, and a test run of damaged files is how you know it does.
  4. A wrong answer costs more than no answer. When a label could mean two nets, it stays unlinked. At the bench, the wrong net wastes more time than a missing link.
  5. Test the deployed thing. Every smoke test passed while the schematic was broken. Open the real page in a real browser.
  6. Compare with what experts already use. Side-by-side screenshots from an experienced repair tech found more than the tests did: the net lines, the both-sides view and the readings came from that.
Your program

Does your business depend on a desktop program?

The same approach may work for it: keep the rules that took years to get right, and replace what’s around them.

Try it

Open a board

The viewer opens on the open-source Glasgow board. Open its schematic, click a part or a net, then try your own file. Nothing is uploaded.

Open the board viewerOpenBoardView on GitHub

OpenBoardView is released by its authors under the MIT license. OpenBoardData’s readings and notes are the work of its contributors, under the Open Database License. This viewer isn’t made or endorsed by either project, or by FlexBV’s author.