2026-04-11 - 2026-10-11
Overview
45 pull requests merged by 1 user
Merged
#124 feat(machine): apply the settle_transaction operator op (ADR-005 §6)
Merged
#123 ADR-005 rollout step 1: value-confirmed dispense, fault screens, cash-out latch, dispense-report outbox
Merged
#120 feat(deploy): run the tejo from USB (disk-image-tejo-usb)
Merged
#119 fix(hal): await the serial close, and stop reporting a cassette layout the dispenser refused
Merged
#115 fix(nfc): make the Bolt Card reader an opt-in machine capability
Merged
#114 feat(deploy): USB-bootable douro image (disk-image-douro-usb)
Merged
#112 perf: cut the image 38% and turn GPU acceleration back on
Merged
#111 Give the upgrade window its own timezone, not the system
Merged
#108 Finish the console object-argument sweep
Merged
#107 Interpolate log fields instead of passing an object
Merged
#106 Consume operator cassette operations instead of counts
Merged
#105 docs(adr): record the cassette-state synchronization model
Merged
#104 fix(cassettes): close the machine-side divergence paths
Merged
#103 fix(deploy): guard the WireGuard peer units too, not just the interface
Merged
#101 fix(deploy): nightly auto-upgrade failed on both ATMs, for different reasons
Merged
#100 fix(access): instrument Complete, and say when a card can't sell
Merged
#99 fix(cash-out): settlement watch missed one-tap payments
Merged
#97 fix(access): session Complete failed on IPC clone; keep rate lookup off the unlock path
Merged
#96 fix(machine): keep the mouse pointer visible on the web demo
Merged
#95 fix(idle): drop the redundant "Available: N sats" line
Merged
#93 feat(access): verified Bolt Card session at entry + hidden-by-default balance
Merged
#92 fix(access): single-shot loaded card + ADR-003 amendment
Merged
#86 feat(access): Bolt Card tap-to-enter access gate (ADR-003)
Merged
#89 chore: scrub "Lamassu" from shipped labels
Merged
#88 feat: support a public browser demo of the kiosk
Merged
#85 fix(nfc): auto-recover a wedged CCID reader via USB power-cycle
Merged
#84 feat(machine): Bolt Card (NFC) tap-to-receive on cash-in
Merged
#83 feat(machine): Bolt Card (NFC) tap-to-pay on cash-out
Merged
#82 feat(machine): connectivity auto-recovery + on-screen Retry
Merged
#81 fix(lightning): cash-in commission charged twice (send gross principal, not net)
Merged
#80 fix(batm3): eGalax touchscreen (kernel 6.6) + USB-bootable image
Merged
#79 fix(batm3): get cash-in working — EBDS escrow latch + correct serial device paths
Merged
#77 fix(machine): credit bills on stacked-confirmation, not stack command (#58)
Merged
#75 fix(machine): decrement cassettes by position, not denomination, on cash-out
Merged
#74 feat(machine): consume get_machine_config over the transport (#70 P1 client)
Merged
#73 feat: seed-driven pairing over the LNbits nostr-transport (#70)
Merged
#72 deploy: bootable slim Sintra image + shared UP Board serial hardware
Merged
#68 feat(machine): on-machine QR-pairing wizard
Merged
#67 fix(machine): guard the availability beacon sign against bunker blips
Merged
#66 feat: secure cash-in via server-stamped create_withdraw RPC (#52)
Merged
#65 fix(machine): republish cassettes-state after dispense + on reload
Merged
#64 Phase D follow-up: retry-policy switch for idempotent reads (#52)
Merged
#63 Phase E: provision VITE_SPIRE_SEED for bunker pairing (#52)
Merged
#61 Phase D: typed LNbits error codes + re-pair UX (#52)
Merged
#60 Phase C: resolve signer from spire seed / bunker binding at bootstrap (#52)
2 pull requests proposed by 1 user
Proposed
#87 feat: Raspberry Pi 5 (aarch64) target + Pyramid Apex RS-232 bill validator
Proposed
#110 feat: Raspberry Pi 4 (aarch64) target
25 issues closed from 1 user
Closed
#118 Cassette hot-reload always fails on douro (serial close race), and the app reports success anyway
Closed
#94 cassette layout changes after first boot never reach spirekeeper (one-shot hello gate)
Closed
#76 bug(machine): manual_dispense never decrements DB cassette counts — inventory overstates after operator remediation
Closed
#98 nightly nixos-upgrade fails on batm3 (no known_hosts) and sintra (switch step)
Closed
#57 feat: Layer 3 — consume operator fee config from Nostr; drop hardcoded cashInFeeFraction / cashOutFeeFraction
Closed
#50 security: hash-based dedup on subscribe_payments push callbacks
Closed
#38 feat: operator command channel via Nostr (manual dispense, remote management)
Closed
#49 security: verify reply event signature in LnbitsClient.sendRpc
Closed
#33 Replace hourglass loading animation with pickaxe mining animation
Closed
#36 Add npub scan receipt feature to cash-in/cash-out flows
Closed
#31 Cash-in bill timeout: consider auto-finalize vs security trade-off
Closed
#29 Dispenser re-initialization after errors
Closed
#30 Smarter dispense error handling and recovery
Closed
#20 Add device configuration for HAL drivers
Closed
#28 Validator enable/disable must follow state transitions
Closed
#18 Convert apps/machine from Tauri to Electron
Closed
#16 Update CLAUDE.md test counts and implementation status
Closed
#19 Wire HAL drivers to state machine services
Closed
#13 Move integration test scripts to proper directory structure
Closed
#12 Fix ndebit-cash-in-flow.md documentation - incorrect SDK references
Closed
#45 [migrated PR slot] fix(hal/ebds): poll MEI at 100ms — stop tearing bills on BATM3
Closed
#9 Implement noffer-based cash-out flow
Closed
#39 [migrated PR slot] feat: operator command channel via Nostr (manual dispense)
Closed
#10 [migrated PR slot] feat: implement noffer-based cash-out flow
Closed
#5 ShockWallet shows "Unknown Recipient" when scanning ndebit - Profile lookup protocol mismatch
77 issues created by 1 user
Opened
#2 Feature: Remote Initiation, Local Redemption
Opened
#1 Feature: Public Cash Availability Display
Opened
#4 Feature: Optional npub identification for cash-in via NIP-17
Opened
#3 Feature: Hold Invoices for Safe Dispensing
Opened
#7 Consolidate repository: remove submodules and make lamassu-next standalone
Opened
#5 ShockWallet shows "Unknown Recipient" when scanning ndebit - Profile lookup protocol mismatch
Opened
#6 Dynamic Commission System
Opened
#8 Implement session-scoped ndebit authorization for cash-in security
Opened
#9 Implement noffer-based cash-out flow
Opened
#10 [migrated PR slot] feat: implement noffer-based cash-out flow
Opened
#11 Implement cash-out "Sell Bitcoin" flow with denomination-aware amount selection
Opened
#12 Fix ndebit-cash-in-flow.md documentation - incorrect SDK references
Opened
#14 Add package READMEs for all packages
Opened
#13 Move integration test scripts to proper directory structure
Opened
#15 HAL: Implement real hardware drivers (validators and dispensers)
Opened
#16 Update CLAUDE.md test counts and implementation status
Opened
#18 Convert apps/machine from Tauri to Electron
Opened
#17 Cash-in: Detect ndebit claim success and show confirmation to user
Opened
#20 Add device configuration for HAL drivers
Opened
#21 Test HAL drivers on physical Sintra hardware
Opened
#19 Wire HAL drivers to state machine services
Opened
#22 LNBits as Nostr-native UI layer over Lightning.Pub
Opened
#23 Add k1 session token to ndebit for reliable request matching
Opened
#25 Implement unique hash (id_unique_hash) for LNURL-withdraw session tracking
Opened
#24 feat(machine): use Nostr events for LNURL-withdraw completion notification
Opened
#26 feat: Cashu ecash integration for offline ATM operation and fiat-stable vouchers
Opened
#27 Smart cassette fallback on dispenser pickup errors
Opened
#28 Validator enable/disable must follow state transitions
Opened
#30 Smarter dispense error handling and recovery
Opened
#29 Dispenser re-initialization after errors
Opened
#31 Cash-in bill timeout: consider auto-finalize vs security trade-off
Opened
#32 Evaluate Lightning.Pub triggers as backup payment confirmation
Opened
#34 Backport error handling patterns from legacy lamassu-machine
Opened
#33 Replace hourglass loading animation with pickaxe mining animation
Opened
#35 Improve transaction limit enforcement for cash-in and cash-out
Opened
#36 Add npub scan receipt feature to cash-in/cash-out flows
Opened
#38 feat: operator command channel via Nostr (manual dispense, remote management)
Opened
#37 feat: MEI cash recycler driver for BATM3
Opened
#40 Rename fee_percent to fee_rate for clarity
Opened
#39 [migrated PR slot] feat: operator command channel via Nostr (manual dispense)
Opened
#42 Fleet management: Nostr-native remote control & telemetry for ATM operators
Opened
#41 Multi-location deployment: extract per-machine config to runtime site files
Opened
#43 Enrich kind 30078 beacon for public ATM status pages
Opened
#44 Carry principal/fee split end-to-end via Payment.extra on cash-out invoices (and LNURL-withdraw equivalent)
Opened
#46 audit id003 _send 100ms setTimeout — possible escrow→stack race on Sintras
Opened
#45 [migrated PR slot] fix(hal/ebds): poll MEI at 100ms — stop tearing bills on BATM3
Opened
#49 security: verify reply event signature in LnbitsClient.sendRpc
Opened
#47 Operator branding — logo, title, color scheme overrides
Opened
#48 satmachineadmin becomes the bitSpire operator dashboard
Opened
#50 security: hash-based dedup on subscribe_payments push callbacks
Opened
#51 security: NixOS systemd hardening regression — restore baseline isolation
Opened
#53 chore: ESLint config missing — pnpm lint is broken across the workspace
Opened
#52 track: consume LNbits sidecar bunker (replace VITE_ATM_PRIVATE_KEY with bunker:// URL)
Opened
#55 Trim ATM closure to recover eMMC headroom
Opened
#54 test(lnbits): exercise FIFO eviction in recordSeen (follow-up to #50)
Opened
#56 ATM-side consumer: operator-driven cassette inventory config
Opened
#57 feat: Layer 3 — consume operator fee config from Nostr; drop hardcoded cashInFeeFraction / cashOutFeeFraction
Opened
#58 bug(cash-in): bill in escrow can be abandoned when user presses "done" before stack confirms
Opened
#59 Remote access & recovery plane: NetBird-based, operator-owned (implements ADR-002)
Opened
#62 Carry the operator identity in the pairing seed (NIP-19 nprofile)
Opened
#69 Sintra: drive the scan-bay illuminator LED during QR scanning
Opened
#70 Unpaired machine shows "ATM Unavailable" instead of the pairing wizard (config validated before pairing)
Opened
#71 Source operator pubkey + fee config from LNbits over the transport, not env/seed (#70 P1)
Opened
#76 bug(machine): manual_dispense never decrements DB cassette counts — inventory overstates after operator remediation
Opened
#78 bug(cash-out): unwatched-payment windows — no invoice expiry, silent watchInvoice setup failure
Opened
#90 access: persist the access audit to state.db
Opened
#91 access: open enrollment lets any /scan/ NDEF tag through the gate
Opened
#94 cassette layout changes after first boot never reach spirekeeper (one-shot hello gate)
Opened
#98 nightly nixos-upgrade fails on batm3 (no known_hosts) and sintra (switch step)
Opened
#102 ATMs should fetch with per-machine read-only deploy keys, not an operator account key
Opened
#113 IdleView offers Sell Bitcoin on machines with no dispenser
Opened
#116 batm3 nightly auto-upgrade has failed since Sep 24 — mesa builds locally and hits the 60s timeout
Opened
#117 Hardware device paths have two sources of truth — the NixOS module's defaults are wrong for every model, and warn misleadingly at boot
Opened
#118 Cassette hot-reload always fails on douro (serial close race), and the app reports success anyway
Opened
#121 A relay outage at boot is misread as a revoked pairing, and latches the machine on the pairing wizard for good
Opened
#122 bug(cash-out): a jammed dispense takes the customer's sats, tells the server nothing, over-counts the cassette, and leaves the machine advertising itself as available
Opened
#125 test(machine): settlement-watch.test.ts — 5 of 7 fail on a clean dev checkout