Monica v3 llega antes de que acabe 2026. Reconstruida desde cero. Sigue siendo de código abierto. Ver lo que viene
Monica

Blog

Notas sobre la construcción de Monica, sobre mantener privados los datos personales y sobre la pequeña mecánica de seguir en contacto.

Fuente RSS
10 min de lectura
Building Monica: modelar las relaciones entre personas
Regis Freyd

Cuando empezamos a reconstruir Monica, sabía que las relaciones serían una de las áreas que tendríamos que replantear. Lo que no esperaba era lo difícil que sería siquiera definir qué es una relación.

Un CRM personal necesita saber cómo están relacionadas las personas entre sí. Alguien es tu madre, tu hermano, tu amigo, tu compañera de trabajo o tu pareja. Monica lo permite desde hace años y, desde el punto de vista del usuario, es una función bastante simple: seleccionas a una persona, eliges una relación y ya está.

Por desgracia, diseñar lo que ocurre detrás de ese pequeño desplegable no es nada simple.

Incluso las relaciones simples no lo son tanto

Digamos que Monica es la hermana de Ross. Desde el punto de vista de Monica, Ross es su hermano. Las dos frases describen la misma relación, pero las palabras que usamos dependen de la persona a la que estemos mirando.

Lo mismo pasa por toda la familia. Rachel es la madre de Emma, mientras que Emma es la hija de Rachel. La tía de alguien tiene una sobrina o un sobrino. Una abuela tiene una nieta o un nieto.

Otras relaciones no funcionan así. Chandler y Joey son amigos. La palabra es la misma sin importar desde qué lado se mire. Los primos y los compañeros de trabajo pueden funcionar igual.

Así que ya tenemos comportamientos distintos. A veces una relación cambia de nombre según el lado desde el que se mire, a veces no, y a veces la palabra que usamos depende del género de una de las dos personas.

Y esta es la parte fácil.

Las familias son un lío

Imagina que dos personas se casan y tienen dos hijos. Se divorcian. Una de ellas se vuelve a casar con alguien que ya tiene hijos de otra relación y quizá tienen otro hijo juntos.

No es una familia especialmente inusual, pero ahora tenemos padres, hijos, hermanos, medio hermanos, hijastros, padrastros, cónyuges y excónyuges.

También empieza a plantear preguntas para las que no creo que exista siempre una respuesta universal. Si te divorcias, ¿tu suegra deja de ser tu suegra? Técnicamente, quizá. Pero ¿qué pasa si la conoces desde hace veinte años y sigues considerándola parte de tu familia? Desde luego no deja de ser la abuela de tus hijos solo porque tu matrimonio haya terminado.

Luego hay padres biológicos, padres adoptivos, familias de acogida y tutores. Alguien puede tener varias personas a las que considera sus padres, y esas relaciones no significan necesariamente lo mismo. Hay familiares con los que se ha perdido el contacto, gente que considera a alguien un hermano o una hermana sin ninguna relación biológica, exparejas que siguen siendo muy cercanas y padres que crían a sus hijos juntos sin seguir siendo pareja.

El árbol genealógico limpio que tendemos a imaginar cuando pensamos en este problema no sobrevive al contacto con muchas familias reales.

E incluso cuando la estructura familiar es sencilla, las relaciones cambian. Quien hoy es tu pareja puede ser tu expareja en cinco años. Eso no significa que la relación antigua deba desaparecer sin más. El hecho de que dos personas estuvieran casadas durante quince años sigue formando parte de su historia, aunque ya no lo estén.

Las relaciones tienen un pasado, lo que hace que representar solo su estado actual también resulte problemático.

Dos personas pueden no estar de acuerdo sobre su relación

Las relaciones familiares nos dan al menos algunos hechos con los que trabajar. La amistad es aún menos precisa.

Si Monica considera a Rachel una amiga cercana, ¿considera Rachel necesariamente a Monica una amiga cercana? No tenemos ni idea.

El mismo problema existe con los mentores, los conocidos y muchas otras relaciones. Alguien puede considerar a otra persona su mentor aunque esa persona nunca usaría esa palabra. Alguien puede considerar a un viejo amigo prácticamente de la familia mientras que el otro lo ve como alguien a quien conoció hace años.

Esto importa mucho en Monica, porque la información no pretende describir un grafo social objetivo. Es tu información sobre las personas de tu vida.

Cuando escribes que alguien es tu amigo, estás describiendo la relación tal y como tú la entiendes. Monica no tiene la versión de la otra persona y, en muchos casos, probablemente no hay una única respuesta correcta.

Esto se vuelve especialmente extraño cuando el software intenta convertir las relaciones en algo medible. ¿Alguien es mejor amigo porque lo ves cada semana? ¿Un amigo al que no has visto en cinco años es menos importante que un compañero de trabajo con el que hablas todos los días? Obviamente, la frecuencia nos dice algo sobre una relación, pero no nos dice lo que esa relación significa para alguien.

El tiempo tampoco encaja bien

Un compañero de trabajo puede convertirse en amigo. Un amigo puede convertirse en pareja. Una pareja puede convertirse en expareja y, años después, esa misma persona puede volver a ser un amigo.

Si Monica registra que dos personas están casadas y más tarde se divorcian, ¿qué debería pasar con el matrimonio? Eliminarlo dejaría la información actual correcta, pero también borraría algo bastante importante de su historia.

Podríamos guardar fechas, salvo que a menudo la gente no las conoce. Puedo saber que dos amigos estuvieron juntos sin tener la menor idea de cuándo empezaron a salir ni de cuándo se separaron exactamente. Exigir fechas precisas dejaría el modelo más limpio y el producto bastante más molesto de usar.

Tampoco hay ninguna garantía de que las relaciones pasen limpiamente de un estado a otro. La gente no se despierta necesariamente una mañana y pasa de «amigo» a «pareja». Algunas relaciones tienen un comienzo claro, como un matrimonio. Muchas otras no.

A la base de datos le encantaría que supiéramos cuándo empezó y cuándo terminó todo. La mayor parte del tiempo, no lo sabemos.

El inglés no es el modelo del mundo entero

Otro problema es que la mayoría de los primeros ejemplos que se nos ocurren están basados en el inglés.

El inglés usa «cousin» para un gran número de relaciones familiares, mientras que otros idiomas pueden ser mucho más precisos. El chino mandarín, por ejemplo, tiene palabras distintas para los primos según el lado de la familia del que vengan, su género y a veces su edad. El sueco distingue a los cuatro abuelos: mormor es la madre de tu madre, morfar el padre de tu madre, farmor la madre de tu padre y farfar el padre de tu padre. El inglés simplemente nos da «grandmother» y «grandfather».

El coreano ofrece otro ejemplo. Incluso algo tan simple como «hermano mayor» cambia según quién habla. Un hombre llama a su hermano mayor hyeong, mientras que una mujer lo llama oppa. El vocabulario de las relaciones contiene información que no está presente en la palabra inglesa «brother».

Esto importa para Monica porque está traducida a muchos idiomas y se usa en todo el mundo. No podemos diseñar todo el sistema de relaciones partiendo de la idea de que el inglés contiene la lista canónica de relaciones y que los demás idiomas solo tienen que traducir esas palabras.

Es un problema con el que ya nos hemos encontrado en Monica, y reconstruirla no lo hace desaparecer por arte de magia.

La familia no es ni siquiera lo más difícil

Al menos las relaciones familiares suelen tener nombre. El resto de nuestras relaciones está mucho menos estructurado.

«Amigo» puede describir a alguien a quien conoces desde hace treinta años y con quien hablas cada semana, pero también a alguien a quien ves dos veces al año y que te importa muchísimo. Un compañero de trabajo puede ser la persona que se sienta a tu lado todos los días o alguien con quien trabajaste hace quince años.

Y las personas no encajan en una sola categoría a la vez. Alguien puede ser tu compañero de trabajo, tu amigo y tu antiguo compañero de piso. Tu socio puede ser también tu hermano. Tu vecina puede ser la madre de la mejor amiga de tu hija.

A veces lo que importa es el contexto mismo. Conoces a alguien porque fuisteis juntos al colegio, jugasteis en el mismo equipo, vivisteis en el mismo edificio o trabajasteis en el mismo proyecto. «Amigo» puede ser técnicamente correcto, pero pierde la información que explica por qué esa persona forma parte de tu vida.

Aquí es donde una pregunta simple como «¿de dónde conoces a esta persona?» empieza a ser sorprendentemente difícil de responder con un solo campo.

Una relación puede implicar muchas otras

Supongamos que Ross es el hermano de Monica y que Ross tiene un hijo llamado Ben. Entendemos de inmediato que Monica es la tía de Ben.

El software puede llegar a la misma conclusión. Y una vez que empieza a hacerlo, puede seguir.

Los padres implican hijos. Los hijos con los mismos padres pueden ser hermanos. Los hermanos con hijos crean tías, tíos, sobrinas y sobrinos. Añade otra generación y ya tienes abuelos y nietos. Bastante rápido, un pequeño número de relaciones puede producir un grafo familiar mucho más grande.

Pero el hecho de que el software pueda inferir algo no significa necesariamente que deba hacerlo.

La nueva pareja de un padre no es automáticamente un padre para el hijo. Dos personas que comparten un progenitor pueden ser técnicamente medio hermanos, pero quizá no se conocen. La información que Monica tiene también puede ser simplemente incompleta. E incluso si la relación familiar es técnicamente correcta, puede no ser la relación que las personas implicadas usarían para describirse.

Cada vez que el software infiere otra relación, también obtiene otra oportunidad de equivocarse.

Hay más preguntas que respuestas

Cuanto más trabajamos en esto, más casos límite encontramos.

¿Debería Monica recordar la historia de una relación o solo su estado actual? ¿Pueden dos personas tener varias relaciones al mismo tiempo? ¿Es «mejor amigo» una relación distinta de «amigo», o es otra cosa? ¿Qué pasa cuando conocemos a la madre de alguien pero no tenemos a esa madre como contacto en Monica? ¿Cómo describimos relaciones que nos importan pero que no tienen un nombre cómodo?

Algunas de estas son cuestiones de base de datos. La mayoría no.

La parte difícil es decidir qué queremos decir cuando decimos que dos personas tienen una relación, porque los humanos no usan esa palabra con nada parecido a la precisión que preferiría una base de datos.

Desde la interfaz, todo esto puede acabar reduciéndose a unas pocas palabras en el perfil de alguien: madre, hermano, amigo, compañera de trabajo.

Acertar con esas pocas palabras es uno de los problemas más difíciles a los que nos enfrentamos mientras reconstruimos Monica.

8 min de lectura
Building Monica: construimos el navegador de base de datos que queríamos para Laravel
Regis Freyd

Este es otro artículo de la serie Building Monica, donde escribo sobre el proceso de reconstruir Monica desde cero. La mayoría de los artículos de esta serie tratarán probablemente sobre el producto en sí: las relaciones, los recordatorios, la personalización, las actividades, la privacidad y todas las preguntas que surgen al intentar representar la vida de las personas en un software. Pero reconstruir una aplicación grande también produce cosas más pequeñas por el camino. LaraDB es una de ellas.

Mientras trabajaba en Monica v3, me di cuenta de que pasaba mucho tiempo mirando directamente la base de datos. Esto no es especialmente raro cuando se construye una aplicación Laravel. Creas un contacto y compruebas qué se ha escrito. Creas una relación e inspeccionas las filas relacionadas. Cambias un recordatorio y verificas las fechas. Ejecutas una acción, actualizas los datos, sigues una clave foránea y repites el proceso muchas veces al día.

Ya existen muchas buenas formas de hacerlo. Tinker es útil, pero no es sencillo ni rápido de usar. Aplicaciones como TablePlus, DBeaver, phpMyAdmin o Adminer pueden ser muy útiles, pero no para una consulta rápida. Uso TablePlus con regularidad, sobre todo cuando necesito escribir consultas, editar datos o inspeccionar el esquema en detalle. Pero la mayor parte del tiempo, mientras desarrollaba Monica, no necesitaba una herramienta de gestión de bases de datos. Solo quería una forma rápida de ver qué había en la base de datos sin salir de la aplicación en la que ya estaba trabajando.

Esa fue la idea inicial detrás de LaraDB. Instalar una dependencia de desarrollo, visitar /db y ver la base de datos.

composer require --dev monicahq/laradb

Lo que obtienes es muy simple. Las tablas se muestran a la izquierda, las filas a la derecha, y la página se ejecuta dentro de la propia aplicación Laravel. LaraDB es compatible con SQLite, MySQL y MariaDB, y PostgreSQL.

LaraDb mostrando la tabla value_list_items: la lista de las 41 tablas a la izquierda, sus filas a la derecha, y las columnas de claves foráneas representadas como enlaces que se pueden seguir.

Un navegador y no un gestor de bases de datos

La decisión más importante que tomamos fue mantener LaraDB de solo lectura. No tiene botón de editar, ni botón de eliminar, ni formulario de inserción, ni consola SQL. Las dos rutas que expone el paquete son rutas GET, y el paquete solo emite sentencias SELECT.

En parte es una decisión de seguridad, pero sobre todo es una cuestión de alcance. Ya existen herramientas maduras para gestionar bases de datos, y reproducir un subconjunto de sus funciones dentro de Laravel no haría que LaraDB fuese más útil para el problema que intentábamos resolver.

El paquete también evita aceptar identificadores o consultas arbitrarias procedentes del navegador. Una tabla solicitada debe existir primero en el esquema descubierto por el controlador. Los identificadores se escapan según el motor de base de datos. Los valores que se usan al seguir claves foráneas se pasan como parámetros vinculados. No hay una interfaz para enviar SQL arbitrario porque el SQL arbitrario no forma parte del propósito del paquete.

Una herramienta pequeña puede seguir siendo comprensible si tiene un trabajo muy preciso. LaraDB pretende responder qué hay actualmente en la base de datos y cómo se relacionan esas filas entre sí. No pretende convertirse en un sustituto de un cliente de base de datos completo.

Lo que acabamos necesitando

La interfaz refleja ese alcance limitado. LaraDB enumera las tablas del esquema actual y muestra sus filas en una tabla densa. Se indican los tipos de columna, se identifican las claves primarias y foráneas, los valores NULL se distinguen visualmente de las cadenas vacías, y los valores largos se truncan para que las columnas grandes de texto o JSON no vuelvan la página inservible.

Las claves foráneas resultaron ser una de las funciones más útiles para Monica. Si una columna referencia otra tabla, se puede seguir su valor directamente. Al hacer clic se abre la tabla referenciada, filtrada por la fila correspondiente. Esto es especialmente útil en Monica v3, porque cada vez más dominios se representan mediante relaciones explícitas entre varias tablas en lugar de registros grandes y autocontenidos.

La página también expone algo de contexto sobre la base de datos y la consulta actuales. Según lo que ponga a disposición el motor de base de datos, LaraDB puede mostrar el motor y su versión, el nombre de la base de datos, su tamaño, el número de índices y otros metadatos propios del motor. Para la página actual, también muestra la sentencia SQL que produjo el resultado y cuánto tardó la consulta.

También hay una representación en JSON de una tabla. Fue barata de añadir una vez separada la capa de base de datos del renderizado HTML, y ha resultado útil para inspeccionar datos fuera de la propia página.

El frontend es deliberadamente autónomo. El paquete incluye su propio CSS y su propio JavaScript, y no depende de la cadena de assets de la aplicación anfitriona. Instalar LaraDB no debería obligar a añadir una configuración de Tailwind, una dependencia de Alpine u otro paso de compilación a un proyecto existente.

La abstracción de la base de datos acabó siendo el trabajo de verdad

Mostrar filas en un navegador es sencillo. Dar soporte a SQLite, MySQL y PostgreSQL de forma coherente es donde acabó estando la mayor parte del trabajo interesante.

Los motores difieren bastante en la manera de exponer el esquema y los metadatos de la base de datos. Listar tablas, describir columnas, encontrar claves primarias, resolver claves foráneas, contar filas y obtener información a nivel de base de datos requieren consultas distintas según el motor. Incluso detalles como el escapado de identificadores hay que tratarlos correctamente en lugar de como una operación SQL genérica.

LaraDB oculta esas diferencias detrás de una pequeña interfaz de controlador. La capa de Laravel pide tablas, columnas, filas y metadatos sin necesidad de saber si la conexión subyacente es SQLite, MySQL o PostgreSQL.

Una parte simplificada del contrato tiene este aspecto:

public function listTables(): array;

public function getColumns(string $table): array;

public function getRowCount(
    string $table,
    ?RowFilter $filter = null,
): int;

public function getRows(
    string $table,
    int $page,
    int $perPage,
    ?RowFilter $filter = null,
): TablePage;

public function getForeignKeys(string $table): array;

Cada controlador de base de datos implementa esas operaciones de forma distinta, mientras que el resto de LaraDB trabaja con los objetos de resultado comunes que devuelve la interfaz.

Una consecuencia interesante de este diseño es que el núcleo del código que lee la base de datos no depende de Laravel en absoluto. Funciona directamente con PDO. Laravel se encarga del descubrimiento del paquete, la configuración, el enrutado y el renderizado, pero la inspección de la base de datos puede usarse por separado.

use LaraDb\DriverFactory;

$pdo = new PDO('sqlite:database.sqlite');
$driver = DriverFactory::fromPdo($pdo);

foreach ($driver->listTables() as $table) {
    echo $table->name;
}

Solo lectura no es lo mismo que inofensivo

Que el paquete sea de solo lectura impide que corrompa la base de datos, pero no hace que exponer la base de datos sea inofensivo. Un navegador de base de datos puede revelar todas las filas de todas las tablas a cualquiera que pueda llegar hasta él, lo que evidentemente es un problema serio para una aplicación como Monica.

Por eso LaraDB está pensado para instalarse como dependencia de desarrollo.

composer require --dev monicahq/laradb

Un despliegue normal de producción con composer install --no-dev no contendrá el paquete. LaraDB también está desactivado por defecto fuera del entorno local, y sus rutas usan por defecto los middleware web y auth cuando están activadas.

Cosas pequeñas que salen de una reconstrucción grande

Cuando empecé la serie Building Monica, esperaba que la mayor parte de lo escrito se centrara en las grandes decisiones de arquitectura y de producto detrás de Monica v3. Eso seguirá siendo así. Pero también quiero documentar algunas de las herramientas e ideas más pequeñas que salen de la reconstrucción, porque también forman parte del trabajo.

LaraDB no es una parte importante de Monica v3, y no intenta convertirse en un producto importante por sí mismo. Es simplemente una pequeña herramienta de desarrollo que nos quitó una molestia recurrente. El paquete es útil precisamente porque su alcance es limitado, y me gustaría que siguiera siendo así.

Si trabajas con aplicaciones Laravel y a menudo abres un cliente de base de datos solo para inspeccionar lo que tu código acaba de escribir, puede que LaraDB también te resulte útil.

composer require --dev monicahq/laradb

Después visita /db.

El código fuente está disponible en github.com/monicahq/laradb.

8 min de lectura
Estamos reconstruyendo Monica
Regis Freyd

Este es el primer artículo de una serie llamada Building Monica. Quiero usar esta serie para documentar cómo estamos reconstruyendo Monica, el CRM personal de código abierto, desde cero. Hablaré de los problemas que intentamos resolver, de las decisiones que tomamos por el camino y probablemente de algunas cosas que no salen como esperábamos.

Hace casi diez años empecé a construir Monica porque era terrible recordando cosas sobre la gente. Se me olvidaba el nombre del hijo de alguien, de qué habíamos hablado la última vez que nos vimos, o algo importante que me habían contado unos meses antes. Quería un sitio donde apuntar todo eso, sobre todo para compensar mi mala memoria, así que empecé a usar un CRM profesional.

No era una buena solución. El software estaba hecho para comerciales, que no era mi caso, y no me apetecía especialmente pagar por una herramienta diseñada para ayudarme a ganar dinero cuando lo único que quería era recordar cosas sobre mis amigos y mi familia. Busqué algo más adecuado y no lo encontré, así que decidí construirlo yo mismo.

Ese pequeño proyecto acabó convirtiéndose en Monica. Puse el código en GitHub, lo publiqué en Hacker News y a partir de ahí las cosas se descontrolaron un poco. Resultó que no era la única persona que buscaba algo así. Alexis se unió después como cofundador y, con los años, miles de personas han usado Monica, han contribuido con código, la han traducido, han reportado errores y la han instalado en sus propios servidores. El proyecto tiene ya más de 25.000 estrellas en GitHub y se ha convertido en uno de los CRM personales de código abierto más conocidos.

Estoy muy orgulloso de lo que Monica ha llegado a ser. Pero después de trabajar en ella tanto tiempo, he llegado a un punto en el que la versión actual ya no es el CRM personal que construiría hoy.

Casi diez años de decisiones

Cuando empecé Monica, obviamente no tenía diez años de experiencia pensando en cómo representar las relaciones personales en un software. La mayoría de las decisiones se tomaron cuando aparecía un problema. Necesitábamos contactos, así que construí contactos. Necesitábamos relaciones, así que añadí relaciones. Luego llegaron los recordatorios, las actividades, los regalos, las notas, las mascotas, las direcciones y muchas otras funciones.

No hay nada especialmente malo en construir software de esta manera. Así creció Monica, y muchas de esas decisiones tenían sentido en su momento. Pero después de casi diez años, se acumulan. Las ideas nuevas tienen que dar la vuelta a decisiones tomadas años antes, y lo que parecía un detalle de implementación se va convirtiendo poco a poco en un límite a lo que puedes hacer con el producto.

Con el tiempo, esto ha hecho que algunas partes de Monica sean más difíciles de cambiar de lo que deberían. Y más importante todavía: he cambiado de opinión sobre algunas de las decisiones originales.

¿Qué construiría hoy?

En algún momento empecé a hacerme una pregunta sencilla: si Monica no existiera y tuviera que construir un CRM personal hoy, con todo lo que he aprendido en la última década, ¿cómo sería?

Eso llevó rápidamente a preguntas mucho más básicas que qué funciones debería tener Monica. ¿Qué es exactamente una persona en Monica? ¿Cómo deberían funcionar las relaciones entre personas? ¿Cómo debería representar Monica al propio usuario? ¿Qué pasa cuando lo importante en la vida de alguien no es otra persona, sino un animal, una organización o algo completamente distinto? ¿Cómo deberían funcionar los recordatorios si las relaciones humanas no siguen un calendario de forma natural? ¿Qué debería representar una actividad? ¿Y cuánto de todo esto debería definir Monica por ti, para empezar?

Las relaciones son un buen ejemplo. Guardar que Monica es la hermana de Ross no parece especialmente complicado. Pero si Monica es la hermana de Ross, Ross también es el hermano de Monica. Una relación de madre o padre implica una relación de hijo o hija. Algunas relaciones tienen una dirección y otras no. Las familias reales incluyen divorcios, nuevos matrimonios, hijastros, medio hermanos, adopciones y todo tipo de estructuras que no encajan bien en una lista predefinida. Además, cada cultura describe los lazos familiares de forma distinta.

He pasado mucho tiempo pensando en esto para la nueva versión, y ahora veo las relaciones como un ámbito propio, en lugar de como un atributo pegado a un contacto. Hoy me parece obvio. No lo era cuando diseñamos las primeras versiones de Monica.

La personalización es otro terreno en el que he cambiado de opinión. Históricamente ha sido Monica la que ha definido qué es un contacto y qué información se puede guardar sobre él, y hemos añadido personalización alrededor de esa estructura. Para la v3 queremos darle la vuelta. Monica seguirá ofreciendo buenos valores por defecto, porque nadie quiere configurar cincuenta cosas antes de añadir su primer contacto, pero tu vida no debería tener que encajar en el esquema de base de datos que nosotros decidimos que era el correcto para todo el mundo.

Cuando empiezas a cambiar cosas a ese nivel, rediseñar unas cuantas pantallas no basta. Los cimientos también tienen que cambiar.

Qué quiero que sea la v3

Monica v3 no pretende ser el producto actual con una interfaz más bonita. La interfaz va a cambiar bastante, y quiero que resulte mucho más divertida y personal que la mayoría del software que usamos hoy, pero eso es solo una parte del trabajo.

Quiero construir un sistema muy potente para documentar a las personas y las relaciones en la vida de alguien. No me interesa demasiado optimizar todo pensando en la simplicidad si el resultado es un producto que solo sabe representar vidas simples. Prefiero tener buenos valores por defecto para quien no quiere configurar nada, y dar a quien sí quiere un control enorme sobre cómo funciona su Monica.

Eso significa tratar las relaciones como conceptos de primer nivel y dejar que cada persona decida qué información le importa. Monica tiene que poder con mucho más que una lista predefinida de campos colgada de un contacto. La parte difícil será hacer todo esto sin acabar con un software empresarial para gestionar a tus amigos y a tu familia, porque eso sería bastante horrible.

También hay cosas que no quiero cambiar. La privacidad y la propiedad de los datos siguen importando enormemente en Monica. El proyecto seguirá siendo de código abierto y podrás alojarlo tú mismo. Si vas a pasar años metiendo en un software parte de la información más personal de tu vida, creo que deberías tener todo el control posible sobre esa información.

Tampoco quiero que Monica decida cuánto te importa alguien. Puede ayudarte a recordar cosas, a organizar información y decirte que llevas tiempo sin hablar con alguien. La relación sigue siendo tuya y tú eres quien la mantiene.

Empezar de nuevo con diez años de experiencia

«Empezar de nuevo» no es del todo exacto, claro. Cuando creé Monica en 2017 tenía una idea y un problema que quería resolver. Esta vez tenemos casi diez años de experiencia trabajando en ese problema, miles de conversaciones con usuarios, contribuciones de gente de todo el mundo, dos generaciones del producto y una lista bastante larga de cosas que no volveríamos a hacer igual.

Mientras trabajamos en la v3, quiero documentar más de todo esto en público. Detrás de algo que desde fuera parece bastante simple hay una cantidad sorprendente de problemas difíciles, sobre todo cuando empiezas a pensar en serio en las relaciones, los recordatorios, la personalización y cómo representar en una base de datos algo tan desordenado como una vida humana. Escribiré sobre esos problemas, pero también sobre las decisiones técnicas y de diseño que vamos tomando y sobre las cosas que probamos y no acaban funcionando.

De eso va a tratar Building Monica. No sé cada cuánto publicaré un artículo, y no quiero inventarme un calendario de publicación solo por tener uno. Escribiré cuando tengamos algo interesante que contar.

En 2017 construí Monica a partir de lo que entendía del problema en aquel momento. Casi diez años después, entiendo ese problema de una forma muy distinta. Por eso lo estamos reconstruyendo.

2 min de lectura
Una nueva versión de Monica llega en 2026
Regis Freyd

Hace tiempo que no dábamos noticias serias sobre Monica.

Alexis y yo llevamos muchísimo tiempo pensando en una nueva versión. Más tiempo del que esperábamos al principio, claro. Reconstruir una aplicación desde cero mientras tienes un trabajo a tiempo completo, una familia y una vida fuera de Monica resulta que lleva su tiempo. Quién lo iba a decir.

Pero hoy por fin podemos decirlo: lanzaremos la nueva versión de Monica antes de que acabe 2026.

Esta nueva versión es la Monica que queríamos construir desde hace años. Será más rápida, más flexible, más fácil de usar y estará levantada sobre unos cimientos mucho más sólidos.

Monica seguirá ayudándote a recordar a las personas que te importan. Seguirá siendo privada. Seguirá siendo de código abierto. Y seguirás pudiendo instalarla gratis en tu propio servidor.

Estamos entusiasmados. Monica lleva casi diez años formando parte de nuestras vidas, y esto se siente como el comienzo de un capítulo completamente nuevo para el proyecto.

Queda mucho trabajo por hacer.

Pero llega. Esta vez de verdad.

Gracias por vuestra paciencia, vuestros mensajes y vuestro apoyo durante todos estos años. Estamos deseando enseñaros lo que hemos construido.

4 min de lectura
Chandler está en beta
Regis Freyd

Nos alegra muchísimo anunciar que, después de 18 meses de duro trabajo, nuestra nueva versión, con nombre en clave Chandler, ya está disponible en beta: https://beta.monicahq.com

Monica nació hace 7 años con el objetivo de ser un CRM personal. Esta nueva versión trata de documentar tu vida, incluido lo que hacen tus contactos, pero no solo eso.

¿Qué significa beta? Es como tener un puñado de erroncillos traviesos escondidos en nuestro software, jugando al escondite con nosotros. Estamos bastante seguros de que están ahí, pero no tenemos ni idea de cuáles son ni de dónde se esconden. Así que necesitamos que todas las almas valientes se unan a nuestro escuadrón cazaerrores y nos ayuden a sacarlos antes de la publicación general.

Chandler es una reinvención completa de Monica, construida desde cero. Hemos eliminado la enorme deuda técnica acumulada durante años y hemos añadido o mejorado muchas funcionalidades. Pese a no haber promocionado Chandler, ya hay muchos usuarios que lo han probado y han encontrado errores que hemos corregido, pero no hemos probado este software a gran escala. Así que, por favor, crea una cuenta y diviértete.

La versión disponible en el servidor de beta puede considerarse estable. No vamos a reiniciar la base de datos. Haremos copia de seguridad de tus datos a diario y los conservaremos cuando lancemos oficialmente la versión final.

Chandler tiene algunas limitaciones:

  • No puedes usar tu acceso actual de Monica,
  • No puedes importar tus datos,
  • No hay importación masiva de contactos disponible,
  • Todavía no tenemos API.

Tenemos muchas funcionalidades nuevas, una disposición nueva y el tan pedido modo oscuro.

En lo personal, la función de la que más orgulloso estoy es la posibilidad de personalizar casi todo en Chandler: desde la disposición hasta los módulos que puedes activar, pasando por los datos que puedes registrar sobre tu vida.

Chandler sigue siendo de código abierto y puede instalarse gratis en tu servidor, si sabes usar Docker o la línea de comandos. Puedes seguir modificando el código si quieres. Monica es, y siempre será, de código abierto. Este es el camino.

Por ahora, Monica es gratuita en nuestra instancia alojada (https://beta.monicahq.com), pero tendremos los mismos precios que la versión actual en cuanto consideremos que el producto es estable.

Estoy increíblemente orgulloso de lo que hemos logrado en estos ocho años. Por aquel entonces me daba miedo hacer público mi código porque sabía que era de mala calidad. Sorprendentemente, a la gente no pareció importarle. Hoy nuestro código sigue siendo público y ya no nos preocupa que lo juzguen. La aplicación sigue siendo una aplicación Laravel, con VueJS en el front-end y InertiaJS entre el front y el back. Es una pila sencillísima. Nos esforzamos por mantener el código lo más simple posible para facilitar el mantenimiento, la evolución y la búsqueda de desarrolladores que nos echen una mano.

Pronto migraremos nuestra imagen oficial de Docker a Chandler. La imagen se ha descargado más de 25 millones de veces, lo que nos hace sentir humildes.

En nombre de todo el equipo de Monica, gracias por seguir con nosotros todo este tiempo. «Todo el equipo de Monica» son básicamente dos amigos, Alexis y yo, apasionados de verdad por ofrecer herramientas interesantes que mejoren la vida de la gente. Monica sigue siendo un proyecto paralelo para nosotros, tenemos trabajos a jornada completa «al lado». Mientras algunos juegan a videojuegos o ven Netflix, nosotros «jugamos» en el código de Monica. Y nos encanta.

7 min de lectura
Llega una nueva Monica
Regis Freyd

Alexis y yo (Regis) llevamos unos meses trabajando (desde enero de 2022, en realidad) en una versión completamente nueva de Monica. La primera versión mayor de verdad desde que la lanzamos hace unos años.

Me tienta muchísimo llamarla «una versión más rápida, más moderna, mejor», porque lo es, pero soy malo con el marketing, así que diré simplemente que es una versión nueva y responderé abajo a las preguntas que puedas tener.

¿Qué queréis decir con versión nueva?

Una reescritura completa de Monica, desde cero.

¿Estáis locos?

Sí, pero también: el código de Monica ya es viejo. Viejo en el sentido de que tiene 7 años y lo han tocado cientos de personas. Hay conceptos en el código que dejamos pasar, ya fuera porque entonces no sabíamos hacerlo mejor o porque no queríamos molestar a quienes contribuían, y que ya no queremos. El proyecto tiene demasiadas dependencias y mantener el código se ha vuelto más difícil que antes. Cambiar algo es más arriesgado y lleva más tiempo. Además, hemos visto cómo usa la gente Monica y qué quiere hacer con ella, y el código actual nos limita demasiado si queremos dar soporte a esos usos. Por último, Monica sigue siendo un proyecto paralelo para nosotros. Nos apasiona muchísimo y también queremos divertirnos construyéndola. Y la versión actual ya no era tan divertida.

¿Qué queréis decir con reescritura?

Que hemos partido de un código vacío y hemos empezado desde ahí. Antes era una aplicación Laravel (o sea, PHP), con vistas Blade y algo de Vue aquí y allá. Ahora sigue siendo una aplicación Laravel (o sea, sigue siendo PHP), enteramente con Vue 3. Hemos simplificado muchas cosas, hemos hecho otras más flexibles y por tanto algo más complejas, pero creemos que con esto podemos sostener el futuro de Monica.

Esto también significa que tenemos una estructura de datos completamente nueva, apoyada en un nuevo esquema de base de datos.

¿La versión nueva se llamará Monica?

Ahora mismo, el nombre en clave de la nueva Monica es Chandler. No lo mantendremos: el nombre oficial de la nueva Monica será Monica. Por claridad, llamaremos Chandler a la nueva versión durante el resto del artículo.

¿Elegís PHP a pesar de \?

PHP es un gran lenguaje. Ya no estamos en la época de PHP 4 o 5. Además, es un lenguaje muy sencillo, lo que significa que hay mucha gente en el mundo que lee y entiende PHP. Elegir PHP hace que sea más fácil contribuir al proyecto, más fácil depurar, más fácil mantener y más fácil para nosotros encontrar gente que nos ayude, si hiciera falta en el futuro. Por último, el ecosistema de PHP es sencillamente estupendo, con Laravel abriendo camino con una de las mejores experiencias de desarrollo que conozco.

¿Qué funcionalidades tendrá Chandler?

En el lanzamiento queremos igualar el 100 % (o casi) de las funcionalidades que ofrece Monica v1. Aun igualándolas, queríamos simplificarlas (las tareas, por ejemplo) o hacerlas más robustas (los recordatorios, por ejemplo).

Una vez hecho eso, tenemos tantas ideas sobre en qué debería convertirse Monica que abruma. En esencia, Monica nació como el primer CRM personal (o PRM, gestor de relaciones personales) que existió. Y así lo presentamos. Pero después de años trabajando en ella, hablando con la gente y leyendo los miles de correos que nos habéis enviado, nos dimos cuenta de que Monica es sobre todo una forma de documentar tu vida, signifique lo que signifique eso para ti. Así que Monica tratará de documentar tu vida y de darte herramientas para hacerlo a tu manera.

Se lee por todas partes que los productos deben tener criterio y una personalidad fuerte para que la gente los use como tú quieres que los use. Esa fue la dirección de la v1. Ahora queremos cambiar esa idea. Queremos que cada persona use y configure Monica como quiera. ¿Quiénes somos nosotros para decirte que solo deberías usar 3 pronombres para tus contactos, o qué tipos de relación deberías tener? Chandler será totalmente personalizable, desde lo que ves en la interfaz hasta el tipo de datos que puedes introducir. La gente de marketing diría «Chandler eres tú», y en cierto sentido es verdad. La contrapartida: desde el punto de vista técnico es más difícil de gestionar, pero eso es cosa nuestra.

¿Cuándo estará lista? ¿Puedo probarla?

Estará lista cuando esté lista. Recuerda que no trabajamos en esto a tiempo completo, en absoluto. Alexis y yo tenemos trabajos exigentes, familias, amigos y Monica (y OfficeLife, además).

AHORA BIEN.

Ya hemos hecho mucho. Algunas funcionalidades importantes que conoces y aprecias todavía faltan en la nueva versión: acontecimientos vitales, actividades, regalos y CalDAV/CardDAV, por nombrar algunas. Los acontecimientos vitales, en particular, son un bocado grande, porque queremos replantear el concepto por completo y hacerlo realmente útil. Además, y este es un «además» enorme, ahora mismo no tenemos API. Como es un código nuevo, no podemos copiar sin más tus contactos de la v1 y esperar que aparezcan en la v2. Así que, si publicáramos algo ahora, no podrías importar tus datos. Y eso nos parece un problema.

DICHO ESTO.

Seguimos necesitando gente que pruebe y nos ayude a encontrar errores, aunque aquí no cometamos errores (lol). Necesitamos gente que corrija erratas en la documentación. Así que lo que podríamos hacer es lanzar Chandler en un estado muy alfa, gratis para todo el mundo hasta que deje de ser alfa.

¿Sigue siendo de código abierto? ¿Puedo usarla gratis?

Sí, sigue siendo de código abierto, con la misma licencia que antes. Eso significa que Monica es gratuita, claro, salvo que uses la versión que alojamos nosotros, que con el tiempo costará algo, como la versión actual. Sí, puedes instalarla donde quieras, en tu propio servidor. Como Chandler no comparte código con la anterior, todavía no tenemos el ecosistema tan rico de antes ni todas esas maneras distintas de instalarla en cualquier parte, pero llegaremos. Sí, puedes seguir contribuyendo al código, corregir errores, añadir funcionalidades, aunque seguimos teniendo derecho a rechazar tus pull requests si creemos que no queremos dar soporte a lo que propones.

¿Cuál es el futuro de Monica v1?

Daremos soporte a la v1 hasta que Chandler salga de alfa y beta. Después quedará obsoleta, pero quien la tenga alojada podrá seguir usándola si quiere. La v1 que alojamos nosotros dejará de tener soporte a partir de entonces.

¿Se puede ya contribuir al código?

El repositorio ya está disponible en GitHub, pero estamos lejos de tener la madurez del repositorio principal actual. Eso significa que todavía no estamos preparados para recibir contribuciones de todo el mundo, ya que las cosas cambian casi a diario, pero si te parece bien, adelante.

¿Qué viene después?

Antes de nada, muchísimas gracias por haber leído esta entrada entera. Estamos muy agradecidos por nuestra comunidad y por cómo seguís apasionados con esta pequeña herramienta que nos divertimos construyendo. Alexis y yo seguimos muy motivados con ella y os damos las gracias por acompañarnos. Seguiremos en contacto.

2 min de lectura
Dejamos Stripe por nuestro propio portal de clientes
Regis Freyd

Ahora mismo usamos Stripe para gestionar nuestras suscripciones. Aunque adoramos Stripe desde el punto de vista de quien programa, lidiar con los impuestos de todo el mundo es un auténtico lío, sobre todo al cierre del ejercicio fiscal. Nuestro contable nos odia. Necesitamos cambiar a otra pasarela de pago que gestione todos los impuestos como es debido. Esa pasarela se llama Paddle.

Hay otro motivo por el que queremos cambiar de planteamiento. Monica es, ante todo, un producto de código abierto. Tenemos una comunidad enorme. Muchos de vosotros alojáis Monica en vuestros servidores. Como nosotros también alojamos el producto para poder monetizarlo, hasta ahora hemos incluido en el código principal todo lo necesario para gestionar las suscripciones. Es mucho código. Nos ocupamos de dar de alta, editar y cancelar una suscripción, con todos los permisos que ello implica, y así sucesivamente. No es lo ideal.

Hemos decidido sacar todo el código de facturación del código principal y crear un portal nuevo, el portal de suscripciones, para gestionar tus suscripciones de Monica. Tendrás que crear una cuenta en ese sitio y comprar una clave de licencia que después pegarás en tu cuenta de Monica. No hace falta nada más.

Si ahora mismo tienes una suscripción, te permitiremos migrar tu cuenta a la nueva sin complicaciones. Cada uno recibirá más instrucciones por correo.

Tenemos previsto pasar a este nuevo portal de clientes en las próximas semanas.

4 min de lectura
Monica 2.16 y qué viene después para Monica
Regis Freyd

Ha pasado mucho tiempo. De hecho, ha pasado un año desde la última entrada del blog. En esta hablaremos de la nueva versión 2.16 que acabamos de publicar, de lo que ocurrió durante 2019 y de qué viene después para Monica.

La versión 2.16 contiene 226 cambios, la mayoría correcciones de errores o mejoras en el código. Pero también trae un buen puñado de novedades, que explicamos abajo.

Una nueva forma de añadir actividades

Ahora puedes añadir actividades sobre la marcha, en lugar de ir a una página nueva para hacerlo. Igual que con las llamadas, puedes indicar las emociones que sentiste durante una actividad.

El formulario para añadir una actividad a un contacto, que pregunta qué hiciste y cuándo.

Página de ajustes de la API mejorada

Casi todo lo que puedes hacer con Monica puede hacerse a través de la API. Para nosotros es importantísimo que la gente pueda manipular sus datos a voluntad. Por eso ya tocaba mejorar un poco la página de ajustes de la API y darle algo de cariño.

La pantalla de ajustes de la API, con los tokens de acceso personal y los clientes OAuth.

Además hemos añadido muchos métodos nuevos a la API para seguir con nuestra apertura hacia otros sistemas.

Muchos cambios internos

También hemos cambiado por completo cómo se almacenan los datos, añadiendo claves foráneas a todas las tablas de la base de datos. Aunque esto no tendrá impacto en la experiencia de quien usa Monica, para quienes desarrollamos es bastante importante, porque nos dará más control y flexibilidad en general. Fue un cambio enorme y las pull requests tardaron casi 11 meses en integrarse.

También hemos rehecho por completo el proceso de exportación de datos, que debería funcionar sin fallos a partir de ahora (o como suele decirse: el 60 % de las veces funciona siempre).

¿Qué pasó en 2019?

En 2019 bajamos un poco el ritmo en cuanto a versiones anuales. Además, la actividad en este blog ha sido inexistente. Sin embargo, eso no afectó al número de altas, ni al número de descargas, ni al cariño que la gente de internet tiene por este proyecto.

En esencia, Monica nunca ha estado más fuerte. Tenemos casi 5 millones de descargas de nuestra imagen oficial de docker. Tenemos decenas de miles de personas en nuestra versión alojada. Monica sigue apareciendo en Hacker News y nuestro gestor de incidencias en GitHub está tan activo como siempre. Además, integramos 875 pull requests en 2019.

Entonces, ¿a qué se debe este silencio? Principalmente a mí (Regis). Empecé Monica hace ya casi cuatro años. Tener un proyecto popular es muy divertido, pero también consume mucha energía y motivación. Sobre todo porque Monica sigue siendo un proyecto paralelo tanto para mí como para Alexis. Este año Monica ha sido demasiado para mí, y normalmente soy yo quien escribe en este blog o en redes sociales. Tuve un desgaste de proyecto paralelo, por así decirlo. Alexis ha cargado con mucho trabajo para mantener y hacer evolucionar el producto, pero yo no pude dedicarle tanto tiempo como antes ni publicar noticias del proyecto. Necesitaba hacer otra cosa, despejarme y volver solo cuando estuviera listo. Ahora lo estoy y tengo más motivación que nunca para retomar el trabajo y volver a disfrutarlo.

Monica en 2020

Hace cuatro años, Monica fue uno de los primeros CRM personales populares. Hoy la competencia es mayor que nunca (una docena, la última vez que miré). Pero creo que tenemos una ventaja que nuestros competidores no pueden arrebatarnos: somos de código abierto, no tenemos gastos ni costes, o casi, y no somos codiciosos. Todo lo que hacemos lo hacemos pensando primero en la comunidad. Cuantas más instancias de Monica haya por ahí, más contentos estamos: eso significa que no tenemos ningún control sobre los datos de nuestros usuarios.

En 2020:

  • Queremos continuar nuestro trabajo de apertura y transparencia. Eso significa más formas de exportar o importar datos en un formato estándar.
  • Queremos ofrecer webhooks para que los sistemas externos sepan cuándo cambian los datos de tu cuenta (si así lo deseas, claro).
  • Creo que Monica es hoy la mejor herramienta para documentar tus contactos personales. Puedes registrar cualquier cosa, de verdad. Ahora que tenemos una base muy sólida, creo que es momento de ampliarla. Es hora de dejarte hacer algo más con tus contactos, creando grupos (o familias), eventos, oportunidades, etcétera. Nos centraremos en conceptos sencillos que se irán añadiendo poco a poco a la plataforma y que te darán la mayor flexibilidad posible.

Monica es una herramienta para ti. Sigue compartiendo ideas, sigue escribiéndome sobre lo que deberíamos hacer a continuación. Estamos aquí para ti.

Y feliz año nuevo 😀

4 min de lectura
Monica 2.11.0
Regis Freyd

Después de más de un mes de trabajo, me alegra anunciar la nueva versión de Monica, con subida de fotos, mayor seguridad, mejor gestión de las llamadas, información del tiempo, la llegada de las emociones y muchas otras mejoras.

Subida de fotos

Ahora puedes subir fotos a la página de perfil de un contacto. El número de fotos que puedes guardar depende del límite de almacenamiento de tu cuenta, que es de 512 MB en https://monicahq.com (y es configurable en cada instancia). Poder subir fotos abre muchas posibilidades de cara al futuro.

La pestaña de fotos de un contacto, vacía, ofreciendo subir la primera imagen.

Códigos de recuperación

La seguridad es importantísima, sobre todo en una herramienta como Monica, que guarda muchos detalles íntimos. Monica ya admite la autenticación en dos pasos (también conocida como 2FA) y U2F para ayudarte a proteger tu cuenta. A partir de Monica 2.11 puedes generar códigos de recuperación para desbloquear tu cuenta en caso de que pierdas la posibilidad de entrar con 2FA. Eso sí, ten cuidado: como esos códigos dan acceso a tu cuenta, guárdalos en un lugar muy seguro.

La ventana de códigos de recuperación, con ocho códigos de un solo uso y uno ya tachado.

Llamadas telefónicas

Las llamadas han recibido mucho cariño en esta versión. Primero, hemos rediseñado el proceso para registrarlas. Después hemos añadido (por fin) la posibilidad de editar una llamada realizada en el pasado. Y como extra, ahora puedes indicar quién inició la llamada.

Emociones

¿No sería estupendo poder decir con mucha precisión cómo te sentiste cuando ocurrió algo? Monica 2.11 introduce la noción de emociones, basada en el trabajo del Dr. Phillip Shaver. En su trabajo, las emociones se ordenan en 3 categorías principales:

  • emociones primarias (amor, alegría, sorpresa, ira, tristeza y miedo),
  • emociones secundarias (amor -> afecto, deseo, añoranza),
  • emociones terciarias (amor -> afecto -> adoración, amor, cariño, atracción).

Hemos incorporado esos conceptos a Monica, empezando por las llamadas. Un nuevo menú desplegable te permite elegir todas las emociones que quieras, para representar con mucha precisión lo que sentiste durante una llamada. Pensamos añadir las emociones también a otros elementos clave, como las actividades.

El formulario de llamada, que pregunta cómo te sentiste durante la llamada, con dos emociones ya elegidas.

El tiempo

Cuando hablas con un amigo que vive en otra zona, lo más probable es que acabéis hablando del tiempo. Monica te ayuda aquí mostrando el tiempo actual del lugar donde vive tu amigo. Esta información procede de la primera dirección que aparece en la página de perfil del contacto. Eso significa también que si no hay ninguna dirección, no se mostrará información meteorológica.

Los datos del tiempo vienen de Darksky y se actualizan cada 6 horas. La única información que se comparte con Darksky es la latitud y la longitud, nada más. Para quienes tienen su propia instancia, Darksky ofrece un plan gratuito de 1000 llamadas al día, que debería ser más que suficiente.

La ficha de un contacto mostrando el tiempo que hace donde vive esa persona.

Coordenadas GPS

Hablando de latitud y longitud, teníamos que encontrar un mecanismo para obtener esos dos datos de cada dirección introducida en Monica si queríamos mostrar el tiempo. Monica 2.11 ya puede geocodificar automáticamente cualquier dirección para encontrar sus coordenadas.

Cuando introduces una dirección, y si el servicio está configurado en tu instancia, intentaremos geocodificarla automáticamente, salvo que tú mismo indiques la latitud y la longitud de ese lugar.

De la geocodificación se encarga LocationIQ, una empresa independiente y estupenda que ofrece un plan gratuito muy generoso de 10 000 llamadas al día. No compartimos con LocationIQ nada más que la dirección, para obtener las coordenadas.

Tareas

En tu panel ya puedes añadir tareas que no estén vinculadas a ningún contacto.

La pestaña de tareas del panel, con tres tareas que no dependen de ningún contacto.

Mejoras

Hemos reorganizado mucho la forma en que están escritas las cosas por dentro, para seguir con nuestra búsqueda de la plataforma más estable posible. Además hemos seguido aumentando la cobertura de código (es decir, la parte de nuestro código que se prueba de forma automática). Estamos en el 66 % para todo el código.

Esperamos que la 2.11 te guste tanto como a nosotros.

1 min de lectura
Situación de las aplicaciones móviles
Regis Freyd

Acabo de retirar las aplicaciones móviles tanto de la App Store como de la Play Store. La única forma de conseguirlas ahora es compilarlas desde el repositorio de GitHub.

Aunque Theo hizo un trabajo increíble en la primera versión de esas aplicaciones, su desarrollo se detuvo a principios de este verano mientras el de Monica, la plataforma, siguió avanzando. Ahora estamos en una situación en la que la app móvil no está a la altura de la plataforma y, peor aún, vamos a romper cosas en la API que la app no soportará.

Sigo convencido de que el crecimiento y la adopción de Monica pasarán por una aplicación móvil.

Me gustaría prometer maravillas y anunciar que tendrás una app nueva en 2 meses, pero en realidad no sé cuánto tiempo llevará. Como Monica sigue siendo un proyecto paralelo, podrían ser 6 meses o 2 años. Pero algún día tendremos una gran aplicación móvil, tan buena como la versión web (o mejor).

Gracias por tu paciencia.

Artículos 1 a 10 de 43