Skip to content

Releases: iscarelli/niimbot-web-bluetooth

v1.3.5 — real-world GIF + Troubleshooting docs

07 Jun 19:49

Choose a tag to compare

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

07 Jun 19:35

Choose a tag to compare

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 writeValueWithoutResponse bursts 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

07 Jun 18:45

Choose a tag to compare

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 whole docs/ folder, so the demo GIF/source aren't bundled).

🤖 Generated with Claude Code

v1.3.2 — drop unused MODEL_IDS.printhead

07 Jun 18:27

Choose a tag to compare

Patch release. No code or behavior change.

  • Removed: the unused printhead field from MODEL_IDS in src/niimbot.js. The driver never read it (the print width comes from each registry size's w_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

07 Jun 18:03

Choose a tag to compare

Patch release. No code or behavior change.

  • Fixed: T50x30_m2h in registry.json was still flagged _untested — the Niimbot M2-H and its 50×30 size are validated, so the marker is removed (replaced with a _note documenting the 567 px printhead derivation). Registry header comment updated to match.
  • Bumped package.json + driver VERSION to 1.3.1 for coherence with npm and re-vendored copies.

🤖 Generated with Claude Code

v1.3.0 — Niimbot M2-H + automatic model identification

07 Jun 14:49

Choose a tag to compare

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 (b1 task, 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 as Niimbot.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 write property and fell into slow write-with-response; the b1 path 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

07 Jun 13:47

Choose a tag to compare

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 (b1 task, 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, exposes Niimbot.printer, and refuses to print on a task/dpi mismatch. Niimbot.identify(model) returns it without printing.
  • copiesprintImage(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

05 Jun 12:09

Choose a tag to compare

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->0xB3 page counter so a long or dense batch still cannot overrun the
    printer line buffer.

Changed

  • Print sequence refactored into beginJob / sendPagePacked / waitPage /
    endJob. PrintStart now declares the total page count (16-bit BE) up front;
    each page sends 1 copy via SetPageSize. waitPage compares the cumulative
    page counter against the running page index rather than a fixed 1.

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 over localhost.

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.