Planejador de semestre para o curso de Engenharia Biomédica (EB2020), com oferta de turmas de 2026/2. Monte a grade horária, compare turmas, acompanhe requisitos e horas concluídas e organize provas, trabalhos e entregas em uma agenda com notas.
Acesse: cauefabreu.github.io/BioSchedule
HTML, CSS e JavaScript puros, sem etapa de build. O login é opcional e usa Supabase; sem ele, tudo funciona localmente no navegador.
- Funcionalidades
- Como usar
- Armazenamento e sincronização
- Configurar o login (Supabase)
- Arquitetura
- Desenvolvimento
- Publicação
- Segurança
- Fontes dos dados e limitações
- Licenças de terceiros
Grade horária
- Catálogo com 64 componentes curriculares, organizados do 1º ao 10º período.
- Escolha de turma com atualização imediata da grade semanal (segunda a sábado).
- Detecção de conflitos de horário, incluindo conflitos potenciais com aulas quinzenais.
- Verificação de pré-requisitos, co-requisitos e carga mínima concluída (TCC e estágio).
- Totais de aulas por semana, carga curricular da grade e horas já concluídas.
Agenda acadêmica
- Registro de provas, trabalhos, atividades e outros compromissos em qualquer disciplina.
- Data, hora opcional, valor em pontos, nota obtida, anotações e marcação de concluído.
- Visão em lista (atrasados, hoje, próximos 7 dias, mais adiante, concluídos) e calendário mensal.
- Filtros por disciplina, tipo e situação.
- Resumo por disciplina: pontos obtidos, pontos distribuídos e aproveitamento no que já foi corrigido.
Conta (opcional)
- Cadastro com confirmação por e-mail, login, recuperação e redefinição de senha.
- Sincronização da grade e da agenda entre dispositivos.
- Aviso de privacidade (link no rodapé) e exclusão da conta com todos os dados pelo próprio usuário.
- Abra um período no catálogo e marque as disciplinas que pretende cursar.
- Troque a turma no seletor de cada disciplina para comparar horários. Conflitos aparecem destacados na grade e nos alertas.
- Marque como Concluída o que você já cursou. A disciplina sai da grade e passa a contar nas horas concluídas. Disciplinas não ofertadas no semestre também podem ser marcadas como concluídas.
- Na seção Agenda, use + Novo compromisso ou clique em um dia do calendário. O botão Agenda de cada disciplina mostra apenas os compromissos dela.
| Situação | Onde ficam os dados |
|---|---|
| Sem conta | localStorage do navegador e da origem utilizada. Não há sincronização entre navegadores, computadores ou entre a versão local e a publicada. Limpar os dados do navegador apaga as escolhas. |
| Com conta | Banco do Supabase, sincronizado entre dispositivos. |
Ao entrar pela primeira vez em um navegador, os dados locais são mesclados à conta:
- disciplinas concluídas se somam;
- se a mesma disciplina estiver selecionada nos dois lugares, prevalece a turma escolhida na conta;
- os compromissos são unidos e, em caso de conflito, vence a edição mais recente.
Depois do envio, a cópia local é removida, para que nenhum dado fique no computador após o logout. Alterações feitas sem conexão ficam pendentes e são reenviadas automaticamente quando a conexão volta, ou manualmente pelo botão Tentar de novo.
Sem configuração, o botão Entrar não aparece e a aplicação funciona apenas no navegador.
-
Crie um projeto em supabase.com.
-
No SQL Editor, execute
supabase/schema.sql. O script cria as tabelasplanseagenda_items, as políticas de Row Level Security, o limite de registros por usuário e a funçãodelete_own_account, usada na exclusão de conta. Pode ser reexecutado com segurança. -
Em Authentication → URL Configuration, defina
https://cauefabreu.github.io/BioSchedule/como Site URL e adicione-a em Redirect URLs. Para testes locais, inclua tambémhttp://127.0.0.1:4173/. -
Em Authentication → Providers → Email, mantenha a confirmação de e-mail ativa e defina senha mínima de 8 caracteres.
-
Em Project Settings → API, copie a Project URL e a chave pública (anon ou publishable) para
config.js:window.BIO_CONFIG = Object.freeze({ supabaseUrl: 'https://<projeto>.supabase.co', supabaseAnonKey: '<chave pública>', });
Warning
Use somente a chave pública. A chave service_role/secret ignora o Row Level Security e nunca deve ser versionada nem enviada ao navegador. A aplicação detecta essa chave e desativa o login se ela for configurada por engano.
Scripts clássicos, carregados com defer, sem módulos ES. Por isso a aplicação também funciona aberta direto do disco (file://).
| Arquivo | Responsabilidade |
|---|---|
index.html |
Estrutura da página, Content-Security-Policy e diálogos. |
config.js |
Credenciais públicas do Supabase (vazias por padrão). |
data.js |
Catálogo, turmas, horários, cargas e requisitos. |
core.js |
Regras puras: conflitos, requisitos, totais, validação e resumo da agenda, calendário. Sem DOM nem rede. |
store.js |
Persistência local e na nuvem, autenticação, mesclagem e fila de sincronização. |
app.js |
Interface da grade e inicialização. |
agenda.js |
Interface da agenda: lista, calendário e formulário. |
auth.js |
Diálogos de conta. |
styles.css |
Tema escuro e layout responsivo. |
supabase/schema.sql |
Tabelas, restrições e políticas de acesso. |
vendor/ |
Cliente oficial @supabase/supabase-js 2.117.2, carregado sob demanda. |
Requisitos: um navegador moderno. Node.js 18 ou superior só é necessário para testes e versionamento de assets.
# servidor local (qualquer servidor estático serve)
python -m http.server 4173 --bind 127.0.0.1
# testes
node --test tools/core.test.cjs tools/store.test.cjsOs testes cobrem regras da grade, integridade do catálogo, validação da agenda, persistência local e o fluxo de login e sincronização. O fluxo de login usa um Supabase simulado em memória, sem acesso à rede.
O diretório qa/ guarda material local de conferência, é ignorado pelo Git e não deve ser publicado.
O site é publicado pelo GitHub Pages a partir da raiz da branch initial-site. O arquivo .nojekyll desativa o processamento do Jekyll. Veja a documentação de publicação por branch.
Antes de publicar alterações em CSS ou JavaScript, atualize as URLs com hash de conteúdo para evitar versões antigas em cache. O comando não apaga as escolhas salvas dos usuários.
node tools/version-assets.cjs- Content-Security-Policy: scripts e estilos apenas da própria origem; conexões apenas com
*.supabase.co;base,objecte envio de formulários bloqueados. Um domínio personalizado do Supabase exige ajustarconnect-srcemindex.htmleSUPABASE_URLemstore.js. - Isolamento de dados: Row Level Security em todas as tabelas. Cada usuário acessa apenas as próprias linhas, e visitantes anônimos não têm acesso.
- Validação em camadas: entradas são validadas no navegador e novamente no banco (título até 120 caracteres, anotações até 2.000, pontuação de 0 a 1.000, no máximo 2.000 compromissos por usuário). Dados lidos do navegador ou da conta são conferidos contra o catálogo.
- Saída segura: todo texto é escapado antes de ser inserido no HTML.
- Autenticação: fluxo PKCE e mensagens de erro genéricas, que não revelam se um e-mail está cadastrado.
- Privacidade (LGPD): o aviso no rodapé descreve os dados coletados e a finalidade. Estando conectado, o usuário exclui a própria conta pela função
delete_own_account, que só apaga quem a chama. Grade e agenda são removidas junto poron delete cascade. Ao alterar o que é coletado, atualize o texto e a data do aviso emindex.html. - Sem dependências de CDN: a biblioteca do Supabase é servida pelo próprio site.
- Sem dados sensíveis no repositório: nenhum dado pessoal ou chave secreta é versionado.
config.jscontém apenas a chave pública.
Fontes
- Horários:
horario_eng._biom._2026-02_atualizado_0.pdf(Engenharia Biomédica, 2026/2, 12 páginas). - Cargas curriculares, períodos e requisitos:
fluxogramaeb2020-versao12.pdf(página única). - O repositório não inclui cópias dos PDFs nem nomes de professores.
Modelo de dados
hoursé a carga curricular total do componente.prerequisitesexige conclusão.corequisitesaceita conclusão ou seleção na mesma grade.- Lista vazia indica ausência de exigência no fluxograma;
nullindica informação desconhecida. - As disciplinas foram associadas ao fluxograma pelo nome, pois ele usa numeração própria (1 a 64) em vez de códigos. As setas simples (pré-requisito) e duplas (co-requisito) foram conferidas visualmente.
Decisões e observações
- Monitoria Obrigatória foi removida do catálogo por solicitação.
- Todas as extensões (I a V) são online e sem horário fixo. Suas cargas (90h, 60h, 90h, 60h e 120h, total de 420h) contam nos totais sem ocupar a grade semanal.
- TCC exige 2.700h e estágio 2.300h concluídas. A contagem considera apenas o catálogo: optativas, atividades complementares e créditos externos não estão cadastrados. Os avisos não substituem a validação acadêmica oficial.
- O fluxograma aloca TCC e Extensão V no 9º período e estágio no 10º. O PDF de horários agrupa os dois períodos.
- MCS, ESTAT e EXT3 aparecem na continuação da tabela do 3º período, sob o cabeçalho "4º período" na página 5. O fluxograma confirma o 3º período.
- PP mostra "A1/A" nas duas primeiras aulas de quinta. Foi interpretado como A1/A2, com aviso para confirmação.
- E-CE1 é quinzenal e não tem calendário de alternância. Bioquímica tem laboratório quinzenal: B1 a partir de 04/09/2026 e B2 a partir de 11/09/2026. Sobreposições com aulas quinzenais são indicadas como potenciais.
- A média semanal soma a duração das aulas selecionadas, com aulas quinzenais valendo metade e aulas sobrepostas contadas individualmente. Ela não mede tempo livre e não equivale à carga curricular.
- Os asteriscos das turmas de BIOMEC e EHOS não são explicados no PDF e foram mantidos.
- Os horários noturnos e a coluna de sábado seguem a imagem de referência. O PDF não aloca disciplinas nesses horários.
@supabase/supabase-js, MIT. Texto da licença emvendor/supabase-LICENSE.txt.