Manual de uso · versión 1.2

Proyectos y Tareas

Una lista de tareas para dos personas, que se puede usar de dos maneras a la vez: desde la página web, o hablándole a Claude por chat. Las dos ven exactamente lo mismo.

01

Cómo funciona por dentro

La app son dos programas corriendo al mismo tiempo que leen y escriben en un solo archivo. Ese archivo es la lista de verdad; todo lo demás son formas distintas de mirarla.

QUIÉN LO USA Ana · navegador abre la página web Beto · navegador abre la página web Ana · Claude le escribe por chat Beto · Claude le escribe por chat LOS DOS PROCESOS app-web server.js · puerto 3000 sirve la página + la API app-mcp mcp-server.js · puerto 3001 11 herramientas para Claude LA LISTA DE VERDAD data/app.db un solo archivo SQLite tabla projects tabla tasks lee / escribe lee / escribe
Dos puertas de entrada, una sola despensa. Por eso lo que carga Ana en la web aparece cuando Beto le pregunta a Claude, sin que nadie tenga que sincronizar nada.

La página web además se refresca sola cada 10 segundos, así que si la otra persona cambia algo, lo vas a ver aparecer sin tocar nada. Mientras tengas una ventana de edición abierta el refresco se frena, para no borrarte lo que estás escribiendo.

02

El código de colores

Cada tarea tiene una franja de color a la izquierda y un cartelito con su estado. No hace falta leer nada para saber cómo viene una tarea:

Ámbar · Pendiente Falta hacerla. Si cargaste el detalle, se muestra abajo en el recuadro Falta:
Rojo · Vencida Pendiente y con la fecha límite ya pasada. Van siempre arriba de todo.
Verde · Hecha Concluida. Se tacha, se atenúa y baja al final de la lista.

Así se ven en la app

Escribir el copy del aviso ! Vencida
📁 Marketing · 📅 20-ago (vencida)
Falta: la revisión de legales
Último cambio: Ana
Diseñar el flyer Pendiente
📁 Marketing · 📅 05-sept
Falta: que el cliente apruebe el color de fondo
Último cambio: Ana
Reservar el espacio publicitario ✓ Hecha
📁 Marketing
Último cambio: Beto

El orden nunca es al azar: primero lo vencido, después lo pendiente por fecha más próxima, y al final lo hecho.

03

Usarla desde la web

La primera vez

  1. Entrá a la dirección de la app. En tu PC es http://localhost:3000; en el servidor va a ser tu dominio.
  2. Entrá con tu usuario y tu contraseña. Te las da quien administra la app. La sesión queda abierta 30 días en ese navegador.
  3. Listo. Arriba a la derecha vas a ver tu nombre. Todo lo que hagas queda firmado con él, sin que tengas que escribirlo.
Hay que entrar una vez por navegador y por dispositivo. Si Ana usa la compu y el celular, va a poner su contraseña en los dos. El botón Salir cierra la sesión.

Las cuentas

Cada persona tiene la suya, y el nombre que firma cada cambio sale de ahí: no se escribe a mano, así que nadie puede hacerse pasar por otro. Las cuentas se crean en el servidor, con un comando — no hay una pantalla para registrarse, y es a propósito.

npm run usuarios -- listar
npm run usuarios -- crear nacho "Nacho"
npm run usuarios -- clave nacho
npm run usuarios -- borrar nacho
La contraseña se muestra una sola vez, cuando se crea. De la base no se puede sacar: solo se guarda un resumen cifrado. Si se pierde, se genera otra con clave — eso además cierra las sesiones abiertas de esa persona.

Las cinco pestañas

PestañaQué muestraPara qué sirve
Todas las tareas Todo, hecho y sin hacer, ordenado por urgencia El día a día: crear, editar, tildar
Pendientes Solo lo que falta, con el detalle de qué falta de cada una Ver de un saque el trabajo que queda
Personas El apartado de cada uno: lo que tiene que hacer y lo que ya hizo Que cada uno sepa qué le toca, sin preguntar
Proyectos Las carpetas para agrupar tareas, con cuántas pendientes tiene cada una Organizar y ver el avance por proyecto
Movimientos El historial: quién hizo qué y cuándo, en la app y desde Claude Enterarse de lo que pasó sin preguntar

Las acciones

Quiero…Cómo
Crear una tareaBotón + Nueva tarea. Lo único obligatorio es el título.
Marcarla hecha o deshacerlaClick en el cuadradito de la izquierda. Se guarda solo.
EditarlaClick en cualquier parte de la tarjeta (no en el cuadradito).
Anotar qué faltaDentro de la tarea, campo ¿Qué falta por hacer?
Ponerle fecha límiteCampo Fecha límite. Si pasa, la tarea se pone roja sola.
Borrar una tareaAbrila y usá Eliminar. Pide confirmación.
Crear un proyectoPestaña Proyectos → + Nuevo proyecto.
Borrar un proyectoÍcono 🗑 en su tarjeta. Se llevan también todas sus tareas: el aviso te dice cuántas.
Cerrar una ventana sin guardarBotón Cancelar, tecla Esc, o click afuera.
Cambiar de nombreBotón 👤 arriba a la derecha.
Una tarea puede no tener proyecto. Dejá el selector en Sin proyecto y queda suelta en la lista general. Sirve para las cosas que no encajan en ningún lado.

El apartado de cada persona

La app arranca con dos personas cargadas, Maxi y Alan. En la pestaña Personas hacés click en cualquiera y entrás a su apartado, que está partido en dos bloques: Tiene que hacer arriba y Ya realizadas abajo. Así cada uno abre lo suyo y sabe exactamente qué le toca, sin tener que preguntar.

Para asignar una tarea, arriba de todo del formulario está el desplegable ¿Quién la hace?. Se puede elegir al crearla o cambiarlo después: entrás a la tarea, elegís a la otra persona y guardás. La tarea le desaparece a uno y le aparece al otro al instante.

  • Si creás la tarea desde el apartado de alguien, ya viene elegido: no hay que seleccionarlo.
  • Cada tarjeta de tarea, en todas las pestañas, dice de quién es (👤 en violeta).
  • Las que no son de nadie dicen 👤 sin asignar en ámbar, y se juntan todas abajo del listado de personas, en Sin asignar. Ese bloque es la lista de lo que hay que repartir: si está vacío, no quedó nada en el aire.
  • Con + Agregar persona sumás a alguien más y aparece con su propio apartado.
Sacar a alguien de la lista no borra sus tareas: quedan sin asignar y siguen a la vista, en el bloque de abajo. El trabajo no se pierde por dar de baja a una persona.
Las personas no son las cuentas de la app. Se le puede asignar una tarea a alguien que no entra nunca a la web, y una cuenta puede existir sin recibir tareas. Son dos listas separadas a propósito.

El apartado de cada proyecto

En la pestaña Proyectos, hacé click en cualquier proyecto y entrás a su apartado: solo sus tareas, sus contadores, y un botón para crear una tarea ya asignada a él. Es también donde caen solas las tareas que pedís desde Claude.

  • Se actualiza solo cada 10 segundos, igual que el resto: si la otra persona (o Claude) agrega algo, lo ves aparecer sin recargar.
  • El botón ← Volver a proyectos te devuelve al listado.
  • El ícono 🗑 de cada tarjeta sigue siendo para borrar el proyecto entero, no para entrar.

Compartido o privado

Dentro del apartado de cada proyecto hay un interruptor Compartido. Es lo que decide si ese proyecto forma parte del circuito con Claude.

🔗 Compartido🔒 Privado
La app web Lo ve y lo edita Lo ve y lo edita
Claude Lo lista, lee y escribe No lo ve ni puede tocarlo

Los proyectos nuevos nacen compartidos, así lo normal funciona sin configurar nada. Apagá el interruptor solo en los que quieras dejar fuera.

Privado es privado de verdad. Cuando apagás el interruptor, Claude deja de ver ese proyecto al listar, deja de ver sus tareas, y no puede crear, mover, completar ni eliminar nada suyo — ni siquiera sabiendo el número de la tarea. En vez de un error confuso, recibe un mensaje que explica cómo volver a compartirlo.
04

El historial de movimientos

La pestaña Movimientos es el diario de la app: cada vez que alguien crea, cambia, completa o borra algo, queda una línea sola, sin que nadie tenga que acordarse de anotarla. Sirve para lo de todos los días: entrar y ver qué pasó desde la última vez que miraste, sin tener que preguntarle nada a la otra persona.

Cada línea diceCómo se ve
CuándoAgrupado por día, con la hora al costado
De dónde vino💻 desde la app, 🤖 desde Claude (el chat), ⌨️ desde Claude Code, o ⚙️ desde el servidor (altas de cuentas, restauraciones)
QuiénLa cuenta con la que se entró; en lo que viene de Claude, el nombre que Claude declare
Qué pasó«Completó la tarea Escribir los textos», «Actualizó la tarea Diseñar la portada (cambió la fecha límite)»

Qué queda solo y qué hay que pedir

Todo lo que toca una tarea o un proyecto queda anotado solo, venga de donde venga: de la app o de pedírselo a Claude. Nadie tiene que acordarse de nada.

Lo que no queda solo es el trabajo con Claude que nunca toca una tarea: arreglar un repositorio, desplegar algo, tomar una decisión. Para eso hay dos caminos:

DóndeCómo queda registrado
Claude Code
(la terminal, los repos)
Automático. Al cerrar cada sesión, un enganche avisa qué commits se hicieron y qué archivos se tocaron. Si no cambió nada, no anota nada.
Chat de claude.ai Pidiéndoselo: «dejá anotado que desplegamos la app». Las instrucciones del Proyecto ya le dicen que lo haga al terminar cada trabajo.
La diferencia importa: lo de Claude Code lo dispara el programa solo, mirando el repositorio. Lo del chat depende de que Claude siga la instrucción — casi siempre lo hace, pero no es una garantía. Si algo tiene que quedar sí o sí, pedilo explícitamente.

Las notas

Además de lo que se anota solo, con el botón + Anotar algo podés dejar asentado un avance que no es una tarea: «desplegamos la app en el VPS», «el cliente pidió correr la entrega a octubre». Se ven resaltadas en el historial, porque son lo que alguien quiso dejar dicho a propósito. Claude también puede dejarlas, si se lo pedís.

El nombre que firma cada línea sale de la sesión, no de lo que escriba nadie. Aunque alguien intente mandar un cambio diciendo que es otra persona, el historial anota su propia cuenta. Eso es lo que hace que el registro sirva para supervisar.

Detalles que conviene saber

  • Guardar una tarea sin cambiar nada no deja línea: solo se anota lo que cambió de verdad.
  • Cada proyecto muestra, abajo de sus tareas, sus últimos movimientos.
  • Se puede filtrar por origen (solo Claude / solo la app) y por proyecto.
  • Si borrás un proyecto, su historial no se borra: queda el rastro de que existió.
  • Lo privado sigue privado: Claude no ve los movimientos de un proyecto que tenga apagado el interruptor «Compartido».
05

Usarla hablándole a Claude

Cada persona conecta la app a su propia cuenta de Claude, una sola vez. Después, desde cualquier chat, le pide cosas en castellano común.

Conectarla (una vez por cuenta)

Esto requiere que la app ya esté en el VPS, con dominio y HTTPS. claude.ai vive en internet y no puede alcanzar algo que corre dentro de tu computadora (localhost). Mientras la app esté solo en tu PC, el conector no se puede agregar desde claude.ai.
  1. En Claude, entrá a Configuración → Connectors.
  2. Click en +Agregar conector personalizado.
  3. En la URL del servidor poné https://mcp.tudominio.com/mcp
  4. En Configuración avanzada → Request headers, agregá:
    Authorization: Bearer <tu MCP_API_KEY>
  5. Guardar y conectar. Listo.
La MCP_API_KEY es una contraseña. Está en el archivo .env del servidor. Pasásela a la otra persona por un canal privado y no la pegues en ningún chat grupal, documento compartido ni repositorio.

Qué le podés pedir

«Agregá una tarea en el proyecto Marketing: diseñar el flyer, vence el 5 de septiembre» → usa crear_tarea
«¿Qué tareas quedan pendientes y qué les falta?» → usa listar_tareas con only_pending
«Anotá que Alan tiene que revisar las fotos de los productos» → usa crear_tarea ya asignada a Alan
«¿Qué le falta hacer a Maxi?» → usa listar_tareas filtrando por esa persona
«Pasale la tarea 12 a Alan» → usa asignar_tarea
«¿Quedó alguna tarea sin asignar?» → usa listar_tareas con sin_asignar
«Marcá como hecha la tarea 12» → usa completar_tarea
«A la tarea del flyer anotale que falta que el cliente apruebe el color» → usa actualizar_tarea
«¿Cómo venimos en general? ¿Hay algo vencido?» → usa resumen
«Creá un proyecto que se llame Mudanza» → usa crear_proyecto
«Dejá anotado que hoy desplegamos la app en el VPS» → usa registrar_movimiento
«¿Qué se hizo esta semana en el proyecto Marketing?» → usa ver_movimientos

No hace falta saber los nombres de las herramientas ni los números de las tareas: si le decís «la del flyer», Claude busca la lista y la encuentra.

Que las tareas caigan solas en el proyecto correcto

Si trabajás dentro de un Proyecto de claude.ai, podés dejarlo atado a un proyecto de la app. Después, cuando pidas una tarea desde ese chat, va sola al lugar que corresponde: no tenés que aclarar nunca a qué proyecto pertenece.

Es un paso de configuración de una sola vez, no algo que Claude adivine. El servidor no recibe ninguna información sobre en qué Proyecto de Claude estás — el protocolo no la manda. Por eso la vinculación se deja escrita una vez. Después de ese paso, sí funciona solo y para siempre en ese Proyecto.
  1. En la carpeta de la app, generá el texto:
    npm run vincular -- "Marketing"
    Si el proyecto no existe en la app, lo crea en el momento.
  2. Copiá el bloque que te imprime.
  3. En claude.ai, entrá al Proyecto → InstruccionesEditar y pegalo.

Listo. A partir de ahí, desde ese Proyecto:

«anotá que falta mandar el presupuesto» → la tarea aparece en Marketing, sin preguntar nada
«¿qué me queda pendiente?» → contesta solo lo de Marketing, no todo

Si usás Claude Code en una carpeta

Mismo comando, agregando la ruta. Escribe el bloque en el CLAUDE.md de esa carpeta:

npm run vincular -- "Marketing" --carpeta "C:/ruta/al/repo"

Se puede repetir sin miedo: si ya estaba vinculada, actualiza el bloque en su lugar en vez de duplicarlo, y no toca el resto del archivo.

Tres cosas para tener claras

  • Cada Proyecto de Claude necesita su propia instrucción. Los nuevos que crees no la heredan.
  • Los Proyectos de claude.ai son de cada cuenta. Si los dos tienen un Proyecto «Marketing», cada uno pega el texto en el suyo. Como ambos nombran el mismo proyecto, las tareas terminan en el mismo lugar de la app y los dos las ven.
  • No se generan proyectos duplicados. El servidor busca ignorando mayúsculas y tildes: «marketing», «Marketing» y «Márketing» son el mismo. Y pedir las tareas de un proyecto que no existe devuelve una lista vacía, no crea nada.
06

Las funciones completas

Las 16 herramientas que ve Claude

HerramientaQué hace
listar_proyectosLista los proyectos compartidos, con cuántas tareas y cuántas pendientes tiene cada uno
crear_proyectoCrea un proyecto
vincular_proyectoBusca un proyecto por nombre y lo devuelve; si no existe, lo crea
eliminar_proyectoBorra un proyecto y todas sus tareas
listar_personasLista a quiénes se les pueden asignar tareas, y cómo viene cada uno
listar_tareasLista tareas; con only_pending devuelve solo las que faltan, con su detalle. Filtra por persona con assignee y trae las huérfanas con sin_asignar
obtener_tareaTrae una tarea puntual por su número
crear_tareaCrea una tarea, con o sin proyecto, y ya asignada a alguien si se lo decís
asignar_tareaLe pasa una tarea a otra persona, o la deja sin asignar
actualizar_tareaCambia cualquier campo: título, detalle, fecha, proyecto, persona, estado
completar_tareaLa marca como concluida
reabrir_tareaLa vuelve a pendiente y anota qué falta
eliminar_tareaBorra una tarea
registrar_movimientoDeja anotado en el historial un avance que no es una tarea
ver_movimientosLee el historial: qué se hizo, quién, y si fue desde la app o desde Claude
resumenTotales, vencidas, cómo viene cada persona, cuántas quedaron sin asignar, y las 10 pendientes más próximas

La API de la app web

Es lo que usa la página por debajo cuando apretás un botón. Todo lo que empieza con /api pide la clave en el encabezado x-api-key.

MétodoDirecciónQué hace
GET/healthPúblico. Confirma que el servidor está vivo
GET/api/auth-statusPúblico. Dice si hace falta clave, sin revelarla
POST/api/auth-checkPúblico. Valida una clave antes de guardarla
GET/api/projectsLista proyectos con sus contadores
POST/api/projectsCrea un proyecto
PATCH/api/projects/:idEdita nombre o descripción
DELETE/api/projects/:idBorra el proyecto y sus tareas
GET/api/peopleLista las personas con sus contadores
POST/api/peopleSuma una persona a la lista
PATCH/api/people/:idLe cambia el nombre
DELETE/api/people/:idLa saca de la lista. Sus tareas quedan sin asignar, no se borran
GET/api/people/:id/tasksSu apartado: lo que tiene que hacer y lo que ya hizo, separado
GET/api/tasksLista tareas. Admite ?project_id=, ?assignee_id=, ?unassigned=true y ?only_pending=true
GET/api/tasks/:idTrae una tarea
POST/api/tasksCrea una tarea
PATCH/api/tasks/:idEdita una tarea
DELETE/api/tasks/:idBorra una tarea
GET/api/activityEl historial. Admite ?project_id=, ?source=claude y ?limit=
POST/api/activityDeja una nota escrita a mano
GET/api/summaryContadores generales

Qué guarda cada tarea

CampoQué es
idEl número de la tarea. Es el que le decís a Claude
project_idA qué proyecto pertenece (puede estar vacío)
assignee_idQuién la tiene que hacer. Si está vacío, la tarea aparece en «Sin asignar»
titleEl título. Es lo único obligatorio
descriptionDescripción libre
pending_detailsQué falta por hacer — el recuadro ámbar
doneSi está concluida o no
due_dateFecha límite. Si pasa, la tarea se pone roja
updated_byQuién la tocó último
created_at / updated_atCuándo se creó y cuándo se modificó
07

Ponerla en marcha

En tu computadora

Requiere Node.js 18 o superior. Parada en la carpeta app-proyectos:

# una sola vez
npm install
node scripts/gen-env.js

# cada vez que la quieras usar
npm run dev

Después abrí http://localhost:3000. Para frenarla, Ctrl+C en esa ventana.

Verificar que todo anda

npm run smoke

Levanta los dos servidores contra una base descartable y corre 88 pruebas: seguridad, protocolo de Claude, alta y baja de proyectos y tareas, el filtro de pendientes, el borrado en cascada y que las dos puertas vean lo mismo. Tiene que terminar en 0 fallidas.

En el servidor (VPS)

Con los dos subdominios ya apuntando a la IP del servidor, un solo comando hace todo: instala Node, genera las claves, levanta los dos procesos con PM2, configura Nginx y emite los certificados HTTPS.

APP_DOMAIN="app.tudominio.com" \
MCP_DOMAIN="mcp.tudominio.com" \
LETSENCRYPT_EMAIL="vos@dominio.com" \
bash deploy.sh

Al terminar imprime la MCP_API_KEY, que es la que se usa para conectar Claude. Después hay que crear las cuentas, porque sin usuarios nadie puede entrar:

npm run usuarios -- crear ana   "Ana"
npm run usuarios -- crear beto  "Beto"
npm run usuarios -- crear nacho "Nacho"
Es seguro volver a correr deploy.sh si falló a mitad de camino (por ejemplo, si el DNS todavía no había propagado). No pisa el .env ya creado.

Si se borra algo

Hay una foto de los proyectos y tareas que se puede volver a poner:

npm run respaldo     # saca la foto de como esta todo ahora
npm run restaurar    # vuelve a crear lo que falte

Restaurar solo agrega lo que no está: nunca pisa ni borra lo que existe. Si una tarea sigue ahí pero cambiada, se la deja como está — manda el trabajo del día, no el respaldo. Se puede correr las veces que haga falta sin duplicar nada.

El respaldo no incluye el historial. El historial es lo que pasó: volver a escribirlo desde un archivo sería inventar movimientos que nunca ocurrieron. Lo que sí queda anotado es la restauración misma, marcada como hecha por el servidor.
08

Si algo falla

Me pide entrar de nuevo

La sesión dura 30 días. También se cierra si borraste los datos del navegador, si estás en modo incógnito, o si alguien cambió tu contraseña. Volvé a entrar con tu usuario.

Perdí mi contraseña

No se puede recuperar: en la base solo queda un resumen cifrado, no el texto. Se genera una nueva en el servidor con npm run usuarios -- clave <usuario>. Eso también cierra las sesiones abiertas de esa persona.

Dice "demasiados intentos fallidos"

Después de cinco contraseñas erradas seguidas con el mismo usuario hay que esperar un minuto. Es a propósito: sin esa espera, alguien podría probar contraseñas de a miles.

La página queda en blanco o dice "Error de red"

Los servidores no están corriendo. En tu PC: volvé a correr npm run dev. En el VPS: pm2 status tiene que mostrar app-web y app-mcp en online; si no, pm2 restart app-web app-mcp y mirá el detalle con pm2 logs.

Claude dice que no puede conectarse al conector

Revisá tres cosas, en este orden: que la URL termine en /mcp, que el encabezado diga exactamente Authorization: Bearer seguido de la clave (con el espacio), y que el certificado HTTPS del subdominio esté vigente. Para descartar, entrá a https://mcp.tudominio.com/health: tiene que responder algo, no dar error de certificado.

No veo lo que cargó la otra persona

La página se refresca sola cada 10 segundos, pero se frena mientras tengas una ventana de edición abierta. Cerrala y esperá unos segundos. Si aun así no aparece, puede que estén apuntando a servidores distintos.

Borré un proyecto sin querer y se llevó las tareas

Es el comportamiento esperado y no tiene deshacer. La única vuelta atrás es un backup: toda la información vive en el archivo data/app.db. Copialo cada tanto (junto a app.db-wal si existe) y vas a poder restaurar.

Cambié algo del código y no se ve

Si tocaste la página (public/), recargá con Ctrl+F5. Si tocaste el servidor (db.js, server.js, mcp-server.js), hay que reiniciar los procesos: pm2 restart app-web app-mcp en el VPS, o cortar y volver a correr npm run dev en tu PC.

Referencia rápida

Página web
http://localhost:3000 · en el VPS, https://app.tudominio.com
Conector de Claude
https://mcp.tudominio.com/mcp
Las claves
archivo .env, en la carpeta de la app
Toda la información
archivo data/app.db — copialo para hacer backup
Verificar que anda
npm run smoke → 88 pruebas, tiene que dar 0 fallidas
Reiniciar en el VPS
pm2 restart app-web app-mcp