eletrotupi / tcc PUBLIC
Commits
648
Branches
2
Contributors
1
License
—
thesis: expand architecture and technology rationales @ c901c35 Pedro Lucas Porcellis 2 days ago
# Nexo

Nexo é um aplicativo de monitoramento de humor para pessoas com
transtorno bipolar, e também um trabalho de conclusão de curso. Ele
parte de uma pergunta simples e teimosa: como perceber o próprio estado
emocional quando ele muda depressa, e o que ajuda a explicá-lo?

Registrar "como eu estou" é só o começo. A proposta é guardar também o
contexto em volta do registro — o que aconteceu, como estavam o corpo e
a cabeça, o que veio depois. Com o tempo, esses fragmentos formam uma
linha do tempo que dá para reler e onde dá para enxergar padrões.

Originalmente o app seria 100% offline; por exigência do curso, porém,
passou a contar com um backend, então esta versão funciona com uma API
implantada.

> Nota histórica: o nome original do projeto era **orbit**. É normal
> encontrá-lo por aí em algum arquivo de código ou string esquecida.

## O que é o EMA

O Nexo se apoia no EMA — *Ecological Momentary Assessment*, ou avaliação
ecológica momentânea. Em vez de pedir que a pessoa reconstrua o dia
inteiro de memória no fim da noite, o EMA propõe capturar o estado no
momento em que ele acontece, no ambiente cotidiano e não no consultório.

Na prática, isso muda o que o app pergunta. Ele não quer ser um diário
genérico nem um placar de humor; quer registrar o instante e os seus
arredores. É isso que permite, mais tarde, comparar tendências, cruzar
sono e energia, e notar quais situações tendem a se repetir.

## Funcionalidades

- **Humor** — registro rápido ou detalhado, com energia, ansiedade e
  estresse (escala de 0 a 10), emoções com intensidade e anotação livre.
- **Gatilhos** — eventos do dia a dia por categoria, que podem ser
  vinculados a um humor com o impacto percebido de cada um.
- **Sono** — registro diário de horas e qualidade.
- **Ações de cuidado** — medicações, consultas e atividades, que também
  podem se ligar a humores e gatilhos.
- **Medicamentos** — regimes recorrentes com horários, uma visão do
  "hoje" para confirmar doses e lembretes automáticos.
- **Histórico** — um feed único e cronológico de tudo, com filtros por
  tipo.
- **Jornada** — tendência de humor, correlação entre sono e energia,
  padrões de gatilho e resumos diários, gerados periodicamente.
- **Relatório** — um PDF "clínico" do período (até 90 dias) para levar à
  consulta.
- **Exportação** — todos os dados em CSV, enviados por e-mail.

## Estrutura do monorepo

```sh
nexo/
├── api         # servidor Express + Prisma
├── frontend    # app React Native (Expo)
├── thesis      # a tese, em LaTeX
├── docs        # decisões (ADRs) e notas de trabalho
├── ansible     # provisionamento do servidor
└── docker-compose.yml
```

## Arquitetura

- **API** — Express, Zod e Prisma sobre PostgreSQL; BullMQ com Valkey
  para tarefas em segundo plano; Resend para e-mail e Expo para
  notificações.
- **Mobile** — React Native (Expo), expo-router, React Query com cache
  persistido em MMKV e Zustand para o estado efêmero.
- **Infra** — Docker Compose no dia a dia e Ansible para o servidor;
  GitHub Actions cuida do deploy da API e da publicação da tese.

![Arquitetura e elementos do sistema](thesis/images/arch-v2.png)

## Como rodar localmente

Pré-requisitos: Docker e o Expo CLI.

```sh
# sobe banco, fila e API
docker compose up -d db valkey api

# cria dados de exemplo
cd api && npm run seed
```

O app móvel usa um *development build* por conta de dependências nativas, então logue com a conta do expo, gere uma build e depois basta rodar o comando:

```sh
cd frontend
npm install
cp .env.example .env.local   # aponte a base da API para o IP da máquina
eas build # apenas para gerar a build de desenvolvimento
npx expo start # uso normal
```

## Testes

A API usa Vitest e roda dentro do container, porque o banco de teste
vive na rede do Compose:

```sh
docker compose exec api npm run test:setup
docker compose exec api npm test
```

No mobile há fluxos de fumaça com Maestro, que roda num aparelho Android
físico. Vale dizer que isso ainda é experimental: exige o Maestro e o `adb`
instalados, além de um device conectado.

```sh
cd frontend && npm run test:e2e
```

## Monografia

A tese que acompanha o projeto vive em `thesis/`, escrita em LaTeX.
A edição costuma ser feita no Vim com o **vimtex**, que cuida de
compilar enquanto se escreve.

## Licença

Por ser um projeto acadêmico, ele não é plenamente livre: o IFSul
reserva uma parcela de autoria ao orientador, ao aluno e à instituição.

Ainda assim, na medida do possível, o código está sob os termos da
GPL-3.0-only e o texto sob a CC BY-NC-SA 4.0. Na prática: a tese pode
ser lida, citada e compartilhada, mas não pode ser vendida nem usada
comercialmente.