InícioLallekDocumentaçãoPerfil de desenvolvedorAbrir Estúdio
code_blocksDocumentação oficial

Construa sobre o Lallek

Referência técnica para criar applets no ambiente isolado e receber eventos assinados do Lallek em sistemas externos.

AtivoPerfil de desenvolvedor
AtivoProjetos e pacotes assinados
AtivoSubmissão e catálogo público
Auditado em 19/08/2026Contrato e endpoints atuais
Primeiros passos

Acesso de desenvolvedor

As ferramentas exigem uma conta autenticada e um perfil de desenvolvedor ativo. O pedido de perfil é feito dentro do Lallek e passa pela análise da equipe antes da ativação.

1Entre no Lallek

Use sua conta na versão web ou desktop.

2Solicite o perfil

Informe experiência, proposta e áreas de interesse.

3Abra as ferramentas

Após a ativação, use Estúdio e Webhooks Manager.

Applets

Crie e teste um applet

O Estúdio mantém cada projeto na sua conta, incrementa sua revisão a cada salvamento e oferece um preview em iframe isolado, sem acesso à rede ou à sessão do Lallek.

main.js
window.LallekPlugin = {
  id: 'meu-applet',

  mount(ctx) {
    ctx.root.innerHTML = `<button id="acao">Executar</button>`;
    ctx.root.querySelector('#acao').onclick = () => {
      ctx.emit('acao.executada', { origem: 'painel' });
    };
  },

  update(ctx) {
    console.log('Configuração atualizada', ctx.config);
  },

  unmount(ctx) {
    ctx.root.innerHTML = '';
  }
};
  • mount(ctx) é obrigatório e recebe o contexto do runtime.
  • update(ctx) pode reagir a mudanças de configuração.
  • unmount(ctx) deve liberar interface e listeners criados pelo applet.
  • O código persistido pode ter no máximo 200 KB.
Referência

Manifesto do projeto

O manifesto descreve a identidade, a versão e os recursos solicitados pelo applet. O identificador deve permanecer estável entre versões.

manifest.json
{
  "id": "meu-applet",
  "name": "Meu Applet",
  "version": "0.1.0",
  "author": "Sua organização",
  "category": "classroom",
  "runtime": "sandboxed",
  "entry": "main.js",
  "permissions": ["ui:panel"],
  "capabilities": {
    "panel": true,
    "toolbar": false,
    "backgroundTask": false
  }
}
CampoRegra atual
idLetras minúsculas, números e hífens; até 80 caracteres.
nameEntre 2 e 80 caracteres.
versionVersão semântica no formato 1.0.0.
categoryclassroom, coding, music, media ou external-tool.
runtimeRascunhos reconhecem os runtimes disponíveis; o pacote seguro v1 aceita somente sandboxed.
permissionsui:panel, room:read, room:write, media:embed e audio:playback.
Runtime

Contexto de execução

PropriedadeDisponibilidade no preview
ctx.rootElemento exclusivo onde a interface deve ser montada.
ctx.configObjeto de configuração atual do applet.
ctx.roomExposto somente quando room:read foi declarado.
ctx.roomActionsExposto somente com room:write; envia uma solicitação ao host, sem acesso direto ao estado.
ctx.manifestManifesto completo do projeto em execução.
ctx.emit(name, data)Emite um evento para o host do preview e o registra no console.

O preview usa um iframe de origem opaca e aplica uma política de conteúdo que bloqueia conexões de rede. Imagens e mídia são limitadas a dados incorporados ou blobs locais.

Distribuição segura

Pacote .lallek-applet assinado

O botão Gerar pacote assinado salva o projeto, valida o manifesto no servidor e cria um documento v1 assinado com Ed25519. Cada arquivo e o payload completo recebem SHA-256 antes da assinatura.

1Validação no servidor

O backend relê o projeto pertencente à conta e não aceita código enviado diretamente pela ação de empacotamento.

2Assinatura da identidade

Cada desenvolvedor possui uma chave Ed25519. A chave privada permanece cifrada no servidor e nunca é entregue ao navegador.

3Importação verificada

O Estúdio recalcula hashes, consulta a chave registrada e confirma assinatura e perfil ativo antes de importar.

PropriedadeGarantia
formatVersion: 1Contrato determinístico do pacote Lallek.
integritySHA-256 de main.js, icon.svg e do payload canônico.
signatureEd25519, identificador da chave e impressão digital pública.
developerIdentidade comparada com um perfil de desenvolvedor ativo no servidor.
Versões imutáveis: a combinação desenvolvedor + identificador + versão só pode representar um conteúdo. Alterou código ou manifesto? Incremente a versão antes de assinar novamente.
Applets oficiais: o proprietário da plataforma pode usar Sincronizar oficiais no Estúdio para persistir e assinar os 11 applets do catálogo. A reunião consulta o pacote publicado no backend e executa seu código em iframe isolado.
Rascunho não é pacote: JSON antigo sem assinatura não é aceito pela importação segura e não pode ser tratado como instalável ou publicável.
Loja Lallek

Submissão, curadoria e publicação

Um perfil de desenvolvedor ativo pode usar Submeter à Loja. A ação salva o projeto, gera ou reutiliza exatamente a versão assinada e envia esse pacote à fila de curadoria.

1Submissão verificada

Somente um pacote pertencente à conta, íntegro e assinado por uma chave ativa entra na fila.

2Curadoria

A equipe pode iniciar a análise, solicitar alterações com parecer, rejeitar ou aprovar. Uma correção exige nova versão e novo pacote.

3Publicação atômica

A aprovação registra a versão no histórico imutável e atualiza a versão atual do catálogo em uma única operação.

StatusSignificado
pendingAguardando a equipe iniciar a curadoria.
in_reviewPacote em análise.
changes_requestedO parecer solicita uma nova versão corrigida.
rejectedVersão não aprovada.
publishedVersão disponível na Loja e carregada por pacote assinado nas reuniões.
Posse do identificador: na primeira publicação, o identificador global fica vinculado ao desenvolvedor. Outra conta não pode publicar por cima dele.
Submeter não publica automaticamente: o applet só aparece no catálogo depois de uma aprovação explícita da equipe.
Webhooks

Configure um endpoint

O Webhooks Manager envia requisições HTTP POST para uma URL HTTPS pública cadastrada pelo desenvolvedor. O segredo de assinatura aparece somente durante a criação ou rotação.

1Cadastre a URL

Use um domínio HTTPS público, sem redirecionamento.

2Escolha os eventos

Assine apenas os eventos necessários à integração.

3Teste e acompanhe

Confira status HTTP, HMAC, duração e retentativas.

Diagnóstico integrado: o Manager pode criar um receptor do StudioHallel, entregar um POST assinado e registrar quando a assinatura HMAC for validada ponta a ponta.
CabeçalhoConteúdo
X-Lallek-EventNome do evento entregue.
X-Lallek-DeliveryUUID único da tentativa de entrega.
X-Lallek-Signaturet=timestamp,v1=assinatura_hex.
Content-Typeapplication/json.
Corpo comum da entrega
{
  "id": "uuid-do-evento",
  "event": "room.created",
  "created_at": "2026-08-18T18:00:00.000Z",
  "data": { "room_id": "...", "name": "..." }
}
Eventos

Catálogo atual

room.created

Emitido depois da criação bem-sucedida de uma sala pela conta. Dados: room_id e name.

participant.invited

Emitido depois da criação de um convite. Dados: participant_id, email, name e room_id.

applet.project.saved

Emitido depois que um projeto é persistido. Dados: project_id, applet_id, name e revision.

webhook.test

Disparo manual do Manager. Dados: message e endpoint_id.

Os webhooks observam os eventos concluídos. Eles não modificam permissões, visibilidade nem regras de criação de salas.
Autenticidade

Valide a assinatura HMAC

A assinatura é um HMAC SHA-256 de timestamp.corpo_bruto. Faça a verificação antes de interpretar o JSON e compare os hashes em tempo constante.

Node.js
import { createHmac, timingSafeEqual } from 'node:crypto';

export function verifyLallekWebhook(rawBody, header, secret) {
  const parts = Object.fromEntries(
    header.split(',').map(part => part.split('=', 2))
  );
  const timestamp = Number(parts.t);
  if (!timestamp || Math.abs(Date.now() / 1000 - timestamp) > 300) {
    return false;
  }

  const expected = createHmac('sha256', secret)
    .update(`${parts.t}.${rawBody}`)
    .digest();
  const received = Buffer.from(parts.v1 || '', 'hex');

  return expected.length === received.length &&
    timingSafeEqual(expected, received);
}
Importante: use os bytes do corpo exatamente como recebidos. Recriar o JSON com JSON.stringify() antes da validação pode produzir uma assinatura diferente.
API autenticada

Endpoints usados pelas ferramentas

O Estúdio e o Webhooks Manager usam estes endpoints do backend Lallek. Todos exigem a sessão do usuário; operações sensíveis também validam perfil ativo, posse e permissão no servidor.

Método e rotaFunção atual
GET/POST /developer/profile-requestConsulta ou envia a solicitação de perfil.
GET /developer/profileRetorna o perfil ativo vinculado à sessão.
GET /developer/projects
PUT/DELETE /developer/projects/:id
Lista, salva com revisão e remove projetos pertencentes ao usuário.
POST /developer/projects/:id/packageValida no servidor e gera ou reutiliza a versão assinada imutável.
POST /developer/packages/verifyConfere estrutura, hashes, assinatura, chave e identidade do desenvolvedor.
POST /developer/packages/:id/submit
GET /developer/submissions
Envia à curadoria e acompanha o status da submissão.
GET/POST/PATCH/DELETE /developer/webhooksGerencia endpoints, eventos, segredo e estado do proprietário.
GET /developer/webhook-deliveriesConsulta histórico auditável e permite reenvio de falhas.
Não exponha o token em URL. Os clientes oficiais enviam a sessão em cabeçalho e o servidor reaplica posse e permissões em cada operação.
Operação segura

Entrega, erros e proteção

  • O endpoint deve responder com HTTP 2xx em até 10 segundos.
  • Redirecionamentos não são seguidos; URLs locais, domínios internos e IPs literais são recusados.
  • Cada tentativa registra status, código HTTP, duração, erro e próxima retentativa no histórico do proprietário.
  • Falhas transitórias geram até cinco tentativas, com intervalos de 1, 5, 15 e 60 minutos.
  • Entregas com falha podem ser reenviadas manualmente pelo histórico.
  • Após dez falhas consecutivas, o endpoint é pausado automaticamente e pode ser reativado pelo proprietário.
  • Guarde o segredo em um cofre ou variável de ambiente e renove-o imediatamente se houver exposição.
  • Use o UUID do evento para tornar seu processamento idempotente.
  • Responda rapidamente e envie trabalho demorado para uma fila do seu próprio sistema.