laserpecker
An open control library for LaserPecker laser engravers — because the vendor's software is Windows/macOS only and the Android app is painful to use.
Target device: LaserPecker 2. The protocol is shared across the LP1–LP5 range, so other models should work with adjusted device limits.
Status
Tested on real hardware (LP2, firmware 3.16) over both USB and Bluetooth: reading the device works, and engraving runs end to end — dither, upload, print start, motif on the workpiece.
| Area | State |
|---|---|
| Frame encoding / checksums | byte-identical to LDS 2.12.1, confirmed on device |
| Status, version, MAC, file list | verified on hardware, both transports |
| Serial transport (CH340, 460800) | verified |
| BLE transport | verified, but not re-run since the chunk-size fix |
| Preview (frame) and stop | verified |
| Raster upload + engrave | verified end to end |
| Upload file ID from image content | reasoned about, not yet re-run on a machine |
| Focus / Z-axis, settings write | implemented, untested — moves hardware |
| Vector / G-code jobs | not implemented |
The full list of what is still a guess is in
TODO.md.
How it was obtained
LaserPecker Design Space 2.12.1 for Windows is an Electron app. Its renderer bundle contains the complete
command layer in readable JavaScript, and the image pipeline as a WebAssembly module that can be executed
directly. The specification —
docs/protocol.md — comes from reading
that code and running the WASM against synthetic images; the machine then confirmed it.
Decompiling for interoperability is explicitly permitted in the EU (Art. 6 Software Directive, § 40e öUrhG).
Install
uv sync # or: pip install -e "."
Serial access on Linux needs membership in the dialout group; the CH340 driver is in-kernel.
Use
laserpecker ports # find the device
laserpecker info # firmware / hardware version
laserpecker status # mode, progress, errors
laserpecker preview --width 30 --height 20
laserpecker engrave logo.png --width 40 --power 30 --depth 50
from PIL import Image
from laserpecker import LaserPecker
with LaserPecker() as lp:
print(lp.info())
lp.engrave_image(Image.open("logo.png"), x_mm=10, y_mm=10, width_mm=40)
lp.wait_until_done(lambda s: print(s.rate, "%"))
Bluetooth instead of USB:
from laserpecker import LaserPecker, BleTransport
lp = LaserPecker(BleTransport("LP2-"))
Safety
The laser fires on preview and engrave. Wear the goggles, do not leave a running job unattended, and keep
stop within reach — it is the same 0xFF command the app uses.
Layout
src/laserpecker/
protocol.py frames, commands, reply parsers
transport.py serial + BLE
imaging.py dithering and bit packing
device.py high-level API
cli.py
tests/
Metadata
Release files for laserpecker 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| laserpecker-0.1.0.tar.gz | 33.6 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| laserpecker-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 65.7 kB
Release files / laserpecker-0.1.0.tar.gz
| Download URL | laserpecker-0.1.0.tar.gz |
|---|---|
| Size | 33.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b3b1aade5214590a4ff0b24fb0e7eb38be9735129f431c190cc02d2bce12806a
|
|
BLAKE2b-256 checksum How to use checksums |
af040383bcfc0514e6d6203780b49316d5b94972771937f9085982d45c5d787c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.17 {"installer":{"name":"uv","version":"0.9.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"KDE neon","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / laserpecker-0.1.0-py3-none-any.whl
| Download URL | laserpecker-0.1.0-py3-none-any.whl |
|---|---|
| Size | 32.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7e86f13ab40145787c66d94a176530193894169ed67d52e3a4565886a7617977
|
|
BLAKE2b-256 checksum How to use checksums |
6f5d98df72eb4bc25848759cbb5cd0bb9523596a05e4999c8cf1fdcc33c30fdc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.17 {"installer":{"name":"uv","version":"0.9.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"KDE neon","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for laserpecker 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.