Integrar via iframe
Qualquer aplicação web pode incorporar o EDITOR GRATUITO em https://editor.app.br/embed com <iframe> e postMessage. O motor, o protocolo e o plugin Agente são software livre sob GNU AGPL v3.
Licença (GNU AGPL v3)
Usar o iframe público não copia o motor OnlyOffice para o seu domínio: o host só troca bytes de documentos. Mesmo assim, se você modificar, redistribuir ou hospedar este editor (incluindo um fork do plugin Agente), a AGPL v3 Seção 13 exige disponibilizar o código-fonte correspondente aos usuários que interagem pelo rede.
- Código deste site: github.com/editor-app-br/editor-website
- Aviso legal: /legal
- Fonte (AGPL §13): /source
- Contato: contato@prata.dev.br
Não embuta /v*, sdkjs ou x2t WASM no binário do host. O About do editor e as páginas legais permanecem a atribuição OnlyOffice / CryptPad / ZIZIYI.
Thin embed
- Coloque um iframe em https://editor.app.br/embed (ou
/embed?warmup=1só para aquecer o cache). - Espere a mensagem
ready(origemhttps://editor.app.br). - Envie
opencom oArrayBufferdo arquivo. O documento fica na memória do navegador; o servidor do editor não guarda cópia.
Origens permitidas: este site, localhost e apps desktop (Tauri). Outros hosts de produção precisam entrar na allowlist (/embed-partner.json no deploy, ou NEXT_PUBLIC_EMBED_PARTNER_HOSTS em desenvolvimento). Peça inclusão em contato@prata.dev.br.
Host → editor
open— Abre o documento (ArrayBuffer + fileName, fileType, editing, theme, lang). Opcional: variant, hideChrome, plugins.save— Pede exportação. A resposta chega como saved com os bytes.command— Encaminha um comando ao plugin Agente (name + payload).setTheme— theme: dark | light.print— O embed devolve print; o host decide como imprimir.destroy— Derruba a instância do editor.
Protocolo 1.1.0. Tipos em utils/embed-protocol.ts.
Editor → host
ready— Embed pronto para receber open (repete até o host abrir).documentReady— Documento carregado no motor.dirty— value: true quando o usuário edita.saved— Bytes exportados (fileName, fileType, mime, bytes).commandResult— Resultado ou error de um command.completionRequest— Pedido de autocomplete (prefix / suffix) do ghost.ghost— shown / text / accepted da sugestão inline.escape / print / error / warmed— Tecla Esc, pedido de impressão, falha, ou cache de warmup.
Exemplo mínimo
const iframe = document.querySelector("iframe");
const origin = "https://editor.app.br";
window.addEventListener("message", (event) => {
if (event.origin !== origin) return;
if (event.data?.type === "ready") {
iframe.contentWindow.postMessage(
{
type: "open",
requestId: crypto.randomUUID(),
fileName: "contrato.docx",
fileType: "docx",
editing: true,
lang: "pt",
theme: "dark",
plugins: "agent",
bytes: fileBytes,
},
origin,
[fileBytes],
);
}
});Plugin Agente
Com plugins: "agent" no open, o embed carrega o plugin de sistema (GUID asc.{7E4A1C90-2B6D-4F11-9A33-8C0E5D71B2A4}, /office-plugins/agent/). O host não acessa iframe.contentDocument: envia { type: "command", requestId, name, payload } e recebe commandResult.
get_text— Lê o texto (Word, tabelas, slides, planilha ativa).get_outline— Lista títulos (Heading / Título).get_selection— Texto selecionado.insert_text / type— Insere ou digita no cursor (fonte, tamanho, negrito opcionais). HTML inline <b> <i> <u> <br> vira formatação.replace_selection— Substitui a seleção (mesmo HTML inline).format— Negrito, itálico, alinhamento, estilo, lista.table— Insere tabela (rows, cols, data, header).layout— Página (A4/letter, orientação, margens, colunas).goto / select / delete— Navega, seleciona (all ou heading) ou apaga.find_replace— Localizar e substituir (uma ocorrência ou all).get_range / set_range / goto_cell— Células de planilha.suggest / context— Ghost inline; o embed pede completionRequest ao host.undo / redo / ping— Histórico e health-check.
Autocomplete (ghost): o plugin emite completionRequest; o host devolve o texto via command suggest / suggest_update. Preview sem agente: plugins: "none" ou variant: "preview".
Warmup / cache
Um iframe oculto em /embed?warmup=1 faz o navegador persistir JS/WASM no origin editor.app.br (Cache Storage). Isso não é redistribuição: os arquivos não entram no seu app. O HTML de /, /editor e /embed não é cacheado de forma imutável.
Chrome da integração: o embed esconde o avatar dummy e o wordmark EDITOR GRATUITO. O editor público em /editor mantém a marca. Atribuições: /legal.