The most common culprit is a misconfigured public key or endpoint address. Double-check that the peer's public key in your config matches exactly what the server has — even one wrong character breaks the handshake. Also verify the endpoint IP and port are correct and that UDP traffic on that port isn't blocked by your router or firewall.
WireGuard is up, handshake succeeds, but pages don't load. Usually it's a routing issue: the AllowedIPs field controls what traffic goes through the tunnel. If you want all traffic routed, set it to 0.0.0.0/0, ::/0. Also check that the server has IP forwarding enabled and NAT configured properly on its end.
Intermittent disconnects usually mean the persistent keepalive isn't set. Add PersistentKeepalive = 25 to the peer section in your config. This sends a small packet every 25 seconds to keep the connection alive through NAT and stateful firewalls.
If the app throws a parse error on import, the file likely has encoding issues or invisible characters. Open it in a plain text editor, make sure it's saved as UTF-8 without BOM, and that section headers like [Interface] and [Peer] have no extra spaces or blank lines before them.
Set the DNS field in [Interface] to a reliable resolver like 1.1.1.1. If hostnames still don't resolve inside the tunnel, check that your OS isn't bypassing the tunnel's DNS — on Windows, use 'DNS leak test' tools to confirm which resolver is actually being used.