Favio Brañez

Disponible para prácticas y freelance

Sistemas quese defienden.

Soy Favio Brañez, estudiante de Ingeniería de Sistemas en la UNAC. Diseño bases de datos, programo en Python y voy camino a full-stack, con la mira puesta en la ciberseguridad.

proyectos 4 filas · toca una para ver cómo funciona

  1. 01Cyber-ReinosoPunto de venta y sesiones para cabinas de internet.Python · SQL ServerDemo web
  2. 02SIGTACTriaje y camas para emergencias de hospital.Python · MySQLEn desarrollo
  3. 03Login SystemRegistro y sesiones con CSRF, hashes y tokens de un solo uso.PHP · MySQLCódigo abierto
  4. 04CV GeneratorEditor de CV con vista previa, puntaje y PDF para ATS.JavaScript · node:testPublicado

Primero el cliente, después el código

Antes de programar trabajé cuatro años en una bodega: clientes, inventario y ventas en la computadora. Ahí entendí que un buen sistema le ahorra horas a alguien de verdad.

Entré a Ingeniería de Sistemas en la UNAC en 2025 y lo que más me atrapó fueron las bases de datos: que cada dato tenga su lugar y que las reglas lo mantengan ordenado. Ahora sumo la web para construir de punta a punta, como desarrollador full-stack.

Un sistema que guarda datos de personas reales tiene que saber negarse. Por eso estudio ciberseguridad y ya la aplico: en Cyber-Reinoso nadie cambia un saldo sin pasar por las reglas, y SIGTAC no clasifica a un paciente con datos incompletos.

UNAC · IV cicloUniversidad
Lima, PerúCiudad
B1 · TOEFL ITPInglés

Mi stack, en el mismo orden

Guardar

  • SQL Server
  • T-SQL
  • MySQL
  • PostgreSQL
  • SQLite
  • Modelado relacional
  • Normalización

Mi parte favorita: diseñar tablas que no se contradicen.

Decidir

  • Python
  • POO
  • Patrón DAO
  • Patrón Strategy
  • Java
  • C++
  • PHP

Python a diario, PHP en mis sistemas web, Java y C++ en la universidad.

Mostrar

  • JavaScript
  • React
  • Tailwind
  • Bootstrap
  • HTML
  • CSS
  • Tkinter

Webs publicadas en JavaScript puro y en React, y las pantallas de escritorio de mis sistemas.

Aprendiendo

  • Node.js
  • Ciberseguridad

Unir todo en la web, y que sea seguro.

Herramientas

  • Git
  • GitHub
  • Docker
  • Linux
  • Ubuntu Server
  • Windows
  • Vercel

Linux es mi sistema de todos los días.

Proyectos

Cyber-Reinoso

Punto de venta, inventario y sesiones para cabinas de internet.

En desarrollo · escritorio, con demo web en React

La decisión: el saldo del gamer es privado. Se puede leer desde fuera, pero ninguna pantalla puede cambiarlo directamente: solo la clase, con sus reglas.

  • Python
  • SQL Server
  • T-SQL
  • Tkinter
  • POO
self.__saldo_billetera = float(saldo_billetera)

@property
def saldo_billetera(self):
    return self.__saldo_billetera

>>>

Acceso denegadoAttributeError: property 'saldo_billetera' of 'Usuario' object has no setter
modelos.py · Cyber-Reinoso · solo la clase puede mover el saldo

Cobrar una sesión

flamed4rk, rango Oro, juega 90 minutos en una PC eSports. La tarifa sale de la base, Python aplica su descuento y la caja descuenta el saldo.

Guardar

SQL Server

dbo.CategoriasEstacion

categoriatarifa_hora
Regular2.00
eSports3.00
Streaming VIP5.00

dbo.RangosCuenta

rangodescuento
Plata0.05
Oro0.10

Tarifas y descuentos viven en tablas: cambiar un precio no toca el código.

Decidir

Python
# polimorfismo: cada tipo de PC cobra a su tarifa
costo_base = self.estacion.calcular_tarifa(
    minutos_consumidos)

descuento = costo_base * self.usuario.porcentaje_descuento
monto_a_cobrar = costo_base - descuento
if monto_a_cobrar > self.usuario.saldo_billetera:
    self.monto_cobrado = self.usuario.descontar_saldo_hasta_cero(...)
else:
    self.usuario.descontar_saldo(monto_a_cobrar)

Si el saldo no alcanza, se cobra hasta cero en vez de dejarlo negativo.

Mostrar

Caja
F
flamed4rkPC-005 · eSports
Tiempo90 min
TarifaS/ 4.50
Descuento Oro− S/ 0.45
CobradoS/ 4.05
Saldo restanteS/ 35.95

La PC vuelve a quedar disponible para el siguiente cliente.

Ejemplo calculado con los datos semilla del repositorio y el método finalizar_sesion.

SIGTAC

Triaje y asignación de camas para emergencias de hospital.

En desarrollo · escritorio

La decisión: si falta un signo vital, el sistema se niega a clasificar al paciente. Un dato que no se midió nunca se asume como normal.

  • Python
  • MySQL
  • PostgreSQL
  • SQLite
  • Patrón Strategy
  • Patrón DAO
def _exigir_signos(signos_vitales, *claves):
    faltantes = [c for c in claves
                 if signos_vitales.get(c) is None]
    if faltantes:
        raise SignosVitalesIncompletosError(...)

>>>

Clasificación bloqueadaSignosVitalesIncompletosError: No se puede clasificar: faltan los signos vitales sato2.
estrategias.py · SIGTAC · un dato no medido nunca se asume normal

Clasificar a un paciente

Llega un paciente con dolor torácico. SIGTAC exige sus signos vitales, aplica la regla Manchester y propone un nivel de triaje con su justificación.

Medir

Signos vitales

signos_vitales · dict

clavevalor
sato288
pa_sis110
fc104

sintomas

sintomapeso_clinico
Dolor torácico8.5

Cada síntoma trae un peso clínico; los signos que falten bloquean la clasificación.

Decidir

Python · Strategy
peso_total = sum(s.peso_clinico for s in sintomas)
self._exigir_signos(signos_vitales, 'sato2', 'pa_sis')

if peso_total >= 10 or sato2 < 90 or pa_sis < 80:
    return 1  # Nivel I (Rojo)elif peso_total >= 7 or pa_sis > 180:
    return 2  # Nivel II (Naranja)
elif peso_total >= 4:
    return 3  # Nivel III (Amarillo)

El síntoma solo daría Nivel II; la saturación baja lo sube a Nivel I. Con la regla MINSA, otra estrategia, el mismo paciente se evalúa distinto.

Mostrar

Interfaz
P
Paciente de pruebaEmergencia · Triaje
Nivel I · RojoManchester
SatO288 %
Peso clínico8.5

Clasificación sugerida aplicando las guías del Emergency Triage: Manchester Triage System.

La pantalla muestra el nivel y la norma en la que se basó.

Paciente ficticio. Lógica real de las clases ReglaManchester y EstrategiaTriaje.

Login System

Registro e inicio de sesión con verificación por correo y recuperación de contraseña.

Código abierto · web en PHP

La decisión: los enlaces de verificación y recuperación nunca se guardan en claro. La base solo tiene su hash SHA-256, caducan y sirven una sola vez.

  • PHP
  • MySQL
  • PostgreSQL
  • SQLite
  • PDO
  • CSRF
  • password_hash
function verify_csrf(): bool
{
    $sent = $_POST['csrf_token'] ?? '';
    return is_string($sent)
        && hash_equals(csrf_token(), $sent);
}

$

Petición rechazadaLa sesión del formulario expiró. Intenta nuevamente.
functions.php · login-system · un formulario sin su token no entra

Iniciar sesión

Un usuario entra con su contraseña. La base nunca la tuvo en claro: PHP la compara contra el hash, revisa que el correo esté confirmado y le da una sesión nueva.

Guardar

MySQL

users · schema.sql

usernamepassword_hash
demo$2y$10$Qx7…
ana_r$2y$10$Lm2…

user_tokens

typetoken_hash
password_reset9f2c41…

Contraseñas con password_hash y tokens como SHA-256: si se filtra la base, no se filtran las claves.

Decidir

PHP
if (!$user || !password_verify($password,
        $user['password_hash'])) {
    $error = 'Usuario o contraseña incorrectos.';
} elseif ($user['email_verified_at'] === null) {
    $error = 'Debes confirmar tu correo…';
} else {
    // Nuevo ID de sesión para evitar fijación de sesión
    session_regenerate_id(true);    $_SESSION['user_id'] = (int) $user['id'];
}

El mismo mensaje si falla el usuario o la contraseña: no le dice a un atacante cuál de los dos acertó.

Mostrar

Interfaz
D
demoPanel del usuario
Sesión iniciada✓
CorreoConfirmado
ID de sesiónNuevo
Contraseña en la baseSolo hash

Recién aquí aparece el panel; antes, cada página lo exige con require_login().

Usuario y hashes de ejemplo. Código real de login.php, functions.php y schema.sql en login-system.

CV Generator

Editor de currículums con vista previa en vivo, 4 plantillas y un PDF que los filtros ATS pueden leer.

Publicado · web

La decisión: la validación, el puntaje y el guardado viven en módulos sin DOM. Así se prueban con 36 tests de node:test, sin instalar nada.

  • JavaScript
  • Módulos ES
  • node:test
  • Accesibilidad
Editor de CV a la izquierda y vista previa con la plantilla Moderna a la derecha
cv-generator-beryl-two.vercel.app

Puntuar un CV

Mientras escribes, el CV pasa por una lista de criterios. Cada uno suma puntos o deja un consejo concreto, y la pantalla muestra el puntaje y lo que falta.

Escribir

Objeto JS
{
  personal: { fullName: "Valeria Q.",
              email: "…@example.com" },
  summary: "Desarrolladora…", // 219 car.  experience: [ /* 2 entradas */ ],
  education: [ /* 1 entrada */ ],
  skills: [ /* 8 habilidades */ ]
}

El formulario y el CV comparten un solo objeto, guardado en localStorage.

Decidir

score.js
{
  points: 15,
  test: (cv) => {
    const length = cv.summary.trim().length;
    return length >= 150 && length <= 600;
  },  tip: 'Escribe un resumen de 150 a 600…',
},

for (const criterion of CRITERIA) {
  if (criterion.test(cv)) score += criterion.points;
  else tips.push(criterion.tip);
}

Cada criterio es una función pura: se prueba sola, sin abrir el navegador.

Mostrar

Interfaz
CV
Valeria QuispePlantilla Moderna
95 · ExcelentePDF listo

Consejo: Cuantifica tus logros con números (ej. "reduje el tiempo de carga un 40 %").

Solo se muestran los 3 consejos pendientes más importantes.

CV de ejemplo. Criterios y mensajes reales de score.js en cv-generator.

Diseño y frontend

Página de inicio de Nevado, operadora de trekking

Nevado

Operadora de trekking en los Andes: explorador de rutas con perfiles de elevación en SVG y una calculadora de cotización.

React · Vite · TailwindNegocio ficticio · proyecto de portafolio

Página de inicio de Madera Viva, taller de lutería

Madera Viva

Taller de lutería y escuela de guitarra en Barranco: anatomía interactiva de la guitarra y dibujos técnicos a escala real.

HTML · CSS · JS, sin frameworksNegocio ficticio · proyecto de portafolio

También: la base de datos académica de un instituto de idiomas, en SQL Server.

Un buen sistema no se nota.

Simplemente funciona. Por eso primero entiendo el problema y después elijo la tecnología.

Lo que viene

  1. Resolver mi primer CTFeste año
  2. Mi primera contribución a un proyecto de código abiertoeste año
  3. Escribir sobre cómo protegí Login Systema futuro
  4. Inglés C12027

Tú traes el problema.
Yo armo el sistema.