wiki: documentacion de la rama, con aviso de que no es Oasis oficial

Siete paginas: portada, Karvan, llamadas, interfaz, como compilar la APK, que NO
tiene y hoja de ruta. Con capturas propias tomadas de esta build a 412x915.

El aviso de rama experimental va arriba de la portada y repetido en la cabecera de
cada pagina, porque la gente entra por enlaces directos y no siempre por el indice.
Con enlace al repositorio oficial de epsylon y la indicacion de que los fallos de
esta rama se reportan aqui, no a el.

La pagina de limitaciones dice lo que falla sin adornos: que en movil no se eliminan
los metadatos EXIF de las fotos —con la ubicacion dentro—, que el DNS va a Google y
Cloudflare, que la contrasena de la copia de seguridad viaja en la URL, y que el
envoltorio de Android compila pero todavia no se ha probado en un movil.
SITO 2026-08-19 00:39:28 +02:00
parent f8655012cc
commit fba0337178
14 changed files with 511 additions and 1 deletions

87
Compilar.md Normal file

@ -0,0 +1,87 @@
# Compilar la APK
> ⚠ Rama experimental, no oficial. El Oasis oficial es
> https://github.com/epsylon/oasis · [Volver a la portada](Home)
La APK se construye con un **proyecto Gradle propio**, en `android/`. Ya no se parte
del APK oficial como molde.
## Qué se reutiliza y qué es nuevo
Tres bibliotecas nativas se toman tal cual del APK existente:
| Fichero | Qué es |
|---|---|
| `libnode.so` | **nodejs-mobile v18.20.4 oficial** (OpenSSL 3.0.13+quic). Artefacto público: no hay que compilar Node |
| `libnative-lib.so` | 6,8 KB. Un solo símbolo JNI que arranca Node |
| `libc++_shared.so` | Runtime de C++ |
Por eso el `namespace` del módulo es `com.solarnethub.oasis`: JNI resuelve por nombre
y la clase puente tiene que vivir en ese paquete. El identificador de la aplicación sí
es propio, `net.laenre.oasis`, y por eso se instala junto a la oficial.
**No hace falta el NDK.**
## Pasos
```sh
# 1. bibliotecas nativas y empaquetado del backend
cd android
./scripts/prepare.sh ../../oasis_mobile # o la ruta de un APK
# 2. compilar
./gradlew assembleDebug # o assembleRelease para firmar
```
### De dónde sale `node_modules`
Esto no es obvio y es donde se atasca cualquiera que lo intente.
El `node_modules` del móvil **no es el que produce un `npm install` normal**: son unos
137 MB podados y **sin un solo binario nativo**, frente a 1,4 GB con 35 binarios de
una instalación de escritorio. Por eso el arranque fuerza criptografía en JavaScript
puro.
`prepare.sh` lo saca del APK base y sustituye solo el código. Es seguro porque las 98
dependencias son idénticas entre versiones.
Si algún día lo rellenas con un `npm install` normal, la APK se llevará binarios de
Linux de escritorio que en Android no sirven, y pesará diez veces más.
## Firmar
La contraseña **nunca** en el repositorio ni en `gradle.properties`:
```sh
export OASIS_KEYSTORE=/ruta/oasis-alfa-key.jks
export OASIS_KEYSTORE_PASS=...
export OASIS_KEY_ALIAS=oasis
./gradlew assembleRelease
```
Y comprobar siempre antes de publicar:
```sh
apksigner verify --print-certs app-release.apk
unzip -l app-release.apk | grep nodejs-project.zip # debe pesar más de 20 MB
aapt dump permissions app-release.apk | grep -E "CAMERA|RECORD_AUDIO"
```
La segunda línea importa: si el backend no se empaquetó bien, la APK compila,
instala y arranca **sin Oasis dentro**.
## Requisitos
JDK 17 o superior **con compilador**. Ojo: el OpenJDK de algunas distribuciones es
solo runtime y no trae `javac`; el proyecto apunta al JDK que trae Android Studio.
## Mejoras del envoltorio propio
- `targetSdk 35`.
- Tráfico sin cifrar permitido **solo hacia el propio dispositivo**, en vez de
permitido en general.
- Copia de seguridad de Android **desactivada**: `adb backup` ya no puede sacar tu
identidad de SSB.
- El backend corre como servicio en primer plano, así que **sobrevive en segundo
plano**. Antes se declaraba el permiso pero no había servicio, y el backend moría al
salir de la app.

72
Home.md

@ -1 +1,71 @@
prueba
# Oasis Mobile — rama de desarrollo experimental
> # ⚠ ESTO NO ES OASIS OFICIAL
>
> Esta wiki documenta una **rama de desarrollo experimental** mantenida por el
> hacklab, **sin afiliación** con el proyecto original.
>
> ## El Oasis oficial es el de epsylon: https://github.com/epsylon/oasis
>
> Si quieres **usar Oasis de verdad, instala el oficial**. Lo que se documenta aquí
> puede romperse, cambiar de forma incompatible o desaparecer sin aviso. No está
> auditado y no tiene garantía de ninguna clase.
>
> **Los fallos de esta rama se reportan aquí, nunca a epsylon.**
Versión base: **Oasis 0.9.5**. Rama: `PRUEBAS`.
---
## Qué es esto
Una rama que sigue de cerca las versiones de epsylon y añade dos cosas: una interfaz
pensada para el móvil y un módulo de **salas efímeras con llamadas**.
| | |
|---|---|
| **[Karvan](Karvan)** | Salas que viven solo en memoria y se autodestruyen |
| **[Llamadas](Llamadas)** | Audio y vídeo sobre WebRTC, sin servidores de terceros |
| **[La interfaz](Interfaz)** | Hexágonos, barra de accesos rápidos y por qué son así |
| **[Compilar la APK](Compilar)** | Cómo se construye, de dónde sale cada pieza |
| **[Estado y hoja de ruta](Roadmap)** | Qué funciona, qué no, y qué está bloqueado |
| **[Qué NO tiene](Limitaciones)** | Lo que falta respecto al oficial, sin adornos |
---
## La interfaz
![La pantalla principal](img/01-home-hexagonos.png)
La navegación es una rejilla de hexágonos por categorías, con una barra de accesos
rápidos abajo que el usuario configura, y arriba los filtros Personal y Community.
---
## Cómo se instala
La APK **no está en ninguna tienda**. Se descarga de las *releases* de este
repositorio y se instala a mano, con "orígenes desconocidos" activado.
Se instala **junto al Oasis oficial** sin pisarlo: el identificador de aplicación es
`net.laenre.oasis`, distinto del oficial. Puedes tener los dos y comparar.
> **Verifica siempre la huella de la firma** antes de instalar una APK descargada de
> un servidor propio. La huella de cada versión se publica en su release.
---
## Aviso sobre privacidad
Esta rama **no elimina los metadatos EXIF** de las imágenes que subes desde el móvil,
**incluida la ubicación GPS** si la cámara la guarda. El limpiador de metadatos del
código depende de una biblioteca que no se empaqueta en Android.
Hasta que se resuelva: **quita la ubicación de las fotos antes de subirlas**, o
desactiva el guardado de ubicación en la cámara. Ver [Limitaciones](Limitaciones).
---
## Licencia
AGPL-3.0, la misma que el proyecto original.

61
Interfaz.md Normal file

@ -0,0 +1,61 @@
# La interfaz
> ⚠ Rama experimental, no oficial. El Oasis oficial es
> https://github.com/epsylon/oasis · [Volver a la portada](Home)
Es la diferencia más visible con el Oasis oficial. Está pensada para el pulgar, no
para el ratón.
## La pantalla principal
![Pantalla principal](img/01-home-hexagonos.png)
Tres piezas:
- **Arriba**: logo, los filtros **Personal** y **Community**, y tu avatar.
- **En medio**: la rejilla de **hexágonos**, diez categorías que se despliegan al
tocarlas. Las categorías son puro CSS: funcionan sin JavaScript.
- **Abajo**: la **barra de accesos rápidos**, configurable.
## Los filtros Personal y Community
![Filtro Personal](img/06-filtro-personal.png)
Parten las diez categorías en dos mitades de cinco, para no tener que buscar entre
todas. Sin filtro se ven las diez.
## La barra de accesos rápidos
![Personalizar la barra](img/04-barra-personalizar.png)
Cuatro atajos que eliges tú, más un par fijo a la derecha. Se configuran con el lápiz.
## Módulos
![Módulos](img/05-modulos.png)
Cada módulo se enciende y se apaga por separado, igual que en el Oasis oficial.
## Por qué la interfaz vive aparte
Todo esto está en ficheros propios (`src/views/fork/hive_nav.js`) en vez de dentro de
los ficheros del proyecto original. No es manía: **epsylon publica una versión cada
dos a cuatro días** y reescribe a fondo justo los ficheros donde antes vivía esta
interfaz.
Con la separación, sobre los ficheros de upstream solo quedan **enganches de una
línea**, y una versión nueva se integra sin arrastrar nada. Antes eran unas 90
divergencias; ahora `backend.js` diverge en unas 30 líneas y `main_views.js` en unas
40, casi todas enganches.
Es lo que permite ir al día sin perder la interfaz por el camino.
## Sin JavaScript en la navegación
Se mantiene el criterio del proyecto original: la navegación no usa JavaScript. Los
desplegables son CSS, los filtros son formularios y los cambios de estado son envíos
con recarga.
La única excepción son las **llamadas**, que no pueden existir sin JavaScript. Van en
un fichero aparte servido desde el propio Oasis, del mismo modo que el visor de PDF
que el proyecto oficial ya incluye — y **solo se carga en la página de una sala**.

69
Karvan.md Normal file

@ -0,0 +1,69 @@
# Karvan — salas efímeras
> ⚠ Rama experimental, no oficial. El Oasis oficial es
> https://github.com/epsylon/oasis · [Volver a la portada](Home)
Salas de chat que **viven solo en memoria** y se destruyen solas. Nada se escribe en
disco ni en el registro de SSB.
![Lista de salas](img/03-lista-salas.png)
## Cómo funciona
Al crear una sala eliges cuánto vive. A partir de ahí:
- **Se autodestruye por inactividad** (30 minutos por defecto) y **por tiempo
absoluto** (2 horas), lo que ocurra antes. El plazo absoluto no se renueva con la
actividad: la sala muere igual.
- Al vencer, **se borra todo**: mensajes, señales y la lista de miembros.
- Si reinicias Oasis, las salas desaparecen. Es lo correcto: solo existían en memoria.
## Quién puede entrar
**Quien tenga el enlace.** El identificador de la sala son 72 bits al azar y es la
única credencial que existe. No hay lista de miembros ni permisos.
Esto es deliberado —así una sala se comparte pegando un enlace— pero conviene tenerlo
claro: **cualquiera con el enlace entra**, y quien esté dentro puede pasárselo a otro.
Para invitar a un contacto sin pegar el enlace en ningún sitio, el botón de invitación
le manda un **mensaje privado de SSB** con el enlace dentro.
## Límites
Existen para que una sala no pueda tumbar el nodo:
| | |
|---|---|
| Mensajes que se conservan | 250 (los más recientes) |
| Salas a la vez | 100 |
| Miembros por sala | 50 |
| Tamaño de señalización | 16 KiB |
| Texto por mensaje | 2000 caracteres |
## Funciona sin JavaScript
El chat es utilizable **con JavaScript desactivado**: escribir manda un formulario y
la página se recarga sola cada diez segundos para traer los mensajes nuevos.
Con JavaScript activado se añade un canal directo entre navegadores, y entonces los
mensajes llegan al instante sin pasar por el servidor.
## Qué protege y qué no
**Protege**: los mensajes no tocan el disco, no entran en tu registro de SSB y
desaparecen solos. No queda rastro que replicar ni que incautar después.
**No protege**:
- El **servidor ve los mensajes** que pasan por él. Solo el canal directo entre
navegadores queda fuera de su alcance.
- Mientras la sala existe, sus **metadatos existen** en memoria: quién está dentro,
cuándo se creó.
- El **relay entre dispositivos** sí publica mensajes privados de SSB, que **son
permanentes**. Es lo que permite que una sala funcione entre tu móvil y tu
ordenador, pero conviene saberlo: eso ya no es efímero.
- Quien tenga el enlace entra, como se explica arriba.
Karvan sirve para conversaciones que no quieres conservar. **No es una herramienta
contra un adversario que ya controla tu dispositivo o el servidor.**

69
Limitaciones.md Normal file

@ -0,0 +1,69 @@
# Qué NO tiene, y qué falla
> ⚠ Rama experimental, no oficial. El Oasis oficial es
> https://github.com/epsylon/oasis · [Volver a la portada](Home)
Esta página existe porque una rama experimental honesta dice lo que falla. Si buscas
la lista de virtudes, está en la [portada](Home).
## Los metadatos EXIF no se eliminan en el móvil
**El más importante.** Al subir una foto desde Android, **sus metadatos viajan
intactos, incluida la ubicación GPS** si la cámara la guardó.
El código tiene un limpiador de metadatos, pero depende de una biblioteca con
componentes nativos que **no se empaqueta en Android** (el paquete móvil no lleva
ningún binario nativo, a propósito). El limpiador comprueba si está disponible y, si
no, **devuelve la imagen sin tocar**.
Mientras no se resuelva: **quita la ubicación de las fotos antes de subirlas**, o
desactiva el guardado de ubicación en tu cámara.
## Consultas de DNS a Google y Cloudflare
El arranque del backend en Android fija los servidores DNS a `8.8.8.8`, `1.1.1.1` y
`8.8.4.4`. Cada resolución de nombre pasa por Google o Cloudflare, y en redes que
filtren DNS externo puede directamente no funcionar.
## Módulos que no están
- **Inteligencia artificial**: fuera. El modelo son unos 4 GB.
- **housing**: portado pero apagado.
- **Descubrimiento en red local**: desactivado en el móvil.
## Traducciones incompletas
De las claves propias de la rama, **solo el castellano está completo**. Los otros diez
idiomas caen al inglés. No se han traducido a máquina a propósito: una traducción sin
alguien que la revise da una falsa sensación de cobertura.
## Cosas que aún no se han probado en un dispositivo real
El envoltorio propio de Android **compila y genera una APK correcta**, con los
permisos y el método que faltaba. Pero **no se ha probado todavía en un móvil
físico**: que arranque el backend, que la interfaz cargue y que la cámara funcione al
pulsar Llamar.
Hasta que eso esté comprobado, trátalo como lo que es: código que compila.
## Subir ficheros desde el navegador interno
El envoltorio propio **todavía no implementa el diálogo de selección de ficheros** del
navegador interno. Los botones de subir imagen o documento pueden no abrir nada.
Es hermano del problema de los permisos de cámara, y se arregla igual.
## La contraseña de la copia de seguridad viaja en la dirección
La exportación de identidad se hace con una petición que **lleva la contraseña en la
URL**, con lo que acaba en el historial del navegador y en los registros. Está
pendiente de volver a enviarse en el cuerpo de la petición.
## Un participante por nodo en las llamadas
Dos pestañas del mismo Oasis comparten identidad y no se enlazan entre sí.
## Y lo que se descartó a propósito
- **Subtemas en el foro**: la rama tenía un intento a medias que además rompía los
hilos. Se quitó. El proyecto oficial ya tiene subtemas de primera clase.
- **Selector de chats propio**: el oficial trae uno mejor. Se adoptó el suyo.

102
Llamadas.md Normal file

@ -0,0 +1,102 @@
# Llamadas de audio y vídeo
> ⚠ Rama experimental, no oficial. El Oasis oficial es
> https://github.com/epsylon/oasis · [Volver a la portada](Home)
Dentro de una sala de [Karvan](Karvan) hay un botón de llamada. El audio y el vídeo
van **directamente entre los participantes** por WebRTC, cifrados de extremo a extremo
por el propio protocolo.
## Los permisos se piden al llamar, no al instalar
La app **declara** los permisos de cámara y micrófono porque Android obliga a que la
lista sea fija y se decida al compilar. Pero **no se conceden al instalar**: son
permisos peligrosos y el sistema los pide **la primera vez que pulsas Llamar**.
Si nunca llamas, no se te pide nada y la aplicación no accede a la cámara ni al
micrófono.
Esto no era posible con la APK anterior: el envoltorio de Android que se venía usando
no implementaba el método que concede permisos al contenido web, así que el navegador
interno **denegaba siempre** el acceso por mucho que se declararan los permisos.
## Sin servidores de terceros
Casi todas las aplicaciones con WebRTC traen configurado un servidor STUN público,
normalmente de Google. **Aquí no hay ninguno.**
El motivo: un servidor STUN aprende **la IP pública y el momento exacto de cada
consulta**. Con la configuración habitual, cada llamada le estaría diciendo a Google
que ese usuario está llamando ahora. En un proyecto con esta postura sobre la
privacidad, no se sostiene.
Por defecto solo se usan **candidatos host**: funciona en la misma red local y con
routers domésticos amables. Se prefiere degradar a nada antes que a un tercero.
## Si necesitas atravesar NAT
Con datos móviles o detrás de CGNAT hará falta un servidor TURN. La configuración va
en `oasis-config.json`:
```json
"rtc": {
"stun": ["stun:tu.pub:3478"],
"turn": {
"urls": ["turn:tu.pub:3478"],
"secret": "<el static-auth-secret de tu coturn>",
"ttlSec": 3600
},
"relayOnly": false
}
```
Con `secret` se generan credenciales que **caducan solas** (mecanismo REST de coturn):
no hay usuarios que dar de alta y una credencial filtrada vale una hora.
Con `relayOnly: true` **toda** la media pasa por el TURN, de modo que ningún
participante ve la dirección IP del otro. Cuesta ancho de banda del servidor, pero es
lo que hay que activar si los participantes no deberían conocer sus IPs.
### Si montas el TURN, endurécelo
Un TURN mal configurado es un **relay abierto** hacia la red interna del servidor.
Como mínimo, en `turnserver.conf`:
```
use-auth-secret
static-auth-secret=<32 bytes aleatorios, fichero con permisos 600>
realm=<tu dominio>
fingerprint
no-loopback-peers
no-multicast-peers
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=172.16.0.0-172.31.255.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=<LA IP PÚBLICA DEL PROPIO SERVIDOR>
user-quota=12
total-quota=1200
max-bps=1500000
```
La última línea de `denied-peer-ip` es la que casi todo el mundo olvida:
`no-loopback-peers` impide llegar a `127.0.0.1`, **pero no impide que alguien pida un
relay hacia la IP pública de tu propia máquina** y alcance así tu puerto de SSB o tu
servidor web. Sin esa línea, tu TURN es una puerta a tus propios servicios.
Compruébalo con `turnutils_uclient` contra una IP privada y contra la IP pública del
servidor: **las dos deben fallar**.
## Limitaciones honestas
- **Un participante = un nodo.** Dos pestañas del mismo Oasis comparten identidad y no
se enlazan entre sí. Para probar de verdad hacen falta dos nodos distintos.
- **Sin TURN, con datos móviles casi nunca conectará.** El CGNAT de los operadores lo
impide.
- La señalización pasa por el servidor de la sala: un servidor comprometido podría
colocarse en medio. La media va cifrada extremo a extremo, pero **quien controla la
señalización controla con quién crees que hablas**.

52
Roadmap.md Normal file

@ -0,0 +1,52 @@
# Estado y hoja de ruta
> ⚠ Rama experimental, no oficial. El Oasis oficial es
> https://github.com/epsylon/oasis · [Volver a la portada](Home)
Sin fechas: esto se hace cuando se puede.
## Hecho
- **Al día con Oasis 0.9.5**, con los módulos nuevos del proyecto oficial (encuestas,
blogs, coincidencias, menciones) integrados y accesibles desde los hexágonos.
- **El código propio, separado** de los ficheros de upstream, que es lo que permite
seguir el ritmo de versiones sin perder la interfaz.
- **[Karvan](Karvan)**: salas efímeras con autodestrucción, funcionando sin JavaScript.
- **[Envoltorio Android propio](Compilar)**: resuelve el bloqueo que impedía las
videollamadas, y de paso mejora la seguridad del empaquetado.
- **Fuera el STUN de Google**, con configuración para TURN propio.
- **Traducción al castellano** de todo el módulo de salas, que antes salía en inglés.
## En curso
- Probar el envoltorio en un móvil real. Es lo único que separa a las videollamadas de
funcionar de verdad.
- Poner en marcha un TURN en un pub para las llamadas fuera de la red local.
## Sin empezar
- **Varias identidades en el mismo dispositivo**, con cambio desde la interfaz.
El diseño está: el obstáculo real no es técnico sino de seguridad — hay que impedir
que dos dispositivos publiquen con la misma identidad, porque eso **parte el registro
y la mata para siempre**.
- **Automatizar la construcción**: que una versión nueva del proyecto oficial genere
la APK firmada y publicada sola.
- **Limpiar los metadatos EXIF** en el móvil (ver [Limitaciones](Limitaciones)).
- **Diálogo de selección de ficheros** en el navegador interno.
## Bloqueado, y por qué
- **Play Store**: exige un formato de paquete que solo se puede generar desde el
proyecto Gradle. Ahora que existe, deja de estar bloqueado, pero sigue haciendo
falta una cuenta de desarrollador de pago.
- **Criptografía post-cuántica de karvan-protocol**: su componente nativo no compila
para Android. Haría falta una versión portable.
## Descartado
- **Subtemas propios en el foro**: nunca llegaron a funcionar, rompían los hilos y
habrían metido un campo que ningún otro cliente de la red entiende, permanente en el
registro. El proyecto oficial ya resuelve eso mejor.
- **Congelar las dependencias de SSB**: no aporta —ya viajan dentro del paquete— y
rompería la posibilidad de seguir las versiones del proyecto oficial, que es lo que
sostiene esta rama.

BIN
img/01-home-hexagonos.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
img/03-lista-salas.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
img/05-modulos.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
img/06-filtro-personal.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

BIN
img/07-chats.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
img/08-perfil.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB