Saltar al contenido

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.

  1. 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

  2. Observa sin riesgo

    Queda en modo observar: ves en la consola lo que Budger habría frenado, sin bloquear a nadie.

    mode: "monitor"

  3. 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.

terminal
npx budger init
# después, comprueba la instalación y tus cabeceras en vivo
npx budger doctor --url https://tu-app.com

Un 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.

budger.config.ts
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.

server.ts
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 · app/api/pagos/route.ts
// 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.

@budger/auth
// 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.

terminal
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 Docker

budger 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.

terminal
npx budger scan --url https://tu-app.com --fail-on high
npx budger scan --format sarif > budger.sarif

Eventos 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.

BudgerEvent v1
{
  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