# La extensión de navegador: el recorrido

La extensión es URnetwork dentro del navegador, y la app web de ur.io es su
plano de control: un producto, dos mitades. Esta página es la inmersión a
fondo: la maquinaria de proxy en cada navegador, los controles con sus
valores de fábrica, qué promete y qué no promete el kill switch (interruptor
de corte), y qué comprobar cuando algo se rompe. Para la red que hay detrás,
quiénes son los proveedores y qué puede ver cada parte, lee la
[visión general](/docs/overview). Para los enlaces de las tiendas, el inicio
de sesión y la primera conexión, empieza por los
[primeros pasos en el navegador](/docs/getting-started-browser).

El encuadre que hay que conservar, siempre: **esto es un proxy de navegador,
no una VPN.** Un proxy es un intermediario que busca los sitios por el
navegador, de modo que los sitios ven su dirección en lugar de la tuya. La
extensión configura los ajustes de proxy propios del navegador, así que
gobierna exactamente lo que ese navegador envía, nada más. Cubierto: cada
pestaña y ventana de ese navegador, incógnito incluido, en Chromium siempre
y en Firefox una vez que lo permitas en las ventanas privadas. No cubierto:
otros navegadores, tu app de correo, las actualizaciones del sistema, todo
lo demás, tanto lo desprotegido como lo intacto. Instálala por navegador; la
cobertura de todo el dispositivo es trabajo de las apps de URnetwork
(Android, iOS, macOS, Windows, Linux): la misma cuenta, el mismo kill
switch, una capa más abajo.

![El popup de la extensión](/docs-assets/connect-extension.png)

## Los ajustes de un vistazo

La extensión mantiene su superficie pequeña a propósito. Dos controles,
ambos en el popup:

| Ajuste | Valor por defecto | Efecto | Coste principal |
|---|---|---|---|
| Kill switch | Activado | bloquea el tráfico del navegador cuando el proxy se cae, en lugar de recurrir a tu conexión directa | las pestañas dan error durante una caída |
| Ajuste manual de geolocalización (Geolocation override) | Desactivado | la API de geolocalización del navegador informa de tu ciudad de salida en lugar de tu posición real | los sitios para los que quieres tu ubicación real lo necesitan apagado; mantenerse al día necesita una pestaña de ur.io abierta |

Salvedades que acompañan a la tabla:

- Dos conmutadores de las apps no tienen equivalente en el navegador, por
  diseño. Aquí no hay **Cifrado poscuántico** (Post Quantum Encryption),
  porque la extensión no tiene sesión cliente-proveedor que sellar; la
  excepción completa está bajo Recopilación de datos, abajo. Y no hay
  conmutador de **Anonimización fuerte** (Strong Anonymization), porque el
  modo directo está forzado a desactivado en el dispositivo proxy alojado en
  el que corre la extensión: a ningún proveedor se le puede entregar jamás
  tu dirección real.
- El kill switch persiste a través de los reinicios del navegador, así que
  una caída te deja bloqueado, no expuesto, hasta que te desconectes o la
  ruta se recupere.

## Cómo funciona

La extensión es Manifest V3 en todos los navegadores, pero la fontanería del
proxy difiere, porque las APIs de los navegadores lo hacen:

- **Chrome y Edge** (y los navegadores de la familia Chromium en general)
  usan la API de ajustes de proxy. La extensión instala un script PAC
  generado, un pequeño archivo de reglas que el navegador consulta para
  decidir adónde va cada petición, que envía el tráfico del navegador a tus
  endpoints proxy de URnetwork aprovisionados. Establecerlo reclama la
  configuración de proxy del navegador, que es también la razón de que dos
  extensiones de proxy no puedan coexistir (ver resolución de problemas).
  Nunca toca los ajustes del sistema operativo y se deshace limpiamente:
  desconectar revierte a directo, desinstalar retira la reclamación.
- **Firefox** no tiene una entrega de ajustes equivalente, así que usa
  `proxy.onRequest`: la extensión es consultada por petición y responde con
  la lista completa de proxies aprovisionados, de modo que un proxy
  inalcanzable no deja tirada la petición. `direct` se añade al final de esa
  lista solo si has desactivado el kill switch; armado, la lista termina en
  el último proxy y una caída total falla.

No hay versión para Safari, porque Safari carece de estas APIs. En los
dispositivos Apple la app lo cubre todo, Safari incluido.

La navegación sale por una pequeña ventana de proveedores a la vez:
dispositivos de miembros cuyos dueños dieron su consentimiento y participan
en el [protocolo UR](https://ur.xyz). "Tu IP de salida" es plural, y la
afinidad por sitio mantiene cada sitio en una salida, así que tu banco ve
una dirección consistente.

El SDK de URnetwork viaja como WebAssembly dentro del paquete de la
extensión. El aprovisionamiento, el listado de ubicaciones y las llamadas a
la API corren todos en local. Nada ejecutable se descarga en tiempo de
ejecución; lo que la tienda revisó es lo que corre.

**La app web es el plano de control de la extensión; son un solo producto.**
Inicia sesión una vez en [ur.io](https://ur.io) y la página y la extensión
hablan por un puente documentado: un protocolo corto de verbos (`SETUP`,
`CONNECT`, `DISCONNECT`, `SET_LOCATION`, kill switch, sincronización de
geolocalización) transportado por `window.postMessage`, el único canal que
funciona igual en Chrome, Edge, Brave y Firefox. `SETUP` entrega la sesión
iniciada directamente, y por eso configurar desde la app nunca te pide un
código de autorización. La división del trabajo es real: la extensión acuña
la sesión de proxy e instala el proxy del navegador, mientras la app
sostiene el dispositivo vivo. Cambiar la ubicación en la app lo reencamina
sin reconexión del navegador, y cada superficie muestra lo que hiciste en la
otra.

**El puente es estrecho a propósito.** Corre solo en las páginas de `ur.io`
y `app.ur.network`; ningún otro sitio puede hablar con la extensión. Otro
script sí se carga en todas las páginas, el del ajuste de geolocalización, y
se queda inerte, con los nativos intactos, salvo que lo actives (abajo).

Iniciar sesión requiere una cuenta, porque el uso se mide por cuenta: un
código por correo o teléfono, una de las opciones de SSO de ur.io, una firma
de cartera o un código de autorización generado en un dispositivo donde ya
tienes sesión. Las vías sin correo aquí son la cartera y el código de
autorización; la Cuenta instantánea sin correo de un toque se crea en las
apps de teléfono y escritorio, y la extensión recoge esa cuenta como
cualquier otra. El plan gratuito es una cuota de datos diaria; Pro, una
mensual grande (5 $/mes o 40 $/año; números vigentes en ur.io/products).

## Semántica del kill switch

Lo que hace: si la conexión del proxy se cae con el kill switch activado, la
extensión bloquea el tráfico del navegador en lugar de dejar que el
navegador recurra en silencio a tu conexión directa y exponga tu dirección
real a mitad de sesión.

- Está **activado por defecto**, la única superficie de URnetwork que sale
  armada de fábrica.
- La aplicación es la propia regla de proxy del navegador: armado, no tiene
  escotilla de "si no, ve directo", así que las peticiones fallan en lugar
  de recurrir. Persiste a través de los reinicios del navegador. Vuelves
  bloqueado, no expuesto.
- Si se dispara, solo se detiene este navegador (las pestañas dan error; el
  popup muestra por qué). El resto de tu ordenador nunca pasó por él.
- Desactivarlo significa fallar en abierto: una conexión caída te revierte a
  la navegación directa, visible en el popup pero silenciosa en tus
  pestañas. Aceptable solo donde una fuga es una molestia, no un daño.
- Límite de alcance: bloquea el tráfico del *navegador*, que es todo lo que
  una extensión puede gobernar; no es un cortafuegos del sistema. Las
  direcciones locales (localhost, impresoras) lo esquivan a propósito, y
  WebRTC (voz/vídeo dentro del navegador) puede abrir conexiones que
  ignoran los ajustes de proxy, un hueco de toda extensión de proxy; los
  navegadores pueden restringirlo.

## Ajuste manual de geolocalización

Dos señales: tu dirección IP ahora dice Ámsterdam, pero la API de
geolocalización del navegador, respondida con señales del sistema como las
Wi-Fi cercanas, sigue informando de dónde está tu cuerpo. Los sitios que
comparan las dos ven la contradicción. El ajuste arregla la segunda señal
para que ambas historias concuerden:

- **Desactivado por defecto.** Nada cambia hasta que lo actives en el popup.
- Activado, responde en `document_start` **en todos los frames**, de modo
  que la API de geolocalización da tu ubicación de salida antes de que
  ningún script de página pueda preguntar, incluso en iframes que intenten
  ganarle la carrera. Las coordenadas son la ciudad de tu proveedor
  conectado más antiguo, y llegan a la extensión por el puente de la app: la
  extensión no sostiene ningún dispositivo propio, así que una pestaña de
  ur.io abierta es lo que mantiene la posición al día.
- Desactivado, no dice nada en absoluto: la página conserva su
  geolocalización nativa y a ningún sitio se le entrega una señal nueva de
  que usas una extensión. Apágalo cuando *quieras* que los sitios vean tu
  ubicación real (mapas, repartos).

## Pings de salud y el estado degradado

Conectada, la extensión descarga un endpoint ligero (`my-ip-info` en la API
de URnetwork) a través del proxy cada cinco minutos, insignificante incluso
frente a la cuota gratuita. Eso demuestra que la ruta funciona de extremo a
extremo, no solo que los ajustes se aplicaron:

- **Dos fallos consecutivos**: el estado pasa a **degradado**. Sigues
  configurado, pero no está confirmado que el tráfico fluya. El popup
  muestra un indicador de inestabilidad.
- **Tres fallos consecutivos**: reconexión automática, con espera creciente
  (2 s doblando hasta 30 s, cinco intentos), reaprovisionando proxies según
  haga falta.
- Un éxito en cualquier punto devuelve el estado de golpe a conectado. Un
  periodo de gracia tras conectar evita el vaivén mientras la primera
  conexión se asienta.

Degradado no es una fuga. Sigues apuntado al proxy, y armado, una ruta
muerta bloquea en lugar de exponer. No es un error que arreglar; es la
extensión avisándote pronto, normalmente de una red inestable entre tú y el
proxy.

## Recopilación de datos: ninguna

- La ficha de Firefox lo declara en el manifiesto, legible por máquina:
  `data_collection_permissions` es **none**. Es una declaración que la
  tienda hace cumplir, no una promesa de página de privacidad.
- La extensión habla solo con la API de URnetwork para aprovisionar tus
  proxies, las mismas llamadas que hace cualquier cliente. Sin analítica,
  sin telemetría, sin recopilación de historial de navegación en ninguna
  parte.
- **Los permisos de host difieren por navegador, por una razón.** En Chrome
  la extensión pide acceso solo a los hosts de la API de URnetwork
  (`api.bringyour.com`, `api-v4.bringyour.com`); la API de proxy basada en
  PAC no necesita ver tus peticiones. En Firefox la extensión necesita
  `<all_urls>`: `proxy.onRequest` consulta a la extensión por cada petición
  que podría enrutar, y Firefox exige acceso de host para que eso funcione.
  El permiso más amplio allí es el coste de la API de proxy de Firefox, no
  un acaparamiento de datos.
- **Ningún tercero ha evaluado la extensión.** La app de Android de
  URnetwork superó una evaluación MASA AL2 de Leviathan Security Group en
  mayo de 2025, la lista de comprobación de seguridad fija de Google para
  apps móviles, y una firma independiente hizo una prueba de penetración de
  la aplicación web y la API ese abril; ninguna cubre la extensión, y
  ninguna auditoría independiente cubre el protocolo ni el código de
  servidor del operador. Lo que esta página ofrece en su lugar es
  falsable: esos permisos son legibles en tu propia copia instalada, nada se
  descarga en tiempo de ejecución y el código es público. Afirmaciones que
  puedes comprobar, no un certificado.

Lo que el servicio conserva: tu cuenta y un registro de recuentos de bytes
por dispositivo (eso son las cuotas y la medición de proveedores), nunca
destinos ni URLs; una dirección de cliente guardada como hash unidireccional
con clave de tu bloque de IP y no la dirección en sí; y una ciudad
aproximada de una consulta geográfica. Los proveedores sacan el tráfico sin
conocer tu dirección real, viendo solo metadatos de grado ISP (nombres de
sitios, nunca páginas ni contraseñas, que siguen selladas con HTTPS); los
sitios web ven solo la salida.

Sé exacto con el medio, eso sí. La red tiene tres modos, y el navegador solo
ocupa siempre uno de ellos:

| Modo | El operador ve | El proveedor ve | Disponible aquí |
|---|---|---|---|
| **Retransmitido estándar** | tu cuenta y conexión de origen, en qué proveedores estás, y los destinos y bytes de paquete del interior | los destinos que saca a internet y un id de dispositivo/contrato, **no** tu IP real | **sí: el único modo del navegador** |
| **Retransmitido sellado** | lo mismo, pero texto cifrado con su tiempo y volumen en lugar de destinos | como arriba | no: la sesión cifrada-hasta-el-proveedor de las apps, activada allí por defecto, no tiene equivalente en el navegador |
| **Directo** | menos intervención en la retransmisión | **tu IP real** y los destinos que saca a internet | no: forzado a desactivado en el dispositivo proxy alojado en el que corre la extensión |

Esa primera fila es la posición del navegador, y el contraste con las apps
es nítido y no suave: ellas sellan la sesión cliente↔proveedor por defecto,
y el navegador no tiene allí sesión que sellar. No puede tenerla. Un
navegador habla su propio protocolo de proxy y no puede ejecutar el motor de
la red, así que tu dispositivo cliente corre en remoto dentro del operador,
que traduce entre los dos protocolos — un sellado iniciado desde ese
dispositivo empezaría en el operador, la parte a la que un sellado existe
para cegar. La implementación cambió el sellado por llegar siquiera al
navegador. La garantía aquí es de almacenamiento y no de cifrado. Cualquier
proxy de navegador entrega cada destino al endpoint que marca, así que el
operador maneja los tuyos en tránsito; lo que respalda eso es una ruta de
datos del proxy que no escribe ningún log, fijada por un test de regresión
en el código abierto, y un registro sin ningún sitio donde poner un destino.
El conmutador **Anonimización fuerte** de las apps está igualmente ausente e
igualmente no hace falta: con el modo directo forzado a desactivado, a
ningún proveedor se le puede entregar jamás tu dirección real.

Para lo que la propia red puede ver y no ver una vez que tu tráfico fluye,
lee [la visión general](/docs/overview). El
[modelo de amenazas](/docs/threat-model) va más lejos y nombra el sellado
ausente de la ruta del navegador como uno de sus propios fallos.

## Resolución de problemas

### "No se pudo aprovisionar ninguna conexión proxy. Revisa tu cuenta." (Failed to provision any proxy connections. Check your account.)

La extensión pidió a la API credenciales de proxy y no se concedió ninguna.
Casi siempre una condición de la cuenta:

1. Confirma que puedes iniciar sesión en [ur.io](https://ur.io) y revisa tu
   plan. Una cuota diaria gratuita agotada es la causa habitual (se renueva
   a diario).
2. Comprueba si el límite de clientes simultáneos de tu plan está agotado
   por otros dispositivos; desconecta uno.
3. Cierra sesión en la extensión y vuelve a entrar para refrescar las
   credenciales.

### "Conexión perdida. Reconéctate." (Connection lost. Please reconnect.)

Las comprobaciones de salud fallaron repetidamente y la reconexión
automática agotó los intentos. Tu red subyacente probablemente cambió
(cambio de red, portátil dormido, Wi-Fi hostil). Reconéctate desde el popup;
si se repite en una red concreta, esa red puede estar bloqueando los puertos
del proxy.

### Otra extensión pelea por el proxy

Solo una extensión puede controlar los ajustes de proxy del navegador a la
vez (en Chrome, gana la instalada más recientemente). Ejecuta otra extensión
de VPN o proxy y se intercambian el ajuste una y otra vez, pareciendo rotas
las dos. El popup lo dice cuando pierde el control, y `chrome://settings`
nombra al titular actual; desactiva la otra. En Firefox, busca otros
complementos instalados con permiso de proxy.

### Portales cautivos

La Wi-Fi de hoteles y aeropuertos necesita que inicies sesión en una página
portal *antes* de que internet funcione, y con el proxy arriba
(especialmente armado), el portal no puede cargar. No puedes quedarte
atascado: desconectar es local y no necesita red. Desconecta la extensión,
completa el inicio de sesión del portal y reconecta. Inherente a todo proxy
y VPN, no un fallo de la extensión.

### Leer el estado

El indicador de estado del popup es el diagnóstico más rápido:

- **Inactivo (Idle)**: sesión iniciada, sin conectar. La navegación es
  directa.
- **Conectando (Connecting)** (indicador giratorio): aprovisionando proxies
  y aplicando ajustes.
- **Conectado (Connected)**: configurado y con comprobación de salud
  reciente.
- **Degradado (Degraded)** (icono de inestabilidad): configurado, pero los
  pings de salud están fallando; espera una reconexión si persiste.
- **Reconectando (Reconnecting)**: recuperación automática en curso; déjalo
  estar.
- **Error**: uno de los mensajes de arriba, con el arreglo listado aquí.

## Adónde ir ahora

- [Primeros pasos en el navegador](/docs/getting-started-browser): enlaces
  de las tiendas, inicio de sesión y primera conexión, incluida la nota
  sobre las ventanas privadas.
- [Cómo funciona URnetwork](/docs/overview): la red detrás del popup y de
  dónde salen los proveedores.
- [Preguntas frecuentes](/docs/faq): planes, cuotas y dudas de cuenta.
