Rede social de leitura com estantes virtuais, feed social, comunidades com chat em tempo real, seis algoritmos independentes de recomendação personalizada e assistente de IA conversacional.
- Sobre o projeto
- Funcionalidades
- Sistema de recomendação
- Arquitetura geral
- Ambientes em produção
- Performance
- Índice de documentação
- Artefatos de projeto
- Estrutura do repositório
- Integrantes
- Orientadores
- Como executar
O Biblioo é uma plataforma digital de comunidade literária desenvolvida para leitores ativos brasileiros. O projeto parte de um problema real — 53% dos brasileiros não leram um livro nos últimos três meses (Retratos da Leitura, 2024) — e propõe uma solução que reúne em um único ambiente tudo que um leitor precisa: organização de leitura, descoberta inteligente de novos títulos, interação social e identidade literária.
O sistema foi construído em três frentes complementares:
- Backend em Spring Boot 4 (Java 25) com arquitetura Hexagonal em monólito modular de 11 domínios, implantado em Google Cloud Run
- Frontend web em Next.js 16 (React 19 + TypeScript), com notificações SSE e chat WebSocket em tempo real
- App mobile em Flutter 3.11, offline-first para Android e iOS, com BLoC e persistência local via Drift/SQLite
O assistente Bibo, alimentado pelo Google Gemini via Spring AI, vai além de responder perguntas: ele entende linguagem natural e executa ações diretamente na plataforma — cria comunidades, organiza estantes, monta coleções e orienta o leitor dentro do ecossistema Biblioo.
| Área | O que o leitor pode fazer |
|---|---|
| Autenticação | Cadastro com e-mail/senha ou Google OAuth; redefinição de senha por e-mail; criação de senha para contas Google |
| Estantes e biblioteca | Criar estantes e coleções personalizadas; registrar status de leitura (Quero Ler, Lendo, Lido, Abandonei); atualizar progresso por páginas; visualizar streak de dias ativos; importar biblioteca do Goodreads via CSV |
| Feed social | Publicar posts com texto, imagens e GIFs; escrever reviews com nota de 1–5 estrelas; curtir, comentar e responder; visualizar feed personalizado de quem segue |
| Comunidades | Criar comunidades públicas ou privadas; chat em tempo real via WebSocket; votação democrática de livros; convites por link ou diretos; solicitações de entrada com aprovação; gestão de roles (owner, moderador, membro) |
| Recomendações | 6 trilhas algorítmicas independentes com critérios distintos + Roll Dice universal |
| DNA Literário | Perfil analítico automático com arquétipo dominante, temas preferidos, velocidade de leitura e distribuição de gêneros; snapshots anuais |
| Assistente Bibo | Chat em linguagem natural com execução de ações na plataforma; histórico de conversas persistido |
| Notificações | In-app via SSE (web, tempo real) e push via Firebase FCM (mobile); badge de não lidas |
| Perfil e social | Seguir/ser seguido; perfis públicos e privados com aprovação de seguidores; busca de usuários; upload de avatar e banner |
| Descoberta | Top 10 livros e comunidades em tendência (atualizado a cada 15 minutos); busca full-text por título, autor ou ISBN |
| Compartilhamento | Cápsulas visuais de estatísticas de leitura geradas pelo backend e compartilháveis em redes sociais |
O sistema de recomendação é o diferencial central do Biblioo. São seis trilhas algorítmicas totalmente independentes, cada uma cobrindo um ângulo diferente de descoberta de leitura. Nenhuma usa IA generativa: os resultados são gerados por algoritmos determinísticos e estatísticos, acionados por eventos de domínio via RabbitMQ e cacheados no Redis por usuário.
| Trilha | Estratégia | Algoritmo |
|---|---|---|
| T1 — BecauseYouRead | "Quem leu o mesmo livro também leu estes..." | Grafo Neo4j — co-leitura com mínimo de 2 leitores em comum; jitter ±3% para diversificação |
| T2 — FavoriteGenreNow | "Você está numa fase de ficção científica..." | Detecção dos 3 gêneros dominantes atuais do leitor; prioriza títulos com avaliações suficientes |
| T3 — TrendingInCommunities | "Este livro está em alta nas comunidades agora..." | Score de engajamento com decay exponencial de 10%/hora; deduplica por janela de 24h |
| T4 — CatalogSurprise | "Saia da zona de conforto..." | Thompson Sampling — parâmetros Beta(α, β) por (usuário, livro) persistidos no Redis; aprende com cada interação |
| T5 — SimilarAuthors | "Leitores com gosto parecido adoraram estes..." | Filtragem colaborativa em 2 níveis via Neo4j; leitores similares até 2 saltos no grafo |
| T6 — RereadWorthIt | "Faz um tempo — pode ser o momento certo para reler..." | Repetição espaçada: intervalo = nota × 30 dias × 1,5^n_releituras; mínimo 90 dias desde a última leitura |
| Roll Dice | "Surpreenda-me" | Seleção aleatória entre os resultados das 6 trilhas combinadas |
A aplicação segue o estilo Hexagonal (Ports & Adapters) em uma arquitetura de monólito modular, com 11 domínios de negócio independentes que se comunicam exclusivamente via eventos RabbitMQ — sem chamadas diretas entre módulos.
Padrões de destaque:
| Padrão | Onde se aplica |
|---|---|
| Outbox | Publicação assíncrona garantida no RabbitMQ dentro de @Transactional |
| Fanout-on-write | Feed com threshold de 10.000 seguidores |
| Thompson Sampling | Recomendação T4 — aprendizado bayesiano por interação |
| Spaced Repetition | Recomendação T6 — intervalo ótimo de releitura |
| Collaborative Filtering | Recomendação T5 — grafo Neo4j 2 níveis |
| Sliding Window Cache | Feed Redis com warm-size de 200 itens |
| Offline-first (mobile) | Drift/SQLite local + sync remoto ao reconectar |
| Idempotência por event_id | Todos os consumers RabbitMQ |
| Session affinity + FanoutExchange | Chat WebSocket com múltiplas instâncias Cloud Run |
O backend está implantado em dois ambientes independentes no Google Cloud Run (us-central1), com pipeline de CI/CD automatizado (~12 min do commit ao deploy).
| Portfolio | Produção | |
|---|---|---|
| URL | biblioo-portfolio-595140312227.us-central1.run.app |
biblioo-producao-595140312227.us-central1.run.app |
| Instâncias | 0–2 (hiberna sem tráfego) | 1–10 (sempre ativa) |
| Recursos | 1 Gi RAM · 1 vCPU | 2 Gi RAM · 2 vCPU |
| Banco | TiDB Cloud Serverless | TiDB Cloud Serverless |
| Cache | Upstash (Redis) | Upstash (Redis) |
| Mensageria | CloudAMQP Little Lemur | CloudAMQP Little Lemur |
| Grafo | Neo4j Aura Free | Neo4j Aura Free |
| Busca | Bonsai.io Hobby (HTTPS) | GCE VM e2-small via VPC interna |
| Swagger UI | /swagger-ui.html | /swagger-ui.html |
Pipeline CI/CD:
flowchart TD
A["Repo privado — PUC Minas org\npush em main · dev · prod"]
B["GitHub Actions\nEspelha branches no repo público\nmarcosffp/biblioo"]
C["Cloud Build trigger\nAtivado exclusivamente por push na branch prod"]
D1["docker build ./code/back"]
D2["docker push → Artifact Registry\nbackend:latest"]
D3["gcloud run deploy biblioo-portfolio"]
D4["gcloud run deploy biblioo-producao\nTroca de revisão sem downtime"]
A --> B
B --> C
C --> D1
D1 --> D2
D2 --> D3
D3 --> D4
O frontend web está implantado na Vercel, com integração direta ao repositório GitHub: cada push na branch main aciona um deploy automático.
| URL | |
|---|---|
| Frontend Web | biblioo-rust.vercel.app |
A variável
NEXT_PUBLIC_API_URLestá configurada na Vercel apontando para o backend de Produção (biblioo-producao-595140312227.us-central1.run.app).
A suíte de testes de performance foi desenvolvida em K6 com 71 testes cobrindo 8 domínios funcionais, cada um com três perfis obrigatórios: load (carga normal sustentada), spike (pico abrupto) e stress (degradação progressiva).
Resultado final: 71/71 testes aprovados · 0 falhas funcionais (5xx)
| Destaque | Resultado |
|---|---|
| Maior throughput | 1 538 req/s — user-stress com 600 VUs simultâneos |
| Menor latência p95 | 8,42 ms — book-spike com 300 VUs |
| Chat WebSocket (spike) | 11 ms de entrega p95 · 100% de integridade · zero duplicatas |
| Trending e ShareCard | < 40 ms p95 mesmo a 600 VUs — cache Redis efetivo |
| Recomendações (6 trilhas) | 728 ms p95 no load com 500 VUs — aceitável dado que percorre Neo4j + Redis + MySQL em paralelo |
| Roll Dice | 21 ms p95 no load com 600 VUs |
| DNA Literário | 34 ms p95 no load · 0% de falhas até 500 VUs |
Todos os valores acima foram medidos em ambiente local (localhost). Em produção, aplica-se fator conservador de 4× para refletir os recursos restritos do Cloud Run. Os RNFs foram definidos com esse fator incorporado e todos são atendidos com margem.
| # | Documento | Conteúdo |
|---|---|---|
| 1 | Apresentação | Problema, objetivos do trabalho, definições e abreviaturas |
| 2 | Nosso Produto | Visão do produto, É/Não É · Faz/Não Faz, personas |
| 3 | Requisitos | RF-01 a RF-40, RNF-01 a RNF-22, restrições e mecanismos arquiteturais |
| 4 | Modelagem | Histórias de usuário, visão lógica, modelo de dados |
| 5 | Wireframes | Wireframes web (Login, Feed, Estante, Coleção, Comunidades, Perfil, Recomendação) e mobile |
| 6 | Projeto da Solução | Decisões arquiteturais e projeto técnico da solução |
| 7 | Avaliação da Arquitetura | ATAM simplificado com 5 cenários e dados reais de testes K6 |
| 8 | ATAM Completo | Avaliação ATAM detalhada: 6 cenários, 2 riscos, 5 não-riscos, 4 tradeoffs, 3 sensibilidades, 7 evidências de teste, plano de ação |
| Subprojeto | README | Conteúdo |
|---|---|---|
| Código (visão geral) | code/README.md | Índice rápido dos três subprojetos e instruções gerais |
| Backend | code/back/README.md | Arquitetura hexagonal, estratégia de feed (fanout + threshold + backfill), regras de arquitetura, infraestrutura Docker, testes K6, endpoints completos |
| Frontend Web | code/front/README.md | Páginas, componentes, hooks, serviços, WebSocket/STOMP, SSE |
| App Mobile | code/mobile/README.md | Arquitetura BLoC, rotas, offline-first, screens |
| Documento | Conteúdo |
|---|---|
| Relatório Geral | Visão consolidada dos 71 testes — todos os domínios, resultados e análise |
| Documento de Avaliação | Critérios de aprovação, thresholds e metodologia |
| DomainFeed — Relatório | Resultados detalhados: feed, post, comment, review |
| DomainFeed — Observações | Análise técnica dos testes de feed |
| DomainUser — Relatório | Resultados detalhados: user, social, social-requests |
| DomainUser — Observações | Análise técnica dos testes de usuário e grafo social |
| Arquivo | Conteúdo |
|---|---|
docs/schema/biblioo.dbml |
Modelo de banco de dados completo em DBML |
docs/schema/biblioo.components.puml |
Diagrama de componentes PlantUML |
| Subpasta | README | Conteúdo |
|---|---|---|
| Raiz | assets/README.md | Índice geral de todos os artefatos institucionais |
| Gerência | assets/gerencia/README.md | TAP, EAP (visão hierárquica e em árvore), ata de kickoff |
| Atas | assets/atas/README.md | Atas das sprints 2→3, 4→5 e 5→6 com resumo de decisões e responsáveis |
| Propriedade intelectual | assets/inpi/README.md | Documentos NIT/INPI: atas de acordo, procuração e termo de sigilo |
| Avaliação heurística | assets/Avaliacao_Heuristica.pdf | Relatório de avaliação heurística da interface (Nielsen) |
biblioo/
├── code/
│ ├── back/ # Backend — Spring Boot 4 · Java 25
│ │ └── performance-tests/ # Suíte K6: 71 testes · 8 domínios
│ ├── front/ # Frontend — Next.js 16 · React 19
│ └── mobile/ # App mobile — Flutter 3.11
├── docs/ # Documentação arquitetural
│ ├── 1.apresentacao.md – 8.atam.md
│ ├── imagens/
│ ├── schema/ # biblioo.dbml · biblioo.components.puml
│ ├── wireframe/ # web/ · mobile/
│ └── weekly-report/
├── assets/
│ └── atas/ # Atas de reunião (Sprint 2 → Sprint 5)
└── divulge/ # Materiais de divulgação e apresentações
| Nome | GitHub | E-mail institucional |
|---|---|---|
| Bernardo Souza Alvim | @alvimdev | bernardo.alvim@sga.pucminas.br |
| Carlos José Gomes Batista Figueiredo | @CarlosJFigueiredo | carlos.figueiredo.1507022@sga.pucminas.br |
| Gabriela Alvarenga Cardoso | @gabialvarenga | gabriela.cardoso.1026227@sga.pucminas.br |
| Marcos Alberto Ferreira Pinto | @marcosffp | mafpinto@sga.pucminas.br |
| Mateus Araújo Santos | @mateuaraujo01 | mateus.santos.1487920@sga.pucminas.br |
| Rafael Ganascini de Moura | @RafaelMouraG | rafael.ganascini@sga.pucminas.br |
| Nome |
|---|
| Cleiton Silva Tavares |
| Cristiano de Macêdo Neto |
| João Paulo Carneiro Aramuni |
Curso de Engenharia de Software — Campus Lourdes Instituto de Informática e Ciências Exatas — Pontifícia Universidade Católica de Minas Gerais (PUC MINAS)
- Git
- Docker + Docker Compose
- Java 25+ e Maven 3.9+
- Node.js 20+ e npm 10+
- Flutter SDK 3.11+
git clone https://github.com/ICEI-PUC-Minas-PPLES-TI/plf-es-2026-1-ti5-0492100-biblioo.git
cd plf-es-2026-1-ti5-0492100-biblioocd code/back
cp .env.example .env # preencha com suas credenciais
docker-compose up -d # MySQL · Redis · RabbitMQ · Neo4j · OpenSearch
./mvnw spring-boot:run # API em http://localhost:8080Swagger UI disponível em http://localhost:8080/swagger-ui.html
cd code/front
npm install
cp .env.example .env.local # NEXT_PUBLIC_API_URL + NEXT_PUBLIC_GOOGLE_CLIENT_ID
npm run dev # http://localhost:3000cd code/mobile
flutter pub get
cp .env.example .env # API_URL + GOOGLE_WEB_CLIENT_ID
dart run build_runner build --delete-conflicting-outputs
flutter runConsulte os READMEs individuais de cada subprojeto para configuração completa de variáveis de ambiente, testes de performance (K6) e instruções de deploy em nuvem.
Fonte do banner: João Paulo Carneiro Aramuni


