Each of you marks your free hours. Three links go back and forth, and both of you learn only the hours that match. The hours travel blinded inside the link itself; this page has no server to send them to.
F1 · A → BInviteA's blinded hours. Nobody learns anything yet.
F2 · B → AReplyB's blinded hours. A can now see the overlap.
F3 · A → BFinalLets B see the same overlap.
Running self-test…
Does a long link make it through?
The invite for one week is about 4 KB and the reply about 7 KB; a month of half-hours reaches 31 KB. Send each test link through an app, open it on the other phone, and see whether it arrived whole. Every test link carries its own checksum.