Como modelar agenda e recomendação do festival Lumen com dados por cidade

Como modelar agenda e recomendação do festival Lumen com dados por cidade

Quando eu vejo um festival como o Lumen voltado ao cinema independente com entrada gratuita e foco em diversidade, eu não penso só em “eventos culturais”. Eu penso no que isso exige de engenharia de produção, dados e infraestrutura — desde o planejamento de sessões até como o público encontra obras fora do mainstream. Segundo o Terra.com.br, a 2ª edição do Lumen acontece no Rio de Janeiro de 6 a 14 de novembro e depois faz uma etapa itinerante em Brasília de 3 a 6 de dezembro, no Cine Brasília. E aqui tem um bom insight: se vocês criam plataformas para agenda e descoberta, vocês estão construindo um “produto” com problemas reais de software, UX e acessibilidade.

O Lumen e a “engenharia invisível” por trás do cinema independente

O Terra.com.br descreve o Lumen como um festival que surgiu em 2025 para destacar produção audiovisual instigante e ampliar o espaço de circulação de obras independentes do mundo inteiro. Na prática, isso significa lidar com:

  • Curadoria com diversidade (o que complica a taxonomia de categorias e tags);
  • Programação multissala (o que cria dependências e conflitos de agenda);
  • Fluxo de público (o que exige recomendação e filtros “na cara”);
  • Itinerância (o que obriga a tratar “o mesmo festival” como entidades diferentes por cidade).

Como desenvolvedor, eu gosto desse tipo de desafio porque ele foge do “site estático”. Agenda é dado vivo. Recomendações são escolhas. Acessibilidade e clareza viram requisito — não detalhe.

Datas, cidades e o modelo de dados que evita gambiarra

O Terra.com.br informa que:

  • Rio de Janeiro: 6 a 14 de novembro, em diversas salas.
  • Brasília: 3 a 6 de dezembro, com sede no Cine Brasília.

Isso, no mundo da engenharia, já sugere um erro comum: modelar tudo como “uma única programação” e depois tentar encaixar por cidade. Em projetos reais, eu já vi isso virar bagunça quando o festival muda de local, muda regras e muda até formatos de exibição.

O jeito que costuma funcionar melhor é modelar por camadas:

  • Festival (entidade principal: Lumen 2ª edição).
  • Eventos por cidade (Rio/DF como “campi” ou “stages”).
  • Sessões (uma sessão é uma projeção em uma sala, com data/hora, filme e classificação).
  • Filmes/Obras (metadados: direção, país, duração, tema de diversidade etc.).

Por que isso importa? Porque evita o “estado impossível”. Você consegue responder perguntas como: “Mostre apenas sessões em Brasília para o dia 4”. Sem reprocessar tudo na mão.

Como eu pensaria um sistema de agenda e descoberta (estilo dev)

O festival tem entrada gratuita e quer ampliar o espaço de circulação. Então a experiência precisa ser rápida e informativa. Eu imagino um sistema com:

  • Busca e filtros: por cidade, data, sala, idioma, gênero e temas.
  • Relevância: usuários querem achar rápido o que combina com eles (ex.: “diversidade”, “cinema independente latino-americano”).
  • Agenda consistente: nenhum overlap “fantasma” entre salas, horários e exibições.
  • Observabilidade: logs para detectar sessão “sumindo” ou inconsistência entre cache e banco.

E, principalmente, eu trataria “diversidade” como dado estruturado, não como texto solto. Se for só uma frase do release, a busca e recomendação viram probabilidades ruins.

Recomendação com IA: útil mesmo sem virar “mágica”

Quando alguém fala “IA” nesse contexto, muita gente cai na armadilha de usar modelos grandes sem estratégia. O que funciona melhor em produto de calendário é uma abordagem híbrida:

  • Regras e filtros (por cidade, datas, idioma etc.).
  • Embeddings para similaridade semântica (para tags e sinopses).
  • Boosts de diversidade (para não deixar “padrão de catálogo” dominar).

Na minha experiência, o maior ganho vem de embeddings bem alimentados e taxonomia consistente. O modelo só ajuda quando o dado é tratável.

Na Prática: criando a tela “Sessões por Cidade e Data” sem dor

Vou te mostrar um caminho direto, estilo o que eu faria num projeto real para o Lumen (ou qualquer festival com itinerância e multissalas). A ideia é ter um endpoint que retorna sessões ordenadas e filtráveis.

1) Estrutura base (conceito de API)

  • /api/sessions retorna sessões.
  • Parâmetros: city, startDate, endDate, tags.

2) Query eficiente com índices (o “porquê” do desempenho)

Se você filtra por cidade e intervalo de data, você precisa de índice composto. Sem isso, vira full scan e você vai sofrer em picos (principalmente no dia em que soltam a programação).

3) Exemplo funcional (Node.js + PostgreSQL)

Esse exemplo assume uma tabela sessions com colunas city (text), start_at (timestamp), film_id (uuid/int) e room (text). O filtro por tags eu deixei como “opcional” para você adaptar ao seu schema.

import express from "express";
import pg from "pg";

const app = express();
const pool = new pg.Pool({
  connectionString: process.env.DATABASE_URL
});

app.get("/api/sessions", async (req, res) => {
  const { city, startDate, endDate } = req.query;

  if (!city) return res.status(400).json({ error: "city is required" });
  if (!startDate || !endDate) {
    return res.status(400).json({ error: "startDate and endDate are required" });
  }

  const sql = `
    SELECT
      s.id,
      s.city,
      s.start_at,
      s.room,
      f.title,
      f.language,
      f.country
    FROM sessions s
    JOIN films f ON f.id = s.film_id
    WHERE s.city = $1
      AND s.start_at >= $2::timestamptz
      AND s.start_at <= $3::timestamptz
    ORDER BY s.start_at ASC;
  `;

  const params = [city, startDate, endDate];

  try {
    const { rows } = await pool.query(sql, params);
    return res.json({ sessions: rows });
  } catch (err) {
    console.error(err);
    return res.status(500).json({ error: "internal_error" });
  }
});

app.listen(3000, () => console.log("API running on :3000"));

Por que essa forma é boa? Porque evita gambiarra de filtro no frontend. Você deixa o banco fazer o trabalho certo (com índice), retorna ordenado, e simplifica o estado do cliente. Menos “bugs de UI” e menos lógica duplicada.

Erros Comuns: o que eu vejo devs fazerem e depois pagarem caro

1) Misturar programação de cidades no mesmo array

Você até consegue renderizar, mas perde consistência. Quando alguém filtra por Brasília, você acaba mostrando sessão do Rio por engano ou aplicando filtros errados. O bug fica sutil e só aparece quando a itinerância chega.

2) “Tags” como string solta

Se “diversidade” virar texto livre, você não consegue:

  • filtrar
  • recomendar
  • medir cobertura (ex.: quantas sessões por tema)

Em projetos de descoberta, tags estruturadas valem ouro.

3) Cache sem invalidação clara

Programação costuma sair e mudar. Se o cache fica “por tempo demais”, você entrega horários errados — e isso destrói confiança. Eu costumo usar versão de programação (um número) para invalidar cache quando a curadoria muda.

4) Não planejar acessibilidade desde o começo

Festival atrai públicos variados. Se você faz componente de agenda sem navegação por teclado, sem contraste, sem semântica (headings e labels), você cria barreiras reais. Isso não é “nice to have”. É qualidade de produto.

Comparações que devs entendem: site estático vs. sistema de dados

Um site estático pode até anunciar datas (como “6 a 14 no Rio”, “3 a 6 em Brasília”). Mas assim que você precisa:

  • filtrar por sessão
  • exibir salas
  • lidar com mudanças de programação
  • recomendar obras

você entra no território de sistema. E sistemas exigem:

  • modelagem de dados
  • validação (para evitar dados impossíveis)
  • observabilidade
  • cache com estratégia

Eu já vi time tentar “resolver no frontend” e acabar com estado duplicado, inconsistência e uma UX quebrada no primeiro grande evento.

Implicações práticas para quem programa (e para quem organiza)

Se você é dev e trabalha com apps de agenda/recomendação, o caso do Lumen (com Rio + Brasília e sessões em múltiplas salas) é um excelente laboratório mental. Você aprende ou reforça:

  • como desenhar filtros robustos
  • como separar entidades por escopo (edição/cidade)
  • como manter consistência quando a curadoria muda
  • como evitar “lógica no cliente” para resolver problemas que deveriam estar no dado

E se você é do lado de produção cultural, isso vira uma mensagem importante: entrada gratuita aumenta demanda e acessos ao sistema. Então performance e clareza deixam de ser detalhe e viram requisito operacional.

FAQ (o que um dev realmente perguntaria)

1) Como eu trato “mesma edição do festival” em cidades diferentes?

Eu crio uma entidade para a edição e outra para cada cidade (ou stage). Sessões sempre apontam para a cidade. Assim você evita misturar estados e facilita filtros por local.

2) IA ajuda mesmo em recomendação de filmes/mostras?

Ajuda quando você tem texto estruturado (sinopse/tags) e quer similaridade semântica. Se você usar IA com dados soltos, vira sugestão genérica. Melhor híbrido: regras + embeddings.

3) Como evitar que horários fiquem errados quando a programação muda?

Você versiona a programação e invalida cache quando houver alteração. E registra auditoria (quem alterou, o que alterou, quando) para rastrear divergências.

4) Qual o melhor caminho para performance em consultas por data e cidade?

Índice composto em (city, start_at) e queries que filtram no banco. Retorne dados já ordenados para reduzir trabalho no frontend e evitar re-render pesado.

5) O que é “diversidade” do ponto de vista de produto?

É um conjunto de atributos: temas, recortes, origens, formatos e enfoques. Se for só palavra em texto, você não consegue medir nem recomendar de forma consistente.

Segundo o Terra.com.br, o Lumen faz sua 2ª edição no Rio entre 6 e 14 de novembro e segue para Brasília entre 3 e 6 de dezembro. Para mim, esse tipo de festival é um lembrete prático: cultura também é produto. E produto bom depende de dados bem modelados, UX acessível e engenharia que aguenta mudanças.

Gostou? Me segue no GitHub e deixa um comentário se tiver dúvida ou quiser aprofundar algum ponto.

Y

Yuri Sousa

Front-End Developer / Designer

Desenvolvedor apaixonado por criar experiências digitais acessíveis e visualmente perfeitas. Escrevo sobre desenvolvimento web, design e tecnologia.