Releases: iscarelli/niimbot-web-bluetooth
v1.3.5 — real-world GIF + Troubleshooting docs
Docs-only release (no code change).
Added
- README Real-world use GIF — the driver printing real labels inside a production app.
- README Troubleshooting section (macOS blank prints →
PACE_MS, model-mismatch errors, dense/BLE tuning, Web Bluetooth support,DEBUG).
Published so npmjs.com carries these docs (and the demo/real GIFs via raw links).
🤖 Generated with Claude Code
v1.3.4 — fix blank dense prints on macOS
Patch release.
Fixed
- macOS: dense/batch prints came out blank on the B1 Pro (and other "fast" models) while still reporting 100%. macOS CoreBluetooth silently drops the unacked
writeValueWithoutResponsebursts that Windows tolerates, so the image rows never arrived. On macOS the driver now paces the "fast" models too (one frame per write + a gap). Windows behavior is unchanged.
Added
Niimbot.PACE_MS— runtime-tunable gap (ms) between unacked writes (default 10).
🤖 Generated with Claude Code
v1.3.3 — fix B1 Pro stress printing
Patch release.
Fixed
- B1 Pro regression: dense/stress batches showed "printing" but produced nothing. Frame bundling (added in 1.2.0, validated only on the B1 and M2-H) is not tolerated by the B1 Pro. Bundling is now per-model (
MODEL_IDS.bundle), enabled only where validated; the B1 Pro and unidentified models revert to one frame per BLE write.
Added
- README demo GIF.
Packaging
- npm tarball slimmed (ships
docs/protocol-v4.md, not the wholedocs/folder, so the demo GIF/source aren't bundled).
🤖 Generated with Claude Code
v1.3.2 — drop unused MODEL_IDS.printhead
Patch release. No code or behavior change.
- Removed: the unused
printheadfield fromMODEL_IDSinsrc/niimbot.js. The driver never read it (the print width comes from each registry size'sw_px), and a single per-model figure invited confusion with label width — e.g. the B1 Pro 50×30 renders at 584 px though its printhead is 567 px.
First release published via the OIDC trusted-publishing workflow (if the npm Trusted Publisher is configured).
🤖 Generated with Claude Code
v1.3.1 — registry coherence
Patch release. No code or behavior change.
- Fixed:
T50x30_m2hinregistry.jsonwas still flagged_untested— the Niimbot M2-H and its 50×30 size are validated, so the marker is removed (replaced with a_notedocumenting the 567 px printhead derivation). Registry header comment updated to match. - Bumped
package.json+ driverVERSIONto 1.3.1 for coherence with npm and re-vendored copies.
🤖 Generated with Claude Code
v1.3.0 — Niimbot M2-H + automatic model identification
Adds the Niimbot M2-H and makes the driver identify the connected printer automatically. Validated on real hardware (B1, B1 Pro, M2-H).
Added
- Niimbot M2-H (
b1task, 300 dpi, model id 4608) — validated end-to-end. Uses the b1 command sequence with fast unacked writes (B1-Pro-class). - Automatic model identification — on connect the driver reads the model id (
PrinterInfo 0x40[08]) + protocol version (PrinterStatusData 0xA5) and picks the right task/flow-control, even though B1/B1 Pro/M2-H share a BLE name. Exposed asNiimbot.printer;Niimbot.identify(model)returns it without printing;Niimbot.disconnect()swaps printers. - Per-model flow control — only the 203 dpi B1 paces its writes; the 300 dpi B1 Pro and M2-H burst.
- Live demo on GitHub Pages,
package.json(zero-dep, npm-ready), README badges + supported-printer table.
Fixed
- M2-H printed at ~30 s/page because it exposes the
writeproperty and fell into slow write-with-response; theb1path now always prefers fast/paced unacked writes (niim.blue's approach).
Validated printers
| Model | task | dpi | id |
|---|---|---|---|
| Niimbot B1 | b1 |
203 | 4096 |
| Niimbot B1 Pro | v4 |
300 | 4097 |
| Niimbot M2-H | b1 |
300 | 4608 |
The only residual slowness is a full random-noise page at 300 dpi (BLE throughput limit) — not a real-label scenario. See docs/protocol-v4.md.
🤖 Generated with Claude Code
v1.2.0 — Niimbot B1 support + faster, self-identifying driver
Adds the Niimbot B1 (203 dpi, protocol 3) to the driver alongside the B1 Pro, and makes multi-label printing fast, continuous, and safe. Validated on real B1 hardware.
Added
- Niimbot B1 (
b1task, 203 dpi) — full print path: post-connect handshake,PrintStart 7b,PageStart,SetPageSize 6b, total-mode rows, status poll,PrintEnd. - Model auto-identification — the B1 and B1 Pro share the BLE name, so the driver reads the model id (
0x40[08], B1=4096 / B1 Pro=4097) and protocol version on connect, exposesNiimbot.printer, and refuses to print on a task/dpi mismatch.Niimbot.identify(model)returns it without printing. copies—printImage(url, { copies:N })uploads the image once and the printer repeats it (as niim.blue does), far faster than re-sending.- Frame bundling — several row frames per BLE write (
Niimbot.BUNDLE_MAX, default 240) so even worst-case dense pages stream without stalling between labels. Niimbot.disconnect()— drop the link to pair another printer; demo gained Identify/Disconnect buttons and a 3-copies button.
Changed / Fixed
- B1 prints a batch as one continuous job of N pages (no retract between labels), matching the B1 Pro path.
- Print-position calibration (
offset_y_px); row pacing aligned to niim.blue's 10 ms; flow control + handshake now follow the detected model.
Validated printers
| Model | task | dpi |
|---|---|---|
| Niimbot B1 Pro | v4 |
300 |
| Niimbot B1 | b1 |
203 |
Other models in the same protocol families are likely compatible but untested. See docs/protocol-v4.md and README.md.
🤖 Generated with Claude Code
v1.1.0 - Continuous multi-label batch printing
Continuous multi-label batch printing (B1 Pro / protocol V4)
Multi-label batches now print as a single continuous job. Previously each
label ran as its own full job, so the printer stopped, fed the label out, and
retracted the paper before every next label - slow and unlike the Niimbot
app. Now the job is opened once, all pages stream through, and it closes once.
Fixed
- No more retract between labels. The per-label
PrintEnd(0xF3) - which
triggers the B1 Pro end-of-job feed-out + paper retract - now runs exactly
once at the end of the batch instead of after every label. - No stop between labels. Pages are pipelined with a 2-page look-ahead:
the next page(s) are queued while the current one prints, throttled by the
0xA3->0xB3page counter so a long or dense batch still cannot overrun the
printer line buffer.
Changed
- Print sequence refactored into
beginJob/sendPagePacked/waitPage/
endJob.PrintStartnow declares the total page count (16-bit BE) up front;
each page sends 1 copy viaSetPageSize.waitPagecompares the cumulative
page counter against the running page index rather than a fixed1.
Demo
- Added "3-label batch", "3 dense labels" and "5 dense labels" stress buttons,
plus a dependency-free static server (demo/serve.mjs) for local Web
Bluetooth testing overlocalhost.
Verified
Tested on real B1 Pro hardware: no retract, continuous flow, and no
corruption at 5x worst-case (random-noise) label density. A minor, bounded gap
can remain only at maximum density; real-world labels (which compress under
run-length encoding) stream cleanly.
Note: maximum print width / page buffering is firmware-dependent; very dense
labels at the largest size are where any residual gap would appear.