
BICO
A desktop image converter that treats bulk work as the normal case.
Point it at a folder, choose a format, and it converts everything without uploading a byte. Version 3 was a complete rewrite of the interface, the processing engine, the security model and the build.
Download · Source · MIT licensed

The problem
Web tools cap your upload, take your images, and process them on someone else's machine. Desktop tools that do not tend to be command line only, or they freeze while they work.
Version 2 of BICO fell into the last category. It ran the image library on the same thread that drew the window, so the interface locked up for the length of every batch. That is not a bug you can polish away, so version 3 started from the architecture.
What I built
Processing
- A pool of native worker threads sized to the machine, so encoding never touches the UI thread
- Optional GPU acceleration through WebGPU compute shaders for resize, filters, colour work and watermark compositing, with multi adapter support and silent fallback to the CPU
- Nine output formats with their real encoder controls, plus a passthrough mode
- JPEG XL and JPEG 2000 provided as bundled WebAssembly codecs, because no prebuilt libvips has them
- Size targeting, which searches the quality scale per image until a file fits a byte budget
- Variant output, producing a full responsive set from a single decode
Interface
- A live before and after preview with a wipe comparison at the current settings
- Three languages, English, Turkish and Arabic, with a genuine right to left layout
- Eight complete themes, each previewed as a live miniature, plus an adjustable accent
- Lifetime statistics kept locally: totals, a ninety day chart, per format breakdown, GPU versus CPU
- Hot folder automation with a tray icon, so it keeps working after the window closes

Engineering the work is worth reading
A typed contract across four processes. The main process, the preload bridge, the sharp workers and the React renderer all compile against one shared types file. Changing a field surfaces as a compile error everywhere it is read.
Translations that cannot silently fall back. Each language is declared as
Record<TranslationKey, string>, so a string added in English fails the build until Turkish and
Arabic supply it. This caught a real defect: format descriptions were being read from shared code
rather than the dictionaries, so they had stayed English in both translations.
Colour chosen perceptually, then verified. Text on a coloured surface is picked with APCA rather than the WCAG 2 ratio, whose luminance weighting scores a saturated blue as light and puts black text on a blue button. Hover and pressed shades are generated in Oklab so they keep hue and chroma and always move away from the text colour. Checked across every accent the colour picker can produce: 24,389 colours by three states, 73,167 measurements, no state where the foreground disagrees with the background it sits on.
A security model rewritten. Version 2 exposed Node integration to the page. Version 3 has context isolation on, no Node in the renderer, and a custom protocol that carries opaque ids rather than filesystem paths.
An upgrade path that actually upgrades. Windows keys its uninstall entry on a GUID derived from the application id, which changed in version 3, so the new installer would have sat alongside the old one. Pinning the installer to the identity version 2 registered under makes the standard upgrade path find and remove it first.

Built with
Electron 43 · React 19 · TypeScript 5.9 · Ant Design 6 · electron-vite · sharp on libvips 8.18 · WebGPU compute shaders in WGSL · WebAssembly builds of libjxl and ImageMagick · Zustand · electron-builder with a customised NSIS installer
Around 33,700 lines of TypeScript across 104 modules, shipping to Windows, macOS and Linux from one codebase.
What it demonstrates
- Desktop application architecture, including process boundaries and IPC design
- Concurrency and performance work under a real constraint, keeping a UI responsive
- GPU programming with compute shaders, and knowing which work does not belong on a GPU
- Accessibility taken as a measurable property rather than an intention
- Internationalisation, including right to left layout, enforced by the type system
- Release engineering: signing, installers, upgrade paths and an update feed
Links
- Download for Windows, macOS or Linux: releases
- Source, issues and pull requests: github.com/shehari007/BICO
- Author: github.com/shehari007
- Role
- Sole developer and maintainer
- Year
- 2023
- Category
- Desktop App
- Built with
- electronvite-electronsharpwebgpuantdesign