Feature flags sin despliegue

Engineering

Hay valores en tu código que no tienen por qué estar en tu código.

El texto del banner de la página de inicio. El porcentaje de descuento de la promoción de verano. El flag que oculta un proceso de pago a medio terminar a todo el mundo menos a tu equipo. Cada uno es un cambio de una línea que cuesta un pull request, una revisión, una ejecución de CI y un despliegue, y la persona que de verdad quiere el cambio normalmente no puede hacerlo por sí misma.

Config es un almacén clave-valor, y esa es la idea

El módulo Config de Kookee (Configuración en el panel) guarda cualquier valor serializable en JSON bajo una clave y te lo devuelve con el mismo SDK que el resto de tu contenido:

TypeScript
const flag = await kookee.config.getByKey('feature-new-checkout');

if (flag.value === true) {
  // nuevo proceso de pago
}

Los valores no se limitan a booleanos, y ahí es donde se vuelve útil de verdad. La configuración completa de un bloque de la interfaz cabe en una sola clave:

TypeScript
const banner = await kookee.config.getByKey('homepage-banner');
// { text: '¡Ofertas de verano!', enabled: true, color: '#ff6b00' }

O una regla de negocio que tu equipo de finanzas quiere controlar:

TypeScript
const discount = await kookee.config.getByKey('pricing-discount');
// { percentage: 20, minOrderValue: 50 }

Pide lo que necesitas en una sola llamada

Pedir las claves una a una en cada carga de página es el error evidente. list() acepta un filtro de claves:

TypeScript
const configs = await kookee.config.list({
  keys: ['homepage-banner', 'feature-new-checkout', 'pricing-discount'],
});

Una solicitud, tres valores. Pídelos una vez por renderizado en el servidor, o una vez al arrancar la app en el cliente, y pásalos hacia abajo. Cada lectura de Config es una llamada a la API que cuenta para tu cuota mensual de solicitudes: en el plan gratuito son 100 000 al mes, así que aquí la caché no es optimización prematura, es la forma normal de usarlo.

El historial de versiones es la red de seguridad

Editar en producción solo es cómodo si los errores salen baratos. Cada cambio en Config crea una instantánea en Kookee, y cualquier versión de los últimos 30 días se restaura con un clic.

Eso cambia el riesgo de darle una clave a alguien que no es ingeniero. Lo peor que puede pasar con un descuento mal escrito no es un incidente con un despliegue urgente para corregirlo: es revertirlo en el panel, y lo hace la misma persona que hizo el cambio, en los diez segundos siguientes a darse cuenta.

Por la misma razón, las descripciones importan más de lo que parece. enable-v2 no le dice nada a quien lo herede dentro de seis meses. Escribe la descripción al crear la clave.

Hasta dónde llega Config

Config es simple a propósito: una clave, un valor y un historial. No hace lanzamientos por porcentaje, segmentación por usuario ni asignación de pruebas A/B. Si necesitas mostrar una función al 5 % de los usuarios de Alemania, lo que buscas es una plataforma de experimentación dedicada, y deberías usar una.

Config cubre el caso mucho más común: un valor global que tu equipo necesita cambiar sin publicar código. Así son la mayoría de los flags, casi siempre. Además, el flag vive junto a las entradas de tu blog, tus artículos de ayuda y tu registro de cambios, con la misma clave de API, en lugar de ser un cuarto proveedor en tu stack.

Un patrón razonable es dejar un valor por defecto en el código y que Config lo sobrescriba:

TypeScript
let showNewCheckout = false;

try {
  const flag = await kookee.config.getByKey('feature-new-checkout');
  showNewCheckout = flag.value === true;
} catch {
  // fallo de red: se mantiene el valor seguro por defecto
}

Ahora el flag es remoto, y si la API no responde, todo vuelve al último comportamiento que sabes que funciona, en lugar de lanzar una excepción en la página de pago.