Promptly 01 - El arranque del proyecto

Con este post inicio una serie sobre la construcción de un side-project que he llamado Promptly, para la gestión de prompts de IA. Iré enlazando aquí los posts conforme los vaya publicando, para que sea más fácil navegar entre ellos.

Si simplemente prefieres probarlo, ve a https://promptly.es. Si tienes curiosidad cómo lo he creado, sigue leyendo.


Objetivos

Problema / Oportunidad

Reto

Proceso

En cada post iré recogiendo el proceso de construcción y seguiré un esquema parecido:

Sin más dilación, vamos a ello, con la primera sesión de trabajo.

Sesión 1

Punto de partida

Objetivos

A alto nivel estos serían los objetivos actuales del proyecto:

Tareas

Vamos a sacar una lista primera de tareas (o requisitos si se quiere), para construir el proyecto. Lo que quiero es dejar al usuario guardar sus prompts, pero para conseguir esto, se necesita un mínimo de elementos previos (infraestructura):

Y todo esto debe ser seguro, claro: que los prompts sean de cada usuario y privados por defecto.

Venga, pues con este punto de partida, vamos a ponernos manos a la obra.

Acciones

Elección de plataforma

Firebase

Una forma que conozco y seguramente funcionaría bien es Firebase; ya lo he usado para algunos proyectos en el pasado, incluyendo la gestión de la autenticación y la persistencia de JSON (su motor Firebase es NoSQL) y los updates en tiempo real, y funciona muy bien, sin duda. Seguramente podría probar el nuevo Firebase Studio... pero me gustaría más usar un motor SQL estándar... así que voy a ver otras opciones en GCP.

PostgreSQL en GCP

He trabajado con muchos tipos de base de datos: SQL Server, Oracle, Postgres, ClickHouse... pero como lei en alguna ocasión: "en caso de duda, usa postgres". Así que he echado un ojo a mi cuenta Google Cloud Platform (GCP), y veo que actualmente una instancia gestionada de Postgres 16, con 2 vCPU y 8 GB + 10 GB SSD cuesta (en Iowa) $0.14/hora, lo que vendría a ser aprox $102 dólares al mes (en Europa GCP es más caro, y sobre un coste unitario de $0.17 hora, se iría hasta casi $125 mes, pero para un prototipo / side-project la latencia no me preocupa demasiado).

A pesar de que tengo un descuento disponible en GCP, la verdad, 0 € para arrancar me sonaría mejor, y me apetece probar algo menos enterprise que GCP.

Supabase

Y así he llegado hasta Supabase, que se vende como una alternativa open-source a Firebase e incluye Postgres y un plan inicial de $0 / mes. así que le voy a dar una oportunidad.

Info

El plan en Supabase tampoco es para tirar cohetes, veremos después como se comporta. Se trata del plan Nano = $0 / hour (up to 0.5 GB de memoria y una CPU Shared) + Disk size: 1 GB

Creación de la app

Hoy en día existen muchas fórmulas, pero me apetece profundizar más en NextJS. Un proyecto NextJS "normal", puede ser creado en local fácilmente con

npx create-next-app@latest

Pero también se admiten 'templates' o plantillas pre-configuradas. Este es el caso de Supabase, ya que existe una plantilla oficial que facilita el arranque:

npx create-next-app@latest -e with-supabase

La plantilla

Parece que la template tiene buena pinta, con instrucciones claras en la página principal para tener el proyecto bien conectado al entorno e incluso un formulario de sign-up integrado + Sign in.

El proyecto incluye:

Técnicamente, la plantilla incluye este stack:

Y existe un .env que puede fácilmente usarse de plantilla para conectar al proyecto supabase real desde local (env.local), simplemente rellenando estas variables:

NEXT_PUBLIC_SUPABASE_URL=https://tu-url-de-proyecto-en.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=tu-clave-para-conectar-ver-dashboard-en-supabase
npm run dev

Primer despliegue

Ok, arrancamos con la plantilla tal cual, sin modificaciones, pero siempre gusta ver el producto en funcionamiento en un entorno real. Se podrían usar varios entornos, pero el más natural para NextJS sigue siendo Vercel, tal y como aconseja la plantilla. Como ya tengo una cuenta gratuita de Vercel, procedo a enlazar mi proyecto git local con estos pasos:

La propia template detecta y propone las URLs, lo cual es un muy buen detalle de devX por parte de Supabase:

This particular deployment is"production" onhttps://promptly-m15aqmuuq-velardev-projects.vercel.app.

You will need to [update your Supabase project](https://supabase.com/dashboard/project/_/auth/url-configuration) with redirect URLs based on your Vercel deployment URLs.

- http://localhost:3000/**
- https://promptly-gilt.vercel.app/**
- https://promptly-gilt-*-[vercel-team-url].vercel.app/** (Vercel Team URL can be found in [Vercel Team settings](https://vercel.com/docs/accounts/create-a-team#find-your-team-id))

Resumen

En este punto, tenemos:

promptly_01_template_deployed_to_vercel.png

Sobre la lista inicial de tareas, terminamos la sesión con algo como: