The build
A NestJS backend (TypeORM, MySQL) and a React operations dashboard drive a native Android agent that becomes the Device Owner. The agent polls a heartbeat every ~10 seconds and, when the shop locks the device from the dashboard, shows a full-screen kiosk lock the user can't dismiss.
How it works
Devices enroll with a secret, then heartbeat to the backend. Shop staff lock or unlock from the dashboard; the on-device Device-Policy-Controller enforces it and clears the lock as soon as a payment is recorded.
Why it's hard
Becoming Device Owner, holding a reliable kiosk lock across reboots and network drops, and doing it without draining the battery is genuinely tricky Android systems work — this is running in production.