DESARROLLADORES
Un comando para empezar. Un archivo para configurarlo todo.
Budger se instala como una dependencia más. Arranca observando, no rompe nada y pasas a bloquear cuando tú decidas.
EN TRES PASOS
De cero a protegido sin tumbar nada.
Corre un comando
budger init reconoce tu framework y tu gestor de paquetes, te muestra los cambios antes de hacerlos e instala el adaptador.
npx budger init
Observa sin riesgo
Queda en modo observar: ves en la consola lo que Budger habría frenado, sin bloquear a nadie.
mode: "monitor"
Bloquea cuando quieras
Cuando ya viste lo que pasa, cambias una línea y Budger empieza a frenar los ataques.
mode: "enforce"
Instalación
Detecta Express o Next, el gestor (npm, pnpm, yarn o bun) y TypeScript. Te muestra el cambio, crea budger.config.ts e inserta el middleware. Las llaves van solo a .env.local o .env.example, nunca a tu código.
npx budger init
# después, comprueba la instalación y tus cabeceras en vivo
npx budger doctor --url https://tu-app.comUn solo archivo de configuración
Todo Budger se configura aquí. Sin llave de licencia funciona en local; sin consola, los eventos van a tu propio registro.
import { defineConfig } from "@budger/core"
export default defineConfig({
app: "mi-api", // nombre en la consola
mode: "monitor", // "monitor" | "enforce"
licenseKey: process.env.BUDGER_KEY,
console: {
url: "https://app.budger.dlrbaq.com",
ingestKey: process.env.BUDGER_INGEST_KEY,
},
proxy: { trust: "loopback" }, // "loopback" | "none" | CIDR[]
origins: ["https://app.tu-empresa.com"],
headers: { csp: "strict-api" },
rateLimit: { store: "memory" }, // memory | mongo | redis
redact: ["documento", "celular"], // campos extra a limpiar
})Express 4 y 5
Una línea protege toda la app: cabeceras, CORS, IP real, límite global y eventos. Luego afinas por ruta.
import express from "express"
import { budger } from "@budger/express"
import config from "./budger.config"
const app = express()
app.use(budger(config))
app.post("/login", budger.limit("login"), login)
app.post(
"/webhooks/wompi",
budger.webhook("wompi", process.env.WOMPI_EVENTS_SECRET),
pagoConfirmado,
)Next 16 (y 15)
El proxy pone las cabeceras y la CSP con nonce. La autorización se repite en cada handler: nunca vive solo en el proxy.
// proxy.ts
export { proxy } from "@budger/next/proxy"
export const config = { matcher: [/* el matcher recomendado, literal */] }
// app/api/pagos/route.ts
import { withBudger } from "@budger/next"
export const POST = withBudger(
{ limit: "login", auth: "session" }, // auth es obligatorio
async (req) => {
// …tu lógica
},
)Autenticación
Sesiones con token opaco (se revocan al instante), passkeys, TOTP, OTP, confirmación extra para dinero y dispositivos de confianza. El modo observar y el apagado de emergencia nunca desactivan la autenticación.
// Si el almacén de sesiones no responde,
// la ruta responde 503: nadie entra sin verificar.
export const POST = withBudger(
{ auth: "session", limit: "transferir" },
async (req) => {
// pide confirmación extra (step-up) antes de mover dinero
},
)Respaldos
Copia, restaura en una base temporal, compara, cifra con tu llave y sube a tu bucket. Si un paso falla, no hay archivo nuevo y te llega una alerta.
npx budger backup run # copia verificada ahora
npx budger backup status # última copia y su verificación
npx budger backup restore-test # restauración de prueba
npx budger backup schedule # launchd, cron o Dockerbudger scan
Dependencias, secretos en el árbol y en la historia, cabeceras y TLS en vivo y configuración. Corta tu integración continua según la severidad que elijas.
npx budger scan --url https://tu-app.com --fail-on high
npx budger scan --format sarif > budger.sarifEventos e ingesta
Cada control emite un evento limpio: IP truncada, sin correos, sin datos personales. Viajan en lotes de hasta 500 o cada 5 segundos, firmados con HMAC, con un tiempo máximo de 2 segundos. Nunca frenan la petición de tu usuario.
{
v: 1,
id: "01JD…", // ulid
ts: "2026-10-31T14:02:11Z",
app: "mi-api", env: "production",
control: "BGR-RL-01",
kind: "blocked", // observed · auth.failure · backup · scan…
severity: "medium",
tuic: "…", // categoría TUIC (SFC CE 033/2020)
ip: "181.50.12.0/24", // siempre truncada
route: "/login",
detail: { /* ya redactado */ }
}
// POST https://app.budger.dlrbaq.com/v1/ingest
// x-budger-signature: t=…,v1=…HABLA CON NOSOTROS
¿Tu stack no aparece aquí?
Cuéntanos con qué está hecha tu app y vemos cómo protegerla.
- Desde
- Barranquilla, Colombia
- Respuesta
- En horario hábil de Colombia