En 1995, creabas index.html, escribías <h1>Hello</h1>, lo subías a un servidor y funcionaba. El ciclo de retroalimentación se medía en segundos. Un niño de doce años podía construir un sitio web en una tarde. Toda la web fue construida por personas que no eran programadores profesionales -- eran profesores, estudiantes, aficionados, propietarios de pequeñas empresas que necesitaban presencia en esa cosa nueva llamada internet.
En 2024, crear el equivalente de ese hello world requiere instalar Node.js, inicializar un proyecto, instalar React, ReactDOM, Vite, TypeScript, definiciones de tipos, Tailwind, PostCSS, Autoprefixer, ESLint, Prettier, y luego crear una docena de archivos de configuración antes de escribir una sola línea de código de aplicación. El conteo de dependencias se acerca a 2.000 paquetes. La huella en disco supera 1,5 gigabytes. El tiempo hasta el primer renderizado se mide en horas.
FLIN existe porque creemos que esta trayectoria no es inevitable. Es una elección que hizo la industria, y es una elección que podemos deshacer. No retrocediendo a las limitaciones de 1995, sino avanzando -- construyendo un lenguaje que entrega la simplicidad de aquella era con todo el poder de 2026: un compilador, una máquina virtual, una base de datos embebida, UI reactiva y un servidor HTTP. Todo detrás de un solo archivo.
La explosión de la complejidad: una línea temporal
Año Archivos para "Hello World" Dependencias Archivos config Espacio disco
---- --------------------------- ------------ --------------- -------------
1995 1 (index.html) 0 0 3 KB
2005 3 (HTML/CSS/JS) 0 0 15 KB
2010 10 + jQuery 5 1 500 KB
2015 50 + Gulp 200 5 80 MB
2020 500 + Webpack 1.000 10 500 MB
2024 50.000+ 2.000 15+ 1,5 GBCada paso en esta progresión fue racional de forma aislada. Pero el efecto agregado es que las herramientas destinadas a ayudarnos se han convertido en el problema.
La observación que inició FLIN
FLIN nació de una observación simple: la mayoría de las aplicaciones web hacen las mismas cinco cosas.
- Mostrar datos al usuario.
- Reaccionar a la entrada del usuario.
- Guardar datos en una base de datos.
- Consultar datos de una base de datos.
- Manejar solicitudes HTTP.
Cinco cosas. Y sin embargo, para hacer estas cinco cosas en 2024, necesitas React para la primera, una biblioteca de gestión de estado para la segunda, Prisma o TypeORM para la tercera y cuarta, Express o Fastify para la quinta, más TypeScript, Vite, ESLint, Prettier, Tailwind y una docena de archivos de configuración para conectar todo.
La pregunta que lanzó FLIN fue: ¿y si una sola herramienta hiciera las cinco cosas nativamente?
Cómo se ve FLIN: la aplicación más simple
flincount = 0
<button click={count++}>{count}</button>Dos líneas de lógica. Una línea de vista. Guárdalo como app.flin. Ejecuta flin dev. El navegador se abre. Haces clic en el botón. El número incrementa. No hay sentencia de importación, no hay archivo de configuración, no hay paso de compilación, no hay gestor de paquetes, no hay inicialización de framework.
Cómo se ve FLIN: una aplicación real
flintodos = []
filter = "all"
newTodo = ""
entity Todo {
title: text
done: bool = false
created: time = now
}
filtered = match filter {
"all" -> Todo.all
"active" -> Todo.where(done == false)
"completed" -> Todo.where(done == true)
}
<main>
<h1>My Todos</h1>
<input value={newTodo} placeholder="What needs to be done?"
enter={save Todo { title: newTodo }; newTodo = ""}>
<nav>
<button click={filter = "all"}>All</button>
<button click={filter = "active"}>Active</button>
<button click={filter = "completed"}>Done</button>
</nav>
{for todo in filtered}
<div class="todo-item">
<input type="checkbox" checked={todo.done}
change={todo.done = !todo.done; save todo}>
<span class={if todo.done then "done" else ""}>{todo.title}</span>
<button click={delete todo}>x</button>
</div>
{/for}
<footer>{Todo.where(done == false).count} items left</footer>
</main>Cuarenta y tres líneas. Una aplicación completa con una entidad respaldada por base de datos, UI reactiva, filtrado, creación, alternación, eliminación y un conteo en vivo de elementos restantes.
El poder detrás de la simplicidad
La simplicidad de la sintaxis de FLIN no se logra limitando sus capacidades. Se logra moviendo la complejidad al compilador y al runtime, donde pertenece.
Fuente FLIN Lo que el compilador/runtime realmente hace
----------- -----------------------------------------
count = 0 Asignar variable reactiva, registrar en grafo de dependencias
entity Todo {...} Generar esquema, crear tabla, registrar métodos de consulta,
habilitar rastreo temporal
save todo Serializar, escritura WAL, actualizar caché, invalidar caché,
actualización reactiva de UI
Todo.where(...) Generación de consulta SQL, vinculación de parámetros,
deserialización de resultados, caché opcional
{for todo in ...} Diff de DOM virtual, renderizado incremental de lista,
reconciliación con clavesEl desarrollador escribe cinco cosas. El compilador y el runtime hacen cincuenta.
Por qué esto importa para África
FLIN fue creado en Abiyán, Costa de Marfil, y su diseño refleja las restricciones de construir software en África Occidental.
Cuando tu conexión a internet promedia 5 Mbps en un buen día, descargar 1,5 GB de node_modules no es una espera de cinco minutos -- es una odisea de varias horas que consume datos móviles costosos. Cuando los cortes de electricidad interrumpen tu trabajo, una compilación larga de Webpack que falla a mitad de camino significa empezar de nuevo.
El modelo de cero dependencias de FLIN elimina todos estos puntos de fricción. No hay nada que descargar. No hay paso de compilación en modo desarrollo. La huella de memoria se mide en megabytes, no en gigabytes.
Lo que es bueno para Lagos es bueno para Londres. Las restricciones que hacen que FLIN sea necesario en África lo hacen mejor en todas partes.
La dimensión de la IA
Hay una segunda audiencia para la simplicidad de FLIN que no existía en 1995: los generadores de código IA.
Cuando un modelo de lenguaje genera código FLIN, las probabilidades de producir un programa correcto son dramáticamente más altas que con un stack React/TypeScript/Prisma:
- Sin importaciones que alucinar. FLIN no tiene importaciones.
- Sin configuración que malconfigurar. FLIN no tiene archivos de configuración.
- Un archivo por componente. La IA no necesita coordinar cambios entre directorios frontend y backend.
- Superficie de sintaxis mínima. Menos palabras clave, menos patrones, menos formas de expresar lo mismo.
Los compromisos honestos
No puedes usar paquetes npm. FLIN no tiene gestor de paquetes ni interoperabilidad con el ecosistema JavaScript.
Estás aprendiendo un lenguaje nuevo. La sintaxis de FLIN está diseñada para ser intuitiva, pero no es JavaScript, Python ni ningún lenguaje que ya conozcas.
El ecosistema es joven. FLIN tiene 180 componentes de UI embebidos y 1.675 iconos embebidos, pero no tiene los miles de paquetes de terceros que React o Vue ofrecen.
FlinDB no es PostgreSQL. Para aplicaciones que requieren consultas SQL complejas o compatibilidad con herramientas existentes basadas en PostgreSQL, FlinDB puede no ser suficiente.
La apuesta filosófica
En 1995, la web era una plataforma abierta y accesible donde cualquiera podía participar. FLIN es una apuesta de que este compromiso entre simplicidad y potencia es falso. Que puedes tener la simplicidad de 1995 y el poder de 2026. Que un solo lenguaje puede reemplazar toda una cadena de herramientas. Que un niño de doce años que sabe HTML debería poder construir una aplicación web real.
Es una apuesta que estamos haciendo desde Abiyán, con un compilador Rust, un CTO IA, y la convicción de que los próximos millones de desarrolladores web no vendrán de San Francisco. Vendrán de Lagos, Nairobi, Dakar, Abiyán y Kinshasa. Y merecen herramientas que respeten su tiempo, su ancho de banda y su inteligencia.
Siguiente en la serie: What FLIN Looks Like in Practice: First Examples -- La teoría es barata. Aquí hay código FLIN real: una aplicación de tareas, un blog, una API, un dashboard en tiempo real y un motor de búsqueda semántica.