<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>VoiceBan — Notes from the build</title><link>https://voiceban.io/blog/</link><atom:link href="https://voiceban.io/blog/feed.xml" rel="self" type="application/rss+xml"/><description>Engineering write-ups from the team building VoiceBan.</description><language>en</language><lastBuildDate>Thu, 30 Jul 2026 01:41:53 +0000</lastBuildDate><item><title>The Hidden Centralization in Web3: DNS as a Single Point of Failure</title><link>https://voiceban.io/blog/dns-single-point-of-failure/</link><guid isPermaLink="true">https://voiceban.io/blog/dns-single-point-of-failure/</guid><pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate><dc:creator>Kofi Otuo</dc:creator><description>Ethereum kept producing blocks through every major outage and takedown. Users still could not reach the app. Two of four layers in a typical Web3 stack are decentralised, and the first one a user touches is the most centralised part of the whole thing.</description></item><item><title>The Browser Is the Bottleneck: Why dApps Can’t Escape HTTP</title><link>https://voiceban.io/blog/browser-bottleneck/</link><guid isPermaLink="true">https://voiceban.io/blog/browser-bottleneck/</guid><pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate><dc:creator>Kofi Otuo</dc:creator><description>"Just use libp2p" is not the answer people think it is. A browser tab can only put HTTP, WebSocket and WebRTC on the wire — and all three still end at a domain name in DNS. Which is why the ecosystem hardcoded Infura and called it done.</description></item><item><title>Deterministic IPFS as a Browser-Compatible Discovery Layer</title><link>https://voiceban.io/blog/deterministic-ipfs-discovery/</link><guid isPermaLink="true">https://voiceban.io/blog/deterministic-ipfs-discovery/</guid><pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate><dc:creator>Kofi Otuo</dc:creator><description>How VoiceBan actually does it: a shared derivation function and the current time window let the frontend and the backend independently compute the same IPNS name, without ever exchanging it. The name rotates, so there is no fixed address to sit on a blocklist.</description></item></channel></rss>