DEV Community

Cover image for Signal QR Stuck on Spinner — University Firewall Was the Culprit
Musa Nayyer
Musa Nayyer

Posted on • Originally published at muzasio.hashnode.dev

Signal QR Stuck on Spinner — University Firewall Was the Culprit

Problem: I tried linking my iPhone as a secondary Signal device. The QR code just spun forever — a loading spinner inside a white box. No error. Just nothing.

My setup: Primary device — Redmi 13C (PTA), Signal registered and working. Secondary device — iPhone (non-PTA). University Wi-Fi. I wasn't doing a full registration or transfer. Just: Settings → Linked Devices → Link New Device on iPhone. Dead silence from Signal.


What I Tried

First assumption: it's the non-PTA iPhone. Maybe Signal's blocking it? Nope — PTA status is a cellular registration thing. It has zero effect on Wi-Fi app behavior.

Second assumption: maybe I need to select "transfer from Android"? Nope — I didn't want a transfer. Just a secondary link. The flow is: iPhone shows QR → Redmi scans it.

I got the flow backwards at first too. Thought Redmi generates QR, iPhone scans. Wrong. iPhone (secondary) generates the QR. Redmi (primary) scans it.

The QR never loaded on iPhone. That's when it clicked — it's not the phone, it's the network.


What Actually Happened

Signal's QR code generation isn't local. The iPhone hits Signal's provisioning API (api.signal.org, storage.signal.org) to create a time-sensitive token before displaying the code. My university network was blocking those endpoints.

Why did Redmi register fine earlier? Probably a different time, different access point, or Android and iOS clients have different TLS fingerprints — and the firewall's application-layer inspection treats them differently. University-grade firewalls (Fortinet, Palo Alto) do this.


The Fix

Proton VPN on both devices, same server location.

  1. Installed Proton VPN (free tier) on both iPhone and Redmi
  2. Connected both to the same server (Netherlands)
  3. On iPhone → Signal → Linked Devices → Link New Device
  4. QR code appeared instantly
  5. Redmi scanned it — linked successfully

6. Redmi got logged out immediately after. That's not a bug — Signal logs out existing sessions when a new device links, by design. Re-registered with the phone number and everything was fine. Message history is local anyway; it doesn't sync across linked devices.

Key Insights

  • The QR code requires a live API call. If Signal's servers are unreachable, the spinner loops forever with no error message. Signal could honestly show a better error here.
  • iOS and Android Signal clients behave differently at the network level. A firewall can block one and pass the other.
  • University networks block more than you think. VoIP, messaging APIs, certain CDN routes — it's not just torrents.
  • Free VPN is enough for this. Proton VPN free tier worked fine. No speed requirements for a one-time provisioning handshake.

- Both devices need to be on the same network exit. The provisioning token is bound to the originating network context. If iPhone generated it over VPN and Redmi scanned from plain university Wi-Fi, it failed with "QR code not valid."

TIL

Signal's device linking QR is a remote token, not a local code — and if your network blocks Signal's API endpoints, you'll get an endless spinner with zero explanation.

Top comments (0)