case/projetos/germina
03/10
Germina Prime (cliente)·Construção solo · Fullstack·Trabalho para cliente - em produçãoEm produção, pacientes reais

Germina Prime

Uma plataforma no lugar de Calendly + Zoom + loja + site - agendamento, a própria sessão de vídeo, blog e loja de cursos, tudo na marca da psicóloga, sem nada pro paciente instalar.

Multi-therapist
isolamento estrito, admin incluído
Live video
sessões 1:1 e turmas ao vivo na plataforma
Atomic seats
lock de linha impede vender vaga a mais
Construção solo para a cliente
time

Solo · API + Web · desde nov 2025, em evolução. Uma psicóloga querendo atender online não devia ter que costurar quatro ferramentas e quatro logins. Construí o Germina Prime ponta a ponta para a cliente: uma plataforma única na marca dela, com agendamento ciente de fuso, sessões de vídeo que acontecem dentro do produto (terapia 1:1 e turmas ao vivo), um blog que ela mesma publica e uma loja de e-books e cursos por turma. No caminho virou multi-terapeuta, migrou o pagamento de só PIX pra Stripe com parcelamento no cartão, e foi rebatizada do nome pessoal da fundadora pra Germina Prime em meados de 2026.

01

O que ele resolve

Uma psicóloga indo pro online normalmente acaba com Calendly pra agenda, Zoom pra sessão, algum marketplace pra curso e um site no Wix por cima - quatro logins, quatro contas, quatro lugares pra quebrar, e um paciente que precisa instalar app pra ser atendido. O Germina é uma plataforma só, na marca dela, onde agendamento, sessão, blog e loja moram juntos, e o paciente só clica num link.

02

Vídeo que faz dois papéis

As sessões acontecem dentro da plataforma, sobre o Stream Video SDK (WebRTC) com tokens por papel gerados no servidor. A mesma infraestrutura serve dois modos bem diferentes: terapia 1:1, onde a terapeuta tem o token de admin que permite compartilhar tela; e turmas de curso, onde um host conduz a aula pra 30+ alunos que entram com câmera e microfone mutados automaticamente, com o host podendo mutar individualmente e encerrar a sessão pra todos de forma limpa.

Multi-therapist
isolamento estrito, admin incluído
03

Agendamento

Agendamento ciente de fuso fixado em America/São_Paulo, horários de trabalho e serviços configuráveis pela terapeuta com preço próprio, um índice de horários que impede agendamento duplo, e um cronômetro de consulta em sessão que persiste o tempo decorrido no agendamento.

04

A loja, feita direito

Um modelo genérico de item de loja serve e-books, produtos avulsos e cursos por turma. Cada item pode ter turmas com capacidade, janela de abertura/fechamento e preço próprios; o checkout roda no Stripe com cartão e boleto, um cron expira pedidos pendentes parados, e o status de pagamento volta pro comprador em tempo real por um canal WebSocket dedicado - então ele vê 'pago' no instante em que o webhook chega.

05

Feito pra durar

Clean architecture (use-cases, repositórios, modelos de domínio), schema migrations-first (sem auto-sync em produção), hardening de segurança (Helmet, allowlist de CORS, bcrypt, sanitização XSS no conteúdo do usuário) e graceful shutdown drenando o pool de conexões. Testado com Jest no backend e Vitest no frontend. Entregue completo para a cliente; sigo evoluindo.

decisões & tradeoffs
  • Por que vídeo dentro da plataforma em vez de linkar Zoom?
    WebRTC dentro da plataformaA sessão é o produto. Mantê-la na marca, com compartilhamento de tela no 1:1 e um modo de grupo gerenciado pra cursos, é o diferencial - e tira a fricção de instalar app que perde paciente antes da primeira chamada.
  • Por que o Stream Video SDK?
    WebRTC gerenciado + tokens por papelWebRTC de produção com tokens por papel gerados no servidor e chamadas de grupo de verdade, sem ter que rodar e escalar meus próprios media servers. Permitiu uma infraestrutura só servir terapia 1:1 e curso 30+.
  • Por que modelo genérico de item de loja + turmas?
    Um modelo, vários tipos de produtoE-book, produto avulso e curso por turma compartilham um modelo só, e as janelas de matrícula de um curso são só turmas. Lançar uma turma nova é dado, não mudança de código.
  • Como impedir duas pessoas de comprarem a última vaga de uma turma?
    SELECT FOR UPDATE na inscriçãoInscrições concorrentes estavam vendendo além do limite de vagas, e turma vendida a mais é reembolso e promessa quebrada com aluno real. Agora a vaga é reservada sob um lock de linha dentro da transação de pagamento. O trade-off é segurar um lock no caminho do checkout, o que aceito porque vender vaga a mais é pior que um checkout mais lento.
  • Por que suportar boleto, não só cartão?
    Cartão + boletoUma fatia grande de brasileiros ainda paga curso no boleto. Deixar de fora perde venda real de forma silenciosa, então o checkout suporta os dois com o mesmo fluxo de status em tempo real.
Histórico
em evolução
  1. Jul 2026Polimento de marca e UX, migração de domínio
  2. Jun 2026Rebrand para Germina Prime
  3. Jun 2026Modo aula ao vivo: chat na chamada, controles do host, compartilhar tela
  4. Mai 2026Turmas com trava atômica de vaga e contador de vagas em tempo real
  5. Abr 2026Multi-terapeuta, pagamento migrado pra Stripe, vídeo movido pra API
  6. Fev 2026Loja com pedidos e status de pagamento ao vivo por websocket
  7. Nov 2025MVP: pacientes, disponibilidade, agendamento e auth

Em produção atendendo pacientes reais, com um lançamento de curso pra 30+ participantes simultâneos (com compartilhamento de tela) em preparação. Um produto completo entregue pra cliente: agendamento, vídeo 1:1 e em grupo na plataforma, blog self-service e loja de cursos com cartão+boleto, sobre clean architecture que sigo evoluindo.