The HydraVeil core library exposes core logic to higher-level components. https://simplifiedprivacy.com
Find a file
2026-07-09 09:44:08 -05:00
assets/yaml_mappings Big Transition: Location & Operator turned into SQLAlchemy models. This forces a change across baseprofile, Locationcontroller, and even GUIs type handling 2026-06-27 17:10:28 -04:00
core feat(core): branch vless/hysteria2 immediately in ProfileController.enable() 2026-07-09 09:44:08 -05:00
.gitignore refactor: align cli with core architecture 2026-07-08 11:14:41 -05:00
LICENSE.txt Add LICENSE.txt 2025-02-24 23:23:05 +01:00
pyproject.toml Extract establish_encrypted_proxy_connection to core — shared logic for CLI and GUI 2026-07-07 16:08:24 -05:00
README.md June Major Update 2026-06-16 08:11:28 -05:00

Hydra-Veil — June Major Update

Expanded Killswitch

hydraveil-killswitch.sh was added to the installer: a wrapper around nftables that blocks all traffic not routed through the tunnel. It defaults to tun0, but supports a configurable interface IP that the operator will send when creating the profile. The IP is currently hardcoded; it will be removed in the next commit.

One Connection at a Time

First in, first out. When a new connection is established, the previous one receives a signal (SIGUSR1) and closes cleanly before the new one takes over.

Unexpected Shutdowns

If the terminal is closed or the machine is powered off, the process receives SIGHUP and performs a full disconnect: stops sing-box, clears state, and releases the network. No orphan processes.

Fewer Network Requests

Unnecessary calls made when establishing and closing connections have been removed.


Repositories

Repo Role
core Business logic, controllers, models
cli Command-line interface
essentials Network modules (Tor, WireGuard, proxies)
installer Installation scripts and killswitch


Hydra-Veil — Gran Actualización de Junio

Killswitch ampliado

Se añadió hydraveil-killswitch.sh al installer: un wrapper sobre nftables que bloquea todo el tráfico que no pase por el túnel. Por defecto usa tun0, pero soporta una IP de interfaz configurable que el operador enviará al crear el perfil. Por ahora la IP está hardcodeada; se eliminará en el próximo commit.

Una conexión a la vez

Primero en entrar, primero en salir. Cuando se establece una nueva conexión, la anterior recibe una señal (SIGUSR1) y se cierra limpiamente antes de que la nueva tome el control.

Cierres inesperados

Si se cierra la terminal o se apaga el equipo, el proceso recibe SIGHUP y ejecuta la desconexión completa: para sing-box, limpia el estado y libera la red. Sin procesos huérfanos.

Menos solicitudes de red

Se eliminaron llamadas innecesarias que se hacían al establecer y cerrar conexiones.


Repositorios

Repo Rol
core Lógica de negocio, controladores, modelos
cli Interfaz de línea de comandos
essentials Módulos de red (Tor, WireGuard, proxies)
installer Scripts de instalación y killswitch


Uso rápido — Desde Core (innecesario, usar CLI)

1. Create billing code / Crear billing code

python3 -c "
from core.services.WebServiceApiService import WebServiceApiService
subscription = WebServiceApiService.post_subscription(2, operator_id=<OPERATOR_ID>)
print('billing code:', subscription.billing_code)
"

Copy the printed billing_code — you'll need it in the connect step.
Copiá el billing_code impreso, lo vas a necesitar en el paso de conexión.


consultar estado de invoive python3 -c " from core.services.WebServiceApiService import WebServiceApiService

invoice = WebServiceApiService.get_invoice('BILLING_CODE_HERE') print('status:', invoice.status) "

2. Patch subscription / Parchear suscripción

sudo docker compose exec laravel php artisan tinker --execute="
\$sub = \App\Models\Subscription::orderBy('id', 'desc')->first();
\$sub->expires_at = '2027-12-31 23:59:59';
\$sub->duration = 720;
\$sub->payment_reference = 'bypass_' . uniqid();
\$sub->save();
echo 'OK' . PHP_EOL;
"

3. Connect / Conectar

VLESS

python3 -c "
from core.services.WebServiceApiService import WebServiceApiService
from core.controllers.encrypted_proxy.VlessController import VlessController
from core.observers.EncryptedProxyObserver import EncryptedProxyObserver

observer = EncryptedProxyObserver()
observer.subscribe('connected',    lambda e: print('connected:', e.subject))
observer.subscribe('error',        lambda e: print('error:', e.subject))
observer.subscribe('disconnected', lambda e: print('disconnected:', e.subject))

session = WebServiceApiService.post_operator_proxy('MZKD-QWWI-1TS9-KHMD', 3, 'vless')
print('session:', session)

controller = VlessController(1080)
controller.enable(session.links[0], session.username, observer)
"

Hysteria2

python3 -c "
from core.services.WebServiceApiService import WebServiceApiService
from core.controllers.encrypted_proxy.HysteriaController import HysteriaController
from core.observers.EncryptedProxyObserver import EncryptedProxyObserver

observer = EncryptedProxyObserver()
observer.subscribe('connected',    lambda e: print('connected:', e.subject))
observer.subscribe('error',        lambda e: print('error:', e.subject))
observer.subscribe('disconnected', lambda e: print('disconnected:', e.subject))

session = WebServiceApiService.post_operator_proxy('MZKD-QWWI-1TS9-KHMD', 3, 'hysteria2')
print('session:', session)

controller = HysteriaController(1080)
controller.enable(session.username, session.password, session.operator_hysteria2_host, observer)
"

4. Disconnect / Desconectar

python3 -c "
from core.controllers.encrypted_proxy.HysteriaController import HysteriaController
from core.observers.EncryptedProxyObserver import EncryptedProxyObserver

observer = EncryptedProxyObserver()
observer.subscribe('disconnected', lambda e: print('disconnected'))

controller = HysteriaController(1080)
controller.disable(observer)
"

sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf