scrcpy can rescue everything on a phone with a broken screen. It just needs the phone's local IP. You cannot read that IP, because you cannot see the screen. This is the small browser tool that finds it for you, from the network side, before you ever touch the phone.
It is the same week, every year, for someone you know. Glass meets concrete. The phone keeps working. The screen does not. The photos cannot wait for a service centre's queue.
Minute 0
The phone falls.
You can hear notifications. The phone is alive. The screen is a spider web. You cannot see the IP. You cannot tap a "show IP" toggle. You cannot do anything visible on it.
Minute 1
scrcpy needs an IP.
scrcpy can mirror the phone over Wi-Fi and let you control it from a laptop. Pictures, contacts, that one note from your father · all reachable. But it needs the phone's local IP. And only the phone knows that.
Minute 2
The phone has been telling you all along.
A tiny Termux boot script on the phone has been posting its IP to a Cloudflare Worker every few minutes. The Worker writes the latest IP and timestamp into KV. You set this up months ago and forgot.
Minute 3
You open the URL on a laptop.
One page. No login. IP: 10.10.9.50 · Updated: 15:12 IST. No-cache headers, the truth right now.
Minute 5
scrcpy connects. The photos come back.
You run adb connect 10.10.9.50:5555, then scrcpy. Your phone screen appears on your laptop. You unlock with the right pattern, blind, on memory. You drag the photos out.
Act II · How it works
A worker. A KV store. A boot script. That is all.
No cloud account, no SaaS. Cloudflare Workers + KV is free at this scale. The phone pushes its IP every five minutes. The page reads it back, no-cache, instantly.
phone (Termux:Boot)cloudflare workeryour laptop
+---------------------+ +---------------------+ +---------------------+
| every 5 minutes: | POST | /update | GET | open the URL |
| read wlan0 IP | ─────► | verify SECRET | ◄────── | phoneip.dmj.one / |
| curl /update | json | KV.put('latest') | text | IP: 10.10.9.50 |
+---------------------+ +---------------------+ | Updated: 15:12 IST |
+---------------------+
always-on no cache, no bloat one page, no install
The Stack
Three small pieces. Free at this scale.
Cloudflare Workers
Cloudflare KV
Termux + Termux:Boot
Bash + wget
scrcpy / adb
Plain JavaScript
No-cache headers
Act III · Proof
Built once. Used the day you need it most.
Boot-time auto-restart
Termux:Boot runs update_ip.sh on every reboot. Old loops are killed via PIDFILE, so multiple boots never stack background processes. Logs to ~/update_ip.log.
No-cache from the worker
The worker sets Cache-Control: no-store, Pragma: no-cache, Expires: 0. The IP you read is always the latest one the phone reported, never an edge stale.
Shared secret on POST
Only the phone (or anything that has the UPDATE_SECRET) can write. Anyone can read, because the read URL is on a private subdomain you only share with yourself.
IST-formatted timestamp
The timestamp is rendered in Asia/Kolkata, 24-hour. So when you read "15:12:22" you know without thinking whether the loop is alive or stuck.
Tiny tools. Outsized days.
I build the small things you only need once a year, that save the day when you do. Free to host, no app to install, no account to sign up for.