A Monica v3 chega antes do fim de 2026. Reconstruída do zero. Continua de código aberto. Veja o que vem por aí
Monica

Blog

Notas sobre construir a Monica, manter dados pessoais privados e a pequena mecânica de continuar em contato.

Feed RSS
10 min de leitura
Building Monica: modelar as relações entre pessoas
Regis Freyd

Quando começámos a reconstruir o Monica, sabia que as relações seriam uma das áreas que teríamos de repensar. O que não esperava era a dificuldade de sequer definir o que é uma relação.

Um CRM pessoal precisa de saber como as pessoas estão relacionadas entre si. Alguém é a tua mãe, o teu irmão, o teu amigo, a tua colega ou o teu companheiro. O Monica faz isto há anos e, do ponto de vista de quem o usa, é uma funcionalidade bastante simples: escolhes uma pessoa, escolhes uma relação e está feito.

Infelizmente, desenhar o que acontece por trás desse pequeno menu não é nada simples.

Mesmo as relações simples não são assim tão simples

Digamos que o Monica é irmã do Ross. Do ponto de vista dela, o Ross é o seu irmão. As duas frases descrevem a mesma relação, mas as palavras que usamos dependem da pessoa que estamos a olhar.

O mesmo acontece por toda a família. A Rachel é mãe da Emma, enquanto a Emma é filha da Rachel. A tia de alguém tem uma sobrinha ou um sobrinho. Uma avó tem uma neta ou um neto.

Outras relações não funcionam assim. O Chandler e o Joey são amigos. A palavra é a mesma independentemente do lado de que se olha. Com primos e colegas pode ser igual.

Já temos portanto comportamentos diferentes. Às vezes uma relação muda de nome conforme o lado de que olhamos, às vezes não, e às vezes a palavra que usamos depende do género de uma das duas pessoas.

E esta é a parte fácil.

As famílias são confusas

Imagina que duas pessoas se casam e têm dois filhos. Divorciam-se. Uma delas volta a casar com alguém que já tem filhos de outra relação e talvez tenham outro filho juntas.

Não é uma família particularmente invulgar, mas agora temos pais, filhos, irmãos, meios-irmãos, enteados, padrastos e madrastas, cônjuges e ex-cônjuges.

Isto também começa a levantar perguntas para as quais não creio que exista sempre uma resposta universal. Se te divorciares, a tua sogra deixa de ser tua sogra? Tecnicamente, talvez. Mas e se a conheces há vinte anos e continuas a considerá-la parte da tua família? Certamente não deixa de ser a avó dos teus filhos só porque o teu casamento acabou.

Depois há pais biológicos, pais adotivos, famílias de acolhimento e tutores. Alguém pode ter várias pessoas que considera seus pais, e essas relações não significam necessariamente a mesma coisa. Há familiares afastados, pessoas que consideram alguém um irmão ou uma irmã sem qualquer relação biológica, antigos companheiros que continuam muito próximos e pais que criam filhos em conjunto sem já serem um casal.

A árvore genealógica arrumada que tendemos a imaginar quando pensamos neste problema não sobrevive ao contacto com muitas famílias reais.

E mesmo quando a estrutura familiar é simples, as relações mudam. Quem é hoje o teu companheiro pode ser o teu ex daqui a cinco anos. Isso não significa que a relação antiga deva simplesmente desaparecer. O facto de duas pessoas terem estado casadas durante quinze anos continua a fazer parte da sua história, mesmo que já não estejam.

As relações têm um passado, o que torna igualmente problemático representar apenas o seu estado atual.

Duas pessoas podem não concordar sobre a sua relação

As relações familiares dão-nos ao menos alguns factos com que trabalhar. A amizade é ainda menos precisa.

Se o Monica considera a Rachel uma amiga próxima, a Rachel considera necessariamente o Monica uma amiga próxima? Não temos a mínima ideia.

O mesmo problema existe com mentores, conhecidos e muitas outras relações. Alguém pode considerar outra pessoa o seu mentor mesmo que essa pessoa nunca usasse a palavra. Alguém pode considerar um velho amigo praticamente família enquanto a outra pessoa o vê como alguém que conheceu há anos.

Isto é muito importante no Monica, porque a informação não pretende descrever um grafo social objetivo. É a tua informação sobre as pessoas da tua vida.

Quando escreves que alguém é teu amigo, estás a descrever a relação como a entendes. O Monica não tem a versão da outra pessoa e, em muitos casos, provavelmente não existe uma única resposta correta.

Isto torna-se particularmente estranho quando o software tenta transformar as relações em algo mensurável. Alguém é melhor amigo por o vermos todas as semanas? Uma amiga que não vemos há cinco anos é menos importante do que um colega com quem falamos todos os dias? Obviamente, a frequência diz-nos algo sobre uma relação, mas não nos diz o que essa relação significa para alguém.

O tempo também não encaixa bem

Um colega pode tornar-se amigo. Um amigo pode tornar-se companheiro. Um companheiro pode tornar-se ex-companheiro e, anos mais tarde, essa mesma pessoa pode voltar a ser um amigo.

Se o Monica registar que duas pessoas estão casadas e elas se divorciarem mais tarde, o que deve acontecer ao casamento? Removê-lo tornaria a informação atual correta, mas também apagaria algo bastante importante da sua história.

Podíamos guardar datas, só que muitas vezes as pessoas não as sabem. Posso saber que dois amigos já estiveram juntos sem ter a menor ideia de quando começaram a namorar nem de quando exatamente se separaram. Exigir datas precisas deixaria o modelo mais limpo e o produto bastante mais irritante de usar.

Também não há garantia de que as relações passem de forma limpa de um estado para outro. As pessoas não acordam necessariamente uma manhã e passam de «amigo» a «companheiro». Algumas relações têm um início claro, como um casamento. Muitas outras não.

A base de dados gostaria muito que soubéssemos quando tudo começou e quando tudo terminou. Na maior parte do tempo, não sabemos.

O inglês não é o modelo do mundo inteiro

Outro problema é que a maioria dos primeiros exemplos que nos vêm à cabeça tem por base o inglês.

O inglês usa «cousin» para um grande número de relações familiares, enquanto outras línguas podem ser muito mais precisas. O mandarim, por exemplo, tem palavras diferentes para primos conforme o lado da família de que vêm, o seu género e às vezes a sua idade. O sueco distingue os quatro avós: mormor é a mãe da tua mãe, morfar o pai da tua mãe, farmor a mãe do teu pai e farfar o pai do teu pai. O inglês dá-nos apenas «grandmother» e «grandfather».

O coreano dá outro exemplo. Até algo tão simples como «irmão mais velho» muda conforme quem fala. Um homem chama ao seu irmão mais velho hyeong, enquanto uma mulher lhe chama oppa. O vocabulário das relações contém informação que não está presente na palavra inglesa «brother».

Isto é importante para o Monica porque está traduzido em muitas línguas e é usado em todo o mundo. Não podemos desenhar todo o sistema de relações partindo do princípio de que o inglês contém a lista canónica das relações e que todas as outras línguas só têm de traduzir essas palavras.

É um problema que já encontrámos no Monica, e reconstruí-lo não o faz desaparecer por magia.

A família não é sequer a parte mais difícil

Ao menos as relações familiares costumam ter nome. O resto das nossas relações é muito menos estruturado.

«Amigo» pode descrever alguém que conheces há trinta anos e com quem falas todas as semanas, mas também alguém que vês duas vezes por ano e de quem gostas muito. Um colega pode ser a pessoa sentada ao teu lado todos os dias ou alguém com quem trabalhaste há quinze anos.

E as pessoas não cabem numa categoria de cada vez. Alguém pode ser teu colega, teu amigo e teu antigo colega de casa. O teu sócio também pode ser teu irmão. A tua vizinha pode ser a mãe da melhor amiga da tua filha.

Às vezes é o próprio contexto que importa. Conheces alguém porque andaram na mesma escola, jogaram na mesma equipa, viveram no mesmo edifício ou trabalharam no mesmo projeto. «Amigo» pode ser tecnicamente correto, mas perde a informação que explica porque é que essa pessoa faz parte da tua vida.

É aqui que uma pergunta simples como «de onde conheces esta pessoa?» se torna surpreendentemente difícil de responder com um único campo.

Uma relação pode implicar muitas outras

Suponhamos que o Ross é irmão do Monica e que o Ross tem um filho chamado Ben. Compreendemos imediatamente que o Monica é tia do Ben.

O software pode chegar à mesma conclusão. E, uma vez que começa a fazê-lo, pode continuar.

Pais implicam filhos. Filhos com os mesmos pais podem ser irmãos. Irmãos com filhos criam tias, tios, sobrinhas e sobrinhos. Acrescenta outra geração e tens avós e netos. Muito depressa, um pequeno número de relações pode produzir um grafo familiar bem maior.

Mas o facto de o software poder inferir algo não significa necessariamente que o deva fazer.

O novo cônjuge de um pai não é automaticamente pai da criança. Duas pessoas que partilham um progenitor podem ser tecnicamente meios-irmãos, mas talvez não se conheçam. A informação que o Monica tem pode também estar simplesmente incompleta. E mesmo que a relação familiar seja tecnicamente correta, pode não ser a relação que as pessoas envolvidas usariam para se descrever.

Cada vez que o software infere mais uma relação, ganha também mais uma oportunidade de estar errado.

Há mais perguntas do que respostas

Quanto mais trabalhamos nisto, mais casos limite encontramos.

Deve o Monica lembrar-se da história de uma relação ou apenas do seu estado atual? Podem duas pessoas ter várias relações ao mesmo tempo? «Melhor amigo» é uma relação diferente de «amigo», ou é outra coisa? O que acontece quando conhecemos a mãe de alguém mas não temos essa mãe como contacto no Monica? Como descrevemos relações que nos são importantes mas não têm um nome conveniente?

Algumas destas são questões de base de dados. A maioria não é.

A parte difícil é decidir o que queremos dizer quando dizemos que duas pessoas têm uma relação, porque os humanos não usam essa palavra com nada que se aproxime da precisão que uma base de dados preferiria.

Na interface, tudo isto pode acabar por se resumir a algumas palavras no perfil de alguém: mãe, irmão, amigo, colega.

Acertar nessas poucas palavras é um dos problemas mais difíceis com que estamos a lidar ao reconstruir o Monica.

8 min de leitura
Building Monica: construímos o navegador de base de dados que queríamos para Laravel
Regis Freyd

Este é mais um artigo da série Building Monica, onde escrevo sobre o processo de reconstruir o Monica de raiz. A maioria dos artigos desta série será provavelmente sobre o produto em si: as relações, os lembretes, a personalização, as atividades, a privacidade e todas as questões que surgem ao tentar representar a vida das pessoas em software. Mas reconstruir uma aplicação grande também produz coisas mais pequenas pelo caminho. O LaraDB é uma delas.

Enquanto trabalhava no Monica v3, dei por mim a passar muito tempo a olhar diretamente para a base de dados. Isto não é particularmente invulgar quando se constrói uma aplicação Laravel. Cria-se um contacto e verifica-se o que foi escrito. Cria-se uma relação e inspecionam-se as linhas relacionadas. Altera-se um lembrete e confirmam-se as datas. Executa-se uma ação, atualizam-se os dados, segue-se uma chave estrangeira, e repete-se o processo muitas vezes ao longo do dia.

Já existem muitas boas formas de fazer isto. O Tinker é útil, mas não é simples nem rápido de usar. Aplicações como o TablePlus, o DBeaver, o phpMyAdmin ou o Adminer podem ser muito úteis, mas não para uma consulta rápida. Uso o TablePlus com regularidade, sobretudo quando preciso de escrever consultas, editar dados ou inspecionar o esquema em detalhe. Mas na maior parte do tempo, enquanto desenvolvia o Monica, não precisava de uma ferramenta de gestão de bases de dados. Só queria uma forma rápida de ver o que estava na base de dados sem sair da aplicação em que já estava a trabalhar.

Foi essa a ideia inicial por trás do LaraDB. Instalar uma dependência de desenvolvimento, ir a /db e ver a base de dados.

composer require --dev monicahq/laradb

O que se obtém é muito simples. As tabelas aparecem à esquerda, as linhas à direita, e a página corre dentro da própria aplicação Laravel. O LaraDB suporta SQLite, MySQL e MariaDB, e PostgreSQL.

O LaraDb a mostrar a tabela value_list_items: a lista das 41 tabelas à esquerda, as respetivas linhas à direita, e as colunas de chaves estrangeiras apresentadas como ligações que se podem seguir.

Um navegador em vez de um gestor de bases de dados

A decisão mais importante que tomámos foi manter o LaraDB só de leitura. Não tem botão de edição, botão de eliminação, formulário de inserção nem consola SQL. As duas rotas expostas pelo pacote são rotas GET, e o pacote apenas emite instruções SELECT.

Em parte é uma decisão de segurança, mas é sobretudo uma questão de âmbito. Já existem ferramentas maduras para gerir bases de dados, e reproduzir um subconjunto das suas funcionalidades dentro do Laravel não tornaria o LaraDB mais útil para o problema que estávamos a tentar resolver.

O pacote evita também aceitar identificadores ou consultas arbitrárias vindas do browser. Uma tabela pedida tem primeiro de existir no esquema descoberto pelo driver. Os identificadores são escapados de acordo com o motor de base de dados. Os valores usados ao seguir chaves estrangeiras são passados como parâmetros ligados. Não há interface para submeter SQL arbitrário porque SQL arbitrário não faz parte do propósito do pacote.

Uma ferramenta pequena pode continuar compreensível se tiver uma tarefa muito precisa. O LaraDB destina-se a responder o que está neste momento na base de dados e como essas linhas se relacionam entre si. Não se destina a tornar-se um substituto de um cliente de base de dados a sério.

Aquilo de que acabámos por precisar

A interface reflete esse âmbito estreito. O LaraDB lista as tabelas do esquema atual e mostra as suas linhas numa tabela densa. Os tipos das colunas são apresentados, as chaves primárias e estrangeiras são identificadas, os valores NULL distinguem-se visualmente das cadeias vazias, e os valores longos são truncados para que colunas grandes de texto ou de JSON não tornem a página inutilizável.

As chaves estrangeiras revelaram-se uma das funcionalidades mais úteis para o Monica. Se uma coluna referencia outra tabela, o seu valor pode ser seguido diretamente. Clicar nele abre a tabela referenciada, filtrada pela linha correspondente. Isto é especialmente útil no Monica v3, porque um número crescente de domínios é representado através de relações explícitas entre várias tabelas em vez de registos grandes e autocontidos.

A página expõe também algum contexto sobre a base de dados e a consulta atuais. Consoante o que o motor de base de dados disponibiliza, o LaraDB pode mostrar o motor e a versão, o nome da base de dados, o tamanho, o número de índices e outros metadados específicos do motor. Para a página atual, mostra ainda a instrução SQL que produziu o resultado e quanto tempo a consulta demorou.

Existe também uma representação em JSON de uma tabela. Foi barata de acrescentar depois de a camada de base de dados estar separada da renderização do HTML, e tem sido útil para inspecionar dados fora da própria página.

O frontend é deliberadamente autónomo. O pacote traz o seu próprio CSS e o seu próprio JavaScript e não depende da cadeia de assets da aplicação anfitriã. Instalar o LaraDB não deveria obrigar a acrescentar uma configuração de Tailwind, uma dependência do Alpine ou mais um passo de compilação a um projeto existente.

A abstração da base de dados tornou-se o verdadeiro trabalho

Mostrar linhas num browser é simples. Suportar SQLite, MySQL e PostgreSQL de forma coerente foi onde acabou por estar a maior parte do trabalho interessante.

Os motores diferem bastante na forma como expõem o esquema e os metadados da base de dados. Listar tabelas, descrever colunas, encontrar chaves primárias, resolver chaves estrangeiras, contar linhas e obter informação ao nível da base de dados exigem consultas diferentes consoante o motor. Até pormenores como o escape de identificadores têm de ser tratados corretamente, em vez de como uma operação SQL genérica.

O LaraDB esconde essas diferenças atrás de uma pequena interface de driver. A camada Laravel pede tabelas, colunas, linhas e metadados sem precisar de saber se a ligação subjacente é SQLite, MySQL ou PostgreSQL.

Uma parte simplificada do contrato tem este aspeto:

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 driver de base de dados implementa essas operações de forma diferente, enquanto o resto do LaraDB trabalha com os objetos de resultado comuns devolvidos pela interface.

Uma consequência interessante deste desenho é que o núcleo do código que lê a base de dados não depende de todo do Laravel. Funciona diretamente com PDO. O Laravel trata da descoberta do pacote, da configuração, do routing e da renderização, mas a inspeção da base de dados pode ser usada em separado.

use LaraDb\DriverFactory;

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

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

Só de leitura não é o mesmo que inofensivo

O facto de o pacote ser só de leitura impede-o de corromper a base de dados, mas não torna inofensivo expor essa base de dados. Um navegador de base de dados pode revelar todas as linhas de todas as tabelas a quem quer que consiga chegar até ele, o que é obviamente uma preocupação séria para uma aplicação como o Monica.

Por essa razão, o LaraDB foi pensado para ser instalado como dependência de desenvolvimento.

composer require --dev monicahq/laradb

Um deploy normal de produção com composer install --no-dev não conterá o pacote. O LaraDB está também desativado por omissão fora do ambiente local, e as suas rotas usam por omissão os middleware web e auth quando estão ativas.

Coisas pequenas que saem de uma reconstrução grande

Quando comecei a série Building Monica, esperava que a maior parte do que escrevesse se centrasse nas grandes decisões de arquitetura e de produto por trás do Monica v3. Isso continuará a ser assim. Mas quero também documentar algumas das ferramentas e ideias mais pequenas que saem da reconstrução, porque também fazem parte do trabalho.

O LaraDB não é uma parte importante do Monica v3, e não está a tentar tornar-se um grande produto por si só. É apenas uma pequena ferramenta de desenvolvimento que eliminou um incómodo recorrente para nós. O pacote é útil precisamente porque o seu âmbito é limitado, e gostava que continuasse assim.

Se trabalha em aplicações Laravel e abre muitas vezes um cliente de base de dados só para inspecionar o que o seu código acabou de escrever, o LaraDB pode ser-lhe útil também.

composer require --dev monicahq/laradb

Depois vá a /db.

O código-fonte está disponível em github.com/monicahq/laradb.

8 min de leitura
Estamos reconstruindo o Monica
Regis Freyd

Este é o primeiro artigo de uma série chamada Building Monica. Quero usar esta série para documentar como estamos reconstruindo o Monica, o CRM pessoal de código aberto, a partir do zero. Vou falar dos problemas que estamos tentando resolver, das decisões que tomamos pelo caminho e provavelmente de algumas coisas que não saem como esperávamos.

Há quase dez anos, comecei a construir o Monica porque eu era péssimo em lembrar coisas sobre as pessoas. Eu esquecia o nome do filho de alguém, sobre o que tínhamos conversado na última vez que nos vimos, ou algo importante que me contaram alguns meses antes. Eu queria um lugar para anotar tudo isso, principalmente para compensar minha memória ruim, então comecei a usar um CRM profissional.

Não era uma boa solução. O software era feito para vendedores, o que eu não era, e eu não tinha muita vontade de pagar por uma ferramenta pensada para me ajudar a ganhar dinheiro quando tudo o que eu queria era lembrar coisas sobre meus amigos e minha família. Procurei algo mais adequado, não encontrei nada e decidi construir o meu próprio.

Esse pequeno projeto acabou virando o Monica. Coloquei o código no GitHub, publiquei no Hacker News e as coisas ficaram um pouco malucas a partir daí. Descobri que eu não era a única pessoa procurando algo assim. O Alexis entrou depois como cofundador e, ao longo dos anos, milhares de pessoas usaram o Monica, contribuíram com código, traduziram o projeto, relataram erros e instalaram a aplicação nos próprios servidores. O projeto já tem mais de 25.000 estrelas no GitHub e se tornou um dos CRMs pessoais de código aberto mais conhecidos.

Tenho muito orgulho do que o Monica se tornou. Mas depois de trabalhar nele por tanto tempo, cheguei a um ponto em que a versão atual não é mais o CRM pessoal que eu construiria hoje.

Quase dez anos de decisões

Quando comecei o Monica, obviamente eu não tinha dez anos de experiência pensando em como representar relacionamentos pessoais em software. A maior parte das decisões foi tomada no momento em que um problema aparecia. Precisávamos de contatos, então construí contatos. Precisávamos de relacionamentos, então adicionei relacionamentos. Depois vieram os lembretes, as atividades, os presentes, as notas, os animais de estimação, os endereços e muitas outras funcionalidades.

Não há nada de particularmente errado em construir software desse jeito. Foi assim que o Monica cresceu, e muitas dessas decisões faziam sentido na época. Mas depois de quase dez anos, elas se acumulam. Ideias novas precisam contornar decisões tomadas anos antes, e coisas que pareciam detalhes de implementação vão se tornando aos poucos um limite para o que você pode fazer com o produto.

Com o tempo, isso deixou algumas partes do Monica mais difíceis de mudar do que deveriam ser. Mais importante ainda: mudei de ideia sobre algumas das decisões originais.

O que eu construiria hoje?

Em algum momento, comecei a me fazer uma pergunta simples: se o Monica não existisse e eu tivesse que construir um CRM pessoal hoje, com tudo o que aprendi na última década, como ele seria?

Isso levou rapidamente a perguntas muito mais básicas do que quais funcionalidades o Monica deveria ter. O que exatamente é uma pessoa no Monica? Como os relacionamentos entre pessoas deveriam funcionar? Como o Monica deveria representar o próprio usuário? O que acontece quando algo importante na vida de alguém não é outra pessoa, mas um animal, uma organização ou algo completamente diferente? Como os lembretes deveriam funcionar se os relacionamentos humanos não seguem um calendário naturalmente? O que uma atividade deveria representar? E quanto de tudo isso o Monica deveria definir para você, para começar?

Os relacionamentos são um bom exemplo. Guardar que a Monica é irmã do Ross não parece nada complicado. Mas se a Monica é irmã do Ross, o Ross também é irmão da Monica. Uma relação de pai ou mãe implica uma relação de filho ou filha. Alguns relacionamentos têm uma direção, outros não. As famílias de verdade incluem divórcios, novos casamentos, enteados, meios-irmãos, adoções e todo tipo de estrutura que não cabe direito em uma lista predefinida. Cada cultura também descreve os laços familiares de um jeito diferente.

Passei muito tempo pensando nisso para a nova versão, e agora vejo os relacionamentos como um domínio próprio, em vez de um atributo preso a um contato. Hoje me parece óbvio. Não era óbvio quando desenhamos as primeiras versões do Monica.

A personalização é outra área em que mudei de ideia. Historicamente, foi o Monica que definiu o que é um contato e quais informações podem ser guardadas sobre ele, e nós fomos acrescentando personalização em volta dessa estrutura. Para a v3, queremos inverter isso. O Monica vai continuar oferecendo bons padrões, porque ninguém quer configurar cinquenta coisas antes de adicionar o primeiro contato, mas a sua vida não deveria ter que caber no esquema de banco de dados que nós decidimos que era certo para todo mundo.

Quando você começa a mudar as coisas nesse nível, redesenhar algumas telas não basta. As fundações também precisam mudar.

O que eu quero que a v3 seja

O Monica v3 não é o produto atual com uma interface mais bonita. A interface vai mudar bastante, e quero que ela seja muito mais divertida e pessoal do que a maior parte do software que usamos hoje, mas isso é só uma parte do trabalho.

Quero construir um sistema muito poderoso para documentar as pessoas e os relacionamentos na vida de alguém. Não estou especialmente interessado em otimizar tudo em nome da simplicidade se o resultado for um produto que só sabe representar vidas simples. Prefiro ter bons padrões para quem não quer configurar nada, e dar a quem quer um controle enorme sobre como o seu Monica funciona.

Isso significa tratar os relacionamentos como conceitos de primeira classe e deixar cada pessoa decidir quais informações importam para ela. O Monica precisa dar conta de muito mais do que uma lista predefinida de campos pendurada em um contato. A parte difícil vai ser fazer tudo isso sem acabar com um software corporativo para gerenciar seus amigos e sua família, porque isso seria bem horrível.

Também há coisas que não quero mudar. Privacidade e propriedade dos dados continuam importando enormemente no Monica. O projeto vai continuar sendo de código aberto e você vai poder hospedá-lo por conta própria. Se você vai passar anos colocando em um software parte das informações mais pessoais da sua vida, acho que deveria ter o máximo de controle possível sobre essas informações.

Também não quero que o Monica decida o quanto alguém é importante para você. Ele pode ajudar você a lembrar coisas, organizar informações e avisar que você não fala com alguém há um bom tempo. O relacionamento continua sendo seu para cuidar.

Começar de novo com dez anos de experiência

"Começar de novo" não é exatamente verdade, claro. Quando criei o Monica em 2017, eu tinha uma ideia e um problema que queria resolver. Desta vez temos quase dez anos de experiência trabalhando nesse problema, milhares de conversas com usuários, contribuições de pessoas do mundo inteiro, duas gerações do produto e uma lista bem longa de coisas que não faríamos do mesmo jeito.

Enquanto trabalhamos na v3, quero documentar mais disso publicamente. Existe uma quantidade surpreendente de problemas difíceis atrás de algo que parece bem simples visto de fora, principalmente quando você começa a pensar a sério em relacionamentos, lembretes, personalização e em como representar em um banco de dados algo tão desorganizado quanto uma vida humana. Vou escrever sobre esses problemas, mas também sobre as decisões técnicas e de design que estamos tomando e sobre as coisas que tentamos e que não funcionam.

É sobre isso que Building Monica vai falar. Não sei com que frequência vou publicar um artigo, e não quero inventar um calendário de publicação só para ter um. Vou escrever quando tivermos algo interessante para contar.

Em 2017, construí o Monica com base no que eu entendia do problema naquele momento. Quase dez anos depois, entendo esse problema de um jeito muito diferente. É por isso que estamos reconstruindo ele.

2 min de leitura
Uma nova versão do Monica chega em 2026
Regis Freyd

Já faz um tempo que não damos notícias de verdade sobre o Monica.

Alexis e eu pensamos numa nova versão há muito tempo. Mais tempo do que esperávamos no início, claro. Reconstruir uma aplicação do zero tendo empregos em tempo integral, famílias e uma vida fora do Monica leva um certo tempo. Quem diria.

Mas hoje podemos finalmente dizer: vamos lançar a nova versão do Monica antes do fim de 2026.

Esta nova versão é o Monica que queríamos construir há anos. Será mais rápido, mais flexível, mais fácil de usar e assentado numa base muito mais sólida.

O Monica vai continuar ajudando você a lembrar das pessoas que importam para você. Vai continuar privado. Vai continuar de código aberto. E você vai continuar podendo instalá-lo de graça no seu próprio servidor.

Estamos muito animados. O Monica faz parte das nossas vidas há quase dez anos, e isto parece o começo de um capítulo completamente novo para o projeto.

Há muito trabalho pela frente.

Mas está chegando. Desta vez de verdade.

Obrigado pela sua paciência, pelas suas mensagens e pelo seu apoio ao longo de todos estes anos. Mal podemos esperar para mostrar o que construímos.

4 min de leitura
O Chandler está em beta
Regis Freyd

Temos o prazer de anunciar que, depois de 18 meses de trabalho duro, nossa nova versão, de codinome Chandler, já está disponível em beta: https://beta.monicahq.com

O Monica nasceu há 7 anos com o objetivo de ser um CRM pessoal. Esta nova versão trata de documentar a sua vida, incluindo o que seus contatos andam fazendo, mas não só isso.

O que significa beta? É como ter um bando de bugzinhos travessos escondidos no nosso software, brincando de esconde-esconde com a gente. Temos quase certeza de que eles estão lá, mas não fazemos ideia de quais são nem de onde se escondem. Então precisamos de todas as almas corajosas para entrar no nosso esquadrão de caça a bugs e ajudar a encontrá-los antes do lançamento para o público.

O Chandler é uma reinvenção completa do Monica, construída do zero. Eliminamos a enorme dívida técnica acumulada ao longo dos anos e acrescentamos ou melhoramos muitas funcionalidades. Apesar de não termos divulgado o Chandler, muitos usuários já o testaram e encontraram bugs que corrigimos, mas não testamos este software em larga escala. Então, por favor, crie uma conta e se divirta.

A versão disponível no servidor de beta pode ser considerada estável. Não vamos zerar o banco de dados. Faremos backup dos seus dados diariamente e vamos mantê-los quando lançarmos oficialmente a versão final.

O Chandler tem algumas limitações:

  • Você não pode usar seu login atual do Monica,
  • Você não pode importar seus dados,
  • Não há importação em massa de contatos,
  • Ainda não temos uma API.

Temos muitas funcionalidades novas, um novo layout e o tão pedido modo escuro.

Numa nota pessoal, o recurso do qual mais me orgulho é a possibilidade de personalizar quase tudo no Chandler: do layout aos módulos que você pode ativar, até os dados que pode registrar sobre a sua vida.

O Chandler continua sendo de código aberto e pode ser instalado gratuitamente no seu servidor, se você souber usar Docker ou a linha de comando. Você pode continuar modificando o código, se quiser. O Monica é, e sempre será, de código aberto. É assim que deve ser.

Por enquanto, o Monica é gratuito na nossa instância hospedada (https://beta.monicahq.com), mas teremos os mesmos preços da versão atual assim que considerarmos o produto estável.

Tenho um orgulho enorme do que conquistamos nestes oito anos. Naquela época, eu tinha medo de tornar meu código público porque sabia que ele era de baixa qualidade. Surpreendentemente, as pessoas não pareceram se importar. Hoje, nossa base de código continua aberta ao público e não nos preocupamos mais com julgamentos. O app ainda é uma aplicação Laravel, com VueJS no front-end e InertiaJS entre o front e o back. É uma pilha bem simples. Nos esforçamos para manter a base de código o mais simples possível, para facilitar a manutenção, a evolução e a busca por desenvolvedores que nos ajudem.

Em breve vamos migrar nossa imagem Docker oficial para o Chandler. Já tivemos mais de 25 milhões de downloads da imagem, o que nos deixa humildes.

Em nome de toda a equipe do Monica, obrigado por continuarem conosco todo esse tempo. A "equipe inteira do Monica" são basicamente dois amigos, Alexis e eu, apaixonados por oferecer ferramentas bacanas para as pessoas melhorarem suas vidas. O Monica ainda é um projeto paralelo para nós, temos empregos em tempo integral "do lado". Enquanto algumas pessoas jogam videogame ou assistem à Netflix, nós "brincamos" na base de código do Monica. E amamos isso.

7 min de leitura
Um novo Monica está chegando
Regis Freyd

Alexis e eu (Regis) estamos trabalhando há alguns meses (desde janeiro de 2022, na verdade) em uma versão totalmente nova do Monica. A primeira versão principal de fato desde que lançamos o projeto, alguns anos atrás.

Fico muito tentado a chamá-la de "versão mais rápida, mais nova, melhor", porque ela é, mas sou ruim de marketing, então vou dizer apenas que é uma versão nova e responder abaixo às perguntas que você possa ter.

O que vocês querem dizer com versão nova?

Uma reescrita completa do Monica, do zero.

Vocês são loucos?

Somos, mas também: a base de código do Monica já está velha. Velha no sentido de que tem 7 anos e passou pelas mãos de centenas de contribuidores. Há conceitos no código que deixamos passar, seja porque não sabíamos fazer melhor na época, seja porque não queríamos irritar quem contribuía, e que não queremos mais. O projeto tem dependências demais, e manter o código ficou mais difícil do que antes. Mudar alguma coisa é mais arriscado e leva mais tempo. Além disso, vimos como as pessoas usam o Monica, o que querem fazer com ele, e o código atual nos limita demais para dar conta desses usos. Por fim, o Monica ainda é um projeto paralelo para nós. Somos apaixonados por ele e também queremos nos divertir construindo. E a versão atual não estava tão divertida.

O que vocês querem dizer com reescrita?

Que começamos de uma base de código vazia e partimos dali. Antes, era uma aplicação Laravel (ou seja, PHP), com views Blade e um pouco de Vue aqui e ali. Agora, continua sendo uma aplicação Laravel (ou seja, ainda PHP), inteiramente com Vue 3. Simplificamos muita coisa, deixamos outras mais flexíveis e, portanto, um pouco mais complexas, mas acreditamos que conseguimos sustentar o futuro do Monica com isso.

Isso também significa que temos uma estrutura de dados totalmente nova, apoiada em um novo esquema de banco de dados.

A nova versão vai se chamar Monica?

Por enquanto, o codinome do novo Monica é Chandler. Não vamos manter esse nome: o nome oficial do novo Monica será Monica. Para maior clareza, vamos chamar a nova versão de Chandler no restante do texto.

Vocês escolheram PHP apesar de \?

O PHP é uma ótima linguagem. Não estamos mais na era do PHP 4 ou 5. Além disso, é uma linguagem bem simples, o que significa que muita gente no mundo lê e entende PHP. Escolher PHP torna mais fácil contribuir com o projeto, mais fácil depurar, mais fácil manter e mais fácil para nós encontrarmos pessoas que ajudem, se surgir a necessidade no futuro. Por fim, o ecossistema PHP é simplesmente ótimo, com o Laravel abrindo caminho para uma das melhores experiências de desenvolvimento que conheço.

Quais funcionalidades o Chandler vai ter?

No lançamento, queremos cobrir 100% (ou quase) do conjunto de funcionalidades que o Monica v1 oferece. Mesmo mantendo as funcionalidades, queríamos simplificá-las (as tarefas, por exemplo) ou torná-las mais robustas (os lembretes, por exemplo).

Feito isso, temos tantas ideias sobre o que o Monica deveria se tornar que chega a ser demais. Basicamente, o Monica nasceu como o primeiro CRM pessoal (ou PRM, gerenciador de relacionamentos pessoais). Foi assim que o posicionamos. Mas depois de anos trabalhando nele, conversando com as pessoas e lendo os milhares de e-mails que vocês nos enviaram, percebemos que o Monica é, na verdade, uma forma de documentar a sua vida, seja lá o que isso signifique para você. Então o Monica vai tratar de documentar a sua vida e de dar ferramentas para você fazer isso do seu jeito.

Lemos em todo lugar que produtos devem ter opinião e uma personalidade forte, para que as pessoas usem suas ferramentas do jeito que você quer. Essa foi a direção da v1. Agora queremos mudar essa afirmação. Queremos que as pessoas usem e configurem o Monica do jeito que quiserem. Quem somos nós para dizer que você deve usar só 3 pronomes para seus contatos, ou quais tipos de relacionamento você deveria ter? O Chandler será completamente personalizável, do que você vê na interface ao tipo de dado que pode inserir. O pessoal de marketing diria "o Chandler é sobre você", e isso é verdade, de certo modo. A desvantagem: do ponto de vista técnico, é mais difícil de administrar, mas esse problema é nosso.

Quando vai ficar pronto? Posso experimentar?

Vai ficar pronto quando estiver pronto. Lembre-se: não trabalhamos nisso em tempo integral, de jeito nenhum. Alexis e eu temos empregos exigentes, famílias, amigos e o Monica (e o OfficeLife, também).

NO ENTANTO.

Já fizemos bastante coisa. Algumas funcionalidades grandes que você conhece e gosta ainda faltam na nova versão: acontecimentos de vida, atividades, presentes e CalDAV/CardDAV, para citar algumas. Os acontecimentos de vida, em especial, são um bocado grande, porque queremos repensar completamente o conceito e torná-lo realmente útil. E, este é um "e" enorme, no momento ainda não temos uma API. Como é uma base de código nova, não dá para simplesmente copiar seus contatos da v1 e esperar que apareçam na v2. Então, se lançássemos algo agora, você não conseguiria importar seus dados. E achamos que isso é um problema.

DITO ISSO.

Ainda precisamos de gente para testar e nos ajudar a encontrar bugs, mesmo que aqui a gente não faça bugs (lol). Precisamos de pessoas para corrigir erros de escrita na documentação. Então o que poderíamos fazer é lançar o Chandler em um estado bem alfa, gratuito para todos até deixar de ser alfa.

Continua sendo de código aberto? Posso usar de graça?

Sim, continua de código aberto, com a mesma licença de antes. Isso significa que o Monica é gratuito, claro, a menos que você use a versão que hospedamos, que em algum momento vai custar algo, como a versão atual. Sim, você pode instalá-lo onde quiser, no seu próprio servidor. Como o Chandler não é a mesma base de código, ainda não temos o ecossistema rico de antes nem todas aquelas maneiras diferentes de instalá-lo em qualquer lugar, mas chegaremos lá. Sim, você ainda pode contribuir com o código, corrigir bugs, acrescentar funcionalidades, mesmo que continuemos com o direito de recusar seus pull requests se acharmos que não queremos dar suporte ao que você propõe.

Qual é o futuro do Monica v1?

Vamos dar suporte à v1 até o Chandler sair do alfa e do beta. Depois disso ela será descontinuada, mas quem a hospeda poderá continuar usando, se quiser. A v1 que nós mesmos hospedamos não terá suporte depois disso.

Já dá para contribuir com a base de código?

O repositório já está disponível no GitHub, mas estamos longe da maturidade do repositório principal atual. Isso significa que ainda não estamos prontos para receber contribuições de todo mundo, já que as coisas mudam quase todo dia, mas, se você aceitar isso, fique à vontade.

O que vem a seguir?

Antes de tudo, muito obrigado por ter lido este post inteiro. Somos muito gratos pela nossa comunidade e por vocês continuarem apaixonados por esta ferramentinha que nos divertimos construindo. Alexis e eu seguimos supermotivados com ela, e agradecemos por se importarem junto com a gente. Manteremos vocês informados.

2 min de leitura
Saindo do Stripe com nosso próprio portal do cliente
Regis Freyd

Hoje usamos o Stripe para gerenciar nossas assinaturas. Embora adoremos o Stripe do ponto de vista de quem programa, lidar com impostos no mundo inteiro é uma confusão completa, especialmente no fim do ano fiscal. Nosso contador nos odeia. Precisamos migrar para outro processador de pagamentos que trate de todos os impostos do jeito certo. Esse processador se chama Paddle.

Há outro motivo para querermos mudar a abordagem atual. O Monica é, antes de tudo, um produto de código aberto. Temos uma comunidade enorme. Muitos de vocês hospedam o Monica nos próprios servidores. Como também hospedamos o produto para poder monetizá-lo, até agora incluímos na base de código principal todo o código necessário para gerenciar assinaturas. É muito código. Cuidamos de assinar, editar e cancelar uma assinatura, com todas as permissões em volta disso, e assim por diante. Não é o ideal.

Decidimos remover todo o código de cobrança da base principal e criar um novo portal, chamado portal de assinaturas, para gerenciar suas assinaturas do Monica. Você terá que criar uma conta nesse site e comprar uma chave de licença para colar na sua conta do Monica. Nada além disso é necessário.

Se você tem uma assinatura hoje, vamos permitir que migre sua conta para a nova com facilidade. Instruções detalhadas serão enviadas por e-mail para cada um de vocês.

Pretendemos fazer a transição para esse novo portal do cliente nas próximas semanas.

4 min de leitura
Monica 2.16 e o que vem a seguir para o Monica
Regis Freyd

Faz tempo. Na verdade, faz um ano desde o último post. Neste texto vamos falar da nova versão 2.16 que acabamos de lançar, do que aconteceu durante 2019 e do que vem a seguir para o Monica.

A versão 2.16 contém 226 mudanças, a maioria correções de bugs ou melhorias na base de código. Mas também temos várias novidades, explicadas abaixo.

Uma nova forma de adicionar atividades

Agora você pode adicionar atividades ali mesmo, em vez de ir para uma nova página. Assim como no recurso de ligações, você pode indicar as emoções que sentiu durante uma atividade.

O formulário para adicionar uma atividade a um contato, perguntando o que você fez e quando.

Página de configurações da API aprimorada

A maior parte do que você faz com o Monica pode ser feita pela API. É extremamente importante para nós que as pessoas possam manipular seus dados à vontade. Por isso estava na hora de melhorar um pouco a página de configurações da API, dando mais carinho a ela.

A tela de configurações da API, com os tokens de acesso pessoal e os clientes OAuth.

Também acrescentamos muitos métodos novos na API para dar continuidade à nossa abertura a outros sistemas.

Muitas mudanças nos bastidores

Também mudamos completamente a forma como os dados são armazenados, acrescentando chaves estrangeiras a todas as tabelas do banco de dados. Embora isso não tenha impacto na experiência de quem usa o Monica, é bastante importante para quem desenvolve, pois trará mais controle e flexibilidade no geral. Foi uma mudança enorme e os pull requests levaram quase 11 meses para serem integrados.

Também refizemos por completo o processo de exportação de dados, que deve funcionar sem falhas de agora em diante (ou, como dizem: 60% das vezes funciona sempre).

O que aconteceu em 2019?

Em 2019 desaceleramos um pouco em termos de lançamentos anuais. Além disso, a atividade neste blog foi inexistente. Isso, porém, não afetou o número de cadastros, nem o número de downloads, nem o carinho das pessoas na internet por este projeto.

Basicamente, o Monica nunca esteve tão forte. Temos quase 5 milhões de downloads da nossa imagem docker oficial. Temos dezenas de milhares de usuários na nossa versão hospedada. O Monica continua aparecendo no Hacker News e nosso rastreador de issues no GitHub está mais ativo do que nunca. Também integramos 875 pull requests em 2019.

Então por que esse silêncio? Principalmente por minha causa (Regis). Comecei o Monica há quase quatro anos. Ter um projeto popular é muito divertido, mas também consome muita energia e motivação. Ainda mais porque o Monica continua sendo um projeto paralelo tanto para mim quanto para o Alexis. Mas este ano o Monica foi demais para mim, e normalmente sou eu quem escreve neste blog ou nas redes sociais. Tive um esgotamento de projeto paralelo, digamos assim. O Alexis assumiu muito trabalho para manter e evoluir o produto, mas eu não consegui me dedicar como antes nem publicar notícias sobre o projeto. Precisei fazer outra coisa, esvaziar a cabeça e voltar só quando estivesse pronto. Agora estou, e sigo mais do que motivado para voltar ao trabalho e me divertir de novo.

O Monica em 2020

Quatro anos atrás, o Monica foi um dos primeiros CRMs pessoais populares. Hoje, a concorrência é maior do que nunca (uma dúzia, da última vez que verifiquei). Mas acredito que temos uma vantagem que nossos concorrentes não conseguem superar: somos de código aberto, não temos encargos nem custos, ou quase nenhum, e não somos gananciosos. Tudo o que fazemos, fazemos pensando primeiro na comunidade. Quanto mais instâncias do Monica existirem por aí, mais felizes ficamos: isso significa que não temos controle algum sobre os dados dos nossos usuários.

Em 2020:

  • Queremos continuar nosso trabalho de abertura e transparência. Isso significa mais formas de exportar ou importar dados em um formato padrão.
  • Queremos oferecer webhooks para que sistemas externos saibam quando os dados mudam na sua conta (se você quiser, claro).
  • Acredito que o Monica é hoje a melhor ferramenta para documentar seus contatos pessoais. Você pode registrar qualquer coisa, de verdade. Agora que temos uma base muito sólida, acho que é hora de ampliar. É hora de permitir que você faça mais com seus contatos, criando grupos (ou famílias), eventos, oportunidades e assim por diante. Vamos focar em conceitos simples, acrescentados aos poucos à plataforma, que oferecerão a maior flexibilidade possível para você.

O Monica é uma ferramenta para você. Continue compartilhando ideias, continue me enviando e-mails sobre o que devemos fazer em seguida. Estamos aqui por você.

E feliz ano novo 😀

4 min de leitura
Monica 2.11.0
Regis Freyd

Depois de mais de um mês de trabalho, tenho o prazer de anunciar a nova versão do Monica, com envio de fotos, segurança aprimorada, melhor gestão de ligações, informações do tempo, a chegada das emoções e muitas outras melhorias.

Envio de fotos

Agora você pode enviar fotos na página de perfil de um contato. A quantidade de fotos que pode guardar depende do limite de armazenamento da sua conta, que é de 512 MB em https://monicahq.com (e é configurável por instância). Poder enviar fotos abre muitas possibilidades para o futuro.

A aba de fotos de um contato, vazia, oferecendo enviar a primeira imagem.

Códigos de recuperação

Segurança é fundamental, especialmente em uma ferramenta como o Monica, que guarda muitos detalhes íntimos. O Monica já dá suporte à autenticação em dois fatores (também conhecida como 2FA) e a U2F para ajudar você a proteger sua conta. A partir do Monica 2.11, você pode gerar códigos de recuperação para desbloquear sua conta caso perca a capacidade de entrar com 2FA. Atenção, porém: como esses códigos dão acesso à sua conta, guarde-os em um lugar bem seguro.

A janela de códigos de recuperação, com oito códigos de uso único e um já riscado.

Ligações telefônicas

As ligações receberam bastante carinho nesta versão. Primeiro, redesenhamos o fluxo para registrá-las. Depois, acrescentamos (finalmente) a possibilidade de editar uma ligação feita no passado. E, de bônus, agora você pode indicar quem iniciou a ligação.

Emoções

Não seria ótimo poder dizer, de forma bem precisa, como você se sentiu quando algo aconteceu? O Monica 2.11 introduz a ideia de emoções, baseada no trabalho do Dr. Phillip Shaver. No trabalho dele, as emoções são organizadas em 3 categorias principais:

  • emoções primárias (amor, alegria, surpresa, raiva, tristeza e medo),
  • emoções secundárias (amor -> afeto, desejo, saudade),
  • emoções terciárias (amor -> afeto -> adoração, amor, carinho, atração).

Acrescentamos esses conceitos ao Monica, começando pelas ligações. Um novo menu suspenso permite escolher quantas emoções quiser, para representar com bastante precisão o que você sentiu durante uma ligação. Pretendemos incluir emoções também em outros elementos importantes, como as atividades.

O formulário de ligação, perguntando como você se sentiu durante a ligação, com duas emoções já escolhidas.

Tempo

Quando você conversa com um amigo que mora em outra região, é bem provável que em algum momento vocês falem sobre o tempo. O Monica ajuda aqui, mostrando o tempo atual do lugar onde seu amigo mora. Essa informação vem do primeiro endereço encontrado na página de perfil do contato. Isso também significa que, se nenhum endereço estiver definido, nenhuma informação de tempo será exibida.

Os dados do tempo vêm do Darksky e são atualizados a cada 6 horas. A única informação compartilhada com o Darksky é a latitude e a longitude, nada além disso. Para quem tem a própria instância, o Darksky oferece um plano gratuito de 1.000 chamadas por dia, o que deve ser mais do que suficiente.

A ficha de um contato mostrando o clima atual no lugar onde essa pessoa mora.

Coordenadas GPS

Falando em latitude e longitude, precisávamos de um mecanismo para obter essas duas informações de cada endereço cadastrado no Monica se quiséssemos exibir os dados do tempo. O Monica 2.11 agora consegue geocodificar automaticamente qualquer endereço para encontrar suas coordenadas.

Quando você insere um endereço, e se o serviço estiver configurado na sua instância, tentaremos geocodificá-lo automaticamente, a menos que você mesmo informe a latitude e a longitude do lugar.

A geocodificação é feita pelo LocationIQ, uma empresa independente e excelente que oferece um plano gratuito bem generoso de 10.000 chamadas por dia. Não compartilhamos com o LocationIQ nada além do endereço, apenas para obter as coordenadas.

Tarefas

No seu painel, agora você pode adicionar tarefas que não estão ligadas a nenhum contato.

A aba de tarefas do painel, com três tarefas que não pertencem a nenhum contato.

Melhorias

Reorganizamos bastante a forma como as coisas são escritas internamente, para continuar nossa busca por uma plataforma o mais estável possível. Também seguimos aumentando a cobertura de código (ou seja, o quanto do nosso código é de fato testado automaticamente). Estamos em 66% de cobertura para toda a base de código.

Esperamos que você goste da 2.11 tanto quanto nós.

1 min de leitura
Situação dos aplicativos móveis
Regis Freyd

Acabei de remover os aplicativos móveis tanto da Apple Store quanto da Play Store. A única forma de obtê-los agora é compilá-los a partir do repositório no GitHub.

Embora o Theo tenha feito um trabalho incrível na primeira versão desses aplicativos, o desenvolvimento parou no começo deste verão, enquanto o desenvolvimento do Monica, a plataforma, seguiu em frente. Agora estamos numa situação em que o app móvel não está no mesmo nível da plataforma e, pior, vamos quebrar coisas na API que o app não vai suportar.

Continuo acreditando firmemente que o crescimento e a adoção do Monica passarão por um aplicativo móvel.

Eu gostaria de prometer maravilhas e anunciar um app novo em 2 meses, mas, na realidade, não sei quanto tempo vai levar. Como o Monica ainda está no estágio de projeto paralelo, pode levar 6 meses ou 2 anos. Mas um dia teremos um ótimo aplicativo móvel, tão bom quanto a versão web (se não melhor).

Obrigado pela paciência.

Artigos 1 a 10 de 43