Complete Markdown reference
Readable and downloadable English API reference.
Nyxovira Plugin API
KapiTomo documentation
A plugin connects Nyxovira to a reading site, shows the chapter list quickly, and prepares only the chapters selected by the user.
Enter a real work URL from the source and copy the complete request into the conversation with the AI that will create and validate the plugin.
Change the URL; the prompt updates automatically.
Open each published resource directly from this documentation.
Readable and downloadable English API reference.
Official machine-readable manifest contract.
Sanitized HTML, JSON, novel, manga, and encrypted API examples.
Upload a ZIP, test one real chapter, copy the report, and leave no stored session.
Prepare plugin.json, map the site, and build chapter downloads.
Use the hosted browser test without installing the Android app or opening an emulator.
A plugin is ready only after a real chapter is downloaded, saved, and reopened successfully.
Distribution is a separate optional step and does not change how the plugin itself is created.
The creator starts with plugin.json and browser/download_target.js. The script performs source-specific discovery and builds the chapter plan.
During development, the creator imports the local plugin folder into Nyxovira and tests it on the supported site.
The plugin may remain private. Publication is optional and happens only after testing.
Legacy manifests may omit the script and use the generic page detector, but new plugins need the script to pass the documented conformance workflow.
Use browser/download_target.js to read rendered HTML and produce the complete chapter plan.
Use the browser script for discovery and declare parser when the native downloader must repeat structured API requests outside the WebView.
parser is mandatory for endpoints, special headers, and decoding; the browser script still handles discovery and the browser session.
Parser optional only means that a manifest can be imported without one. It should be declared for a structured API, special headers, encryption, or native downloading outside the WebView.
Start with the manifest in a non-empty plugin folder. Add the browser script when site-specific recognition is needed.
| File | Purpose |
|---|---|
plugin.json | Identifies the supported site. Start with the minimum fields required by Nyxovira. |
browser/download_target.js | Required for the new conformance workflow. A legacy manifest may import without it and fall back to generic detection. |
This is the smallest practical manifest for importing and testing a plugin:
{
"id": "my-plugin",
"match": { "hosts": ["source.invalid"] },
"browser": {
"home_url": "https://source.invalid/",
"download_target_script_file": "browser/download_target.js"
}
}
To load the source, Nyxovira only needs valid JSON, a non-empty folder name or id, at least one match.hosts entry, and browser.home_url. The example also names the browser script because it is the reliable way to recognize works and chapters. Without it, Nyxovira tries generic page detection, which may not understand every site.
Not required to import the plugin: schema_version, name, version, tags, browser.icon_mode, browser.short_label, GitHub, a catalog, or a plugin website. Declare parser whenever the source needs a structured API, special headers, encryption, or native downloading. If the site provides a stable public favicon or logo, use its URL in browser.icon_url; otherwise the icon may be omitted.
| Field | When it is needed |
|---|---|
id | Strongly recommended; otherwise Nyxovira uses the folder name. |
match.hosts | Required. Domains recognized by the plugin. |
browser.home_url | Required. Page opened by the app browser. |
browser.download_target_script_file | Required for a newly developed plugin; points to the discovery and chapter-plan script. |
name, version | Optional for importing; useful for identification, sharing, and updates. |
tags | Not needed by the plugin runtime. Add them only if an external catalog uses tags for organization or filtering. |
browser.icon_url | Optional. Prefer the site's public favicon or logo when one is available. |
parser | Required for structured APIs, special headers, encryption, or native downloading outside the WebView. It may be omitted only when the browser plan already contains final content. |
Map the site's names to the fields Nyxovira expects: title, cover, chapters, text, and page images.
var plugin = {
siteBaseUrl: "https://source.invalid",
siteVariable: "SANITIZED_WORK_INDEX",
siteRoutes: {
detailsHash: "series",
readerHash: "reader"
},
appRoutes: {
publicSeriesPath: "manga",
publicChapterPath: "chapter"
},
fields: {
workId: "slug",
workTitle: "name",
workSummary: "synopsis",
workCover: "cover_url",
workChapters: "episodes",
chapterParagraphs: "text_blocks",
chapterPages: "page_urls",
imageSource: "url"
}
};
When the user taps download, set window.__nyxoviraChapterPlan immediately and return the canonical work URL.
window.__nyxoviraChapterPlan = JSON.stringify({
title: "Work title",
summary: "Short summary",
canonicalUrl: "https://source.invalid/manga/work/",
coverUrl: "https://source.invalid/cover.png",
chapters: [
{
id: "chapter-forest-hunt",
number: "1",
title: "The Forest Hunt",
contentType: "novel",
paragraphs: ["First paragraph.", "Second paragraph."]
}
]
});
return "https://source.invalid/manga/work/";
For large comics or APIs, keep the first plan lightweight. Load page URLs only after the user confirms selected chapters.
window.__nyxoviraPrepareDownloadPlan = function (context) {
var selectedIds = Array.isArray(context.selectedChapterIds)
? context.selectedChapterIds
: [];
var plan = context.chapterPlan;
plan.chapters.forEach(function (chapter) {
if (selectedIds.length > 0 && selectedIds.indexOf(chapter.id) < 0) {
return;
}
var payload = getJson(chapter.chapterDataPath);
chapter.pages = payload.pages.map(function (page) {
return page.imageUrl;
});
delete chapter.chapterDataPath;
});
window.__nyxoviraChapterPlan = JSON.stringify(plan);
return plan;
};
Nyxovira passes { selectedChapterIds, chapterPlan }. The function may return the final plan object or a JSON string. If it returns nothing, the app keeps the original plan.
ID invariant: every chapterPlan.chapters[].id must exactly equal the corresponding value received in selectedChapterIds. Never add or remove an id: prefix, convert it to a slug, or replace it with the visible index.
Supported adapters are next_payload, html_series, and aes_json_api. Route fields build work, chapter, reader, bootstrap, page, and CDN requests; request_headers supplies static API headers; map and *_keys map actual JSON paths; route prefixes and image hints control recognition; and encryption fields activate decoding with mapped key material. See the Markdown reference for the operational meaning of every field.
Open the complete parser field reference · Open plugin.schema.json
Map referer, cookies, login, static headers, and per-page tokens separately. Authentication does not make the plugin public-only: it may use an authorized session already opened by the user and only the access granted to that session. A browser-plan page may use { url, headers }; Nyxovira carries those headers into the native image request. Never assume WebView cookies reach native requests unless the required value is explicitly included, and never request, store, export, or embed personal credentials, cookies, or tokens in plugin files or reports. Determine availability from the real authorized session, not from promotional copy or a generic notice.
Keep discovery light, resolve only selected chapters, and exercise pagination or rotating tokens through the last page. The current in-app prepare hook must finish synchronously.
Declare only legitimately observed formats and client-visible key material. Document the envelope fields, key/version selection, encoding, API origin and CDN origin separately. A declared format is not proof; content must decode and the complete chapter must be saved. See the complete synthetic encrypted API flow, including rotating S-box and AES/CBC variants.
For 401/403 check transport requirements; if 403 occurs before the plugin runs, report BLOCKED instead of calling the plugin invalid or bypassing access control. For missing chapters check selectors, pagination and mapping; for empty pages check URL bases, CDN and decoding. If page one works but a later page fails, the plugin is not valid.
Use paragraphs for novels and pages for image chapters. The app also reads images for compatibility.
{
"id": "chapter-forest-hunt",
"title": "The Forest Hunt",
"contentType": "novel",
"paragraphs": [
"First paragraph.",
"Second paragraph."
]
}
{
"id": "chapter-arrival",
"title": "Arrival at the Ruins",
"contentType": "images",
"pages": [
"https://source.invalid/page-001.png",
"https://source.invalid/page-002.png"
]
}
The limited laboratory is the normal plugin development loop. It does not include the library, settings, catalogs, favorites, or permanent downloads. Nyxovira does not require catalog tags or a separately hosted icon to test a plugin. When the site already provides a public favicon or logo, use it in browser.icon_url.
Keep plugin.json and the browser folder together, then create one ZIP.
Open the Plugin Laboratory, upload the ZIP, and enter the URL of a real work.
The hosted test validates the manifest, mapping, chapter IDs, and the complete content of the first and last chapters of the supplied work.
Copy the JSON report. The ZIP, navigation, and collected content are released before the response is returned.
Open the Web Plugin Laboratory
Upload the ZIP and enter the exact work URL that needs testing. The hosted service chooses the first and last chapters automatically and returns PLUGIN_VALID_FOR_TESTED_WORK only after downloading every page in both chapters with the Nyxovira request profile. The report records the ZIP SHA-256 and never claims that another work, chapter, ZIP, or previous installation was validated.
The result must contain temporaryDataReleased: true and stored: false. Without real network validation, state: not validated against the real site.
Complete sanitized examples: simple HTML, JSON API, novel, manga, and encrypted API. All use the reserved source.invalid domain.
Plugin creation ends after complete validation. Tags, schema_version, GitHub, a public catalog, and a plugin website are distribution metadata, not requirements for creating or importing the plugin. Use the site's favicon or logo when available; you do not need to host a separate icon.
If you later choose to share the finished plugin, host your own independent external catalog. This is a separate process and does not create another type of plugin.
This optional step comes only after plugins are ready and tested. It explains how to maintain an independent distribution; it is not a second plugin-creation mode.
A minimal external store can use this structure:
Host the folder at a public HTTPS address. The appearance, search, and plugin cards belong to the store itself; Nyxovira only needs to discover the catalog and receive the installation request. Add one object to the plugins list for every distributed plugin and identify its author and source site correctly.
Declare the catalog in the store's main page. A meta tag with the same name and a content URL is also supported.
<link rel="nyxovira-plugin-catalog" href="catalog.json">
Without a declaration, Nyxovira looks for catalog.json, catalog-store.json, and plugins.json in the page's directory. Users may also connect the JSON URL directly.
{
"schema_version": 1,
"name": "My plugin store",
"hub_url": "https://plugins.source.invalid/",
"plugins": [{
"id": "my-plugin",
"name": "My Plugin",
"author": "Author",
"version": "1.0.0",
"manifest_url": "plugins/my-plugin/plugin.json",
"icon_url": "https://source.invalid/icon.png",
"site_url": "https://source.invalid/",
"status": "active"
}]
}
hub_url identifies the storefront when a JSON URL is connected directly. store_url and homepage are accepted aliases. Relative URLs are resolved against the catalog URL. Repository-based entries may use repository_url, repository_ref, and plugin_path.
This complete example creates the button, explains when the page is open outside the app, and displays the result returned by Nyxovira.
<button id="install-my-plugin" type="button">Install My Plugin</button>
<p id="install-status" aria-live="polite"></p>
<script>
const catalogUrl = new URL("catalog.json", location.href).href;
const status = document.querySelector("#install-status");
document.querySelector("#install-my-plugin").addEventListener("click", () => {
const bridge = globalThis.NyxoviraAndroidBridge
|| globalThis.ArchiveInkAndroidBridge;
if (!bridge || typeof bridge.installCommunityPlugin !== "function") {
status.textContent = "Open this site from Nyxovira to install.";
return;
}
try {
const result = JSON.parse(
bridge.installCommunityPlugin(
catalogUrl,
JSON.stringify({ id: "my-plugin" })
) || "{}"
);
status.textContent = result.message
|| (result.success ? "Plugin installed." : "Could not install the plugin.");
} catch (error) {
status.textContent = "Could not complete the installation.";
}
});
</script>
When the store is open in a regular browser, the example tells the person to open it from Nyxovira. Inside the app, the button installs the matching plugin from the connected catalog.
Host the page, catalog, and plugin files at public HTTPS addresses.
For every plugin, accurately identify the author, source site, and manifest path.
Test the Install button by opening the store from its card under External sites in Nyxovira.
Publish every file over HTTPS.
In Nyxovira, open Sites → External sites and connect the store page or directory.
Open the connected site from its card and tap Install.
Confirm the message returned by the installation.
Valid JSON, a non-empty folder name (or id), at least one supported host, a valid home URL, and a browser script tested against real content; use paragraphs for novels or pages for comics. A real chapter must finish, be saved, and reopen successfully.
If you later distribute it, follow the separate external-catalog section after this checklist.
Um plugin conecta o Nyxovira a um site de leitura, mostra a lista de capítulos rapidamente e prepara apenas os capítulos escolhidos pelo usuário.
Informe a URL de uma obra real da fonte e copie o pedido completo na conversa com a IA que criará e validará o plugin.
Altere a URL; o prompt será atualizado automaticamente.
Abra cada recurso publicado diretamente por esta documentação.
Documentação da API em português para ler ou baixar.
Contrato oficial do manifesto em formato legível por ferramentas.
Exemplos sanitizados de HTML, JSON, novel, manga e API criptografada.
Envie o ZIP, teste um capítulo real, copie o relatório e não deixe uma sessão armazenada.
Prepare o plugin.json, mapeie o site e monte os downloads de capítulos.
Use o teste hospedado no navegador sem instalar o aplicativo Android nem abrir emulador.
O plugin só fica pronto depois que um capítulo real for baixado, salvo e reaberto com sucesso.
A distribuição é uma etapa opcional separada e não muda a forma de criar o plugin.
O criador começa com plugin.json e browser/download_target.js. O script descobre a fonte específica e monta o plano de capítulos.
Durante o desenvolvimento, o criador importa a pasta local do plugin no Nyxovira e testa no site compatível.
O plugin pode continuar particular. A publicação é opcional e acontece somente depois dos testes.
Manifestos antigos podem omitir o script e usar o detector genérico, mas plugins novos precisam do script para passar pelo fluxo de conformidade documentado.
Use browser/download_target.js para ler o HTML renderizado e produzir o plano completo.
Use o script para descoberta e declare parser quando o downloader nativo precisar repetir requisições estruturadas fora da WebView.
parser é obrigatório para endpoints, cabeçalhos especiais e decodificação; o script continua cuidando da descoberta e da sessão do navegador.
Parser opcional significa apenas que o manifesto pode ser importado sem ele. Declare-o para API estruturada, headers especiais, criptografia ou download nativo fora da WebView.
Comece pelo manifesto em uma pasta de plugin com nome não vazio. Adicione o script quando o site exigir reconhecimento específico.
| Arquivo | Função |
|---|---|
plugin.json | Identifica o site compatível. Comece pelos campos mínimos exigidos pelo Nyxovira. |
browser/download_target.js | Obrigatório no novo fluxo de conformidade. Um manifesto antigo pode importar sem ele e recorrer ao detector genérico. |
Este é o menor manifesto prático para importar e testar um plugin:
{
"id": "my-plugin",
"match": { "hosts": ["source.invalid"] },
"browser": {
"home_url": "https://source.invalid/",
"download_target_script_file": "browser/download_target.js"
}
}
Para carregar a fonte, o Nyxovira precisa somente de JSON válido, nome de pasta ou id não vazio, pelo menos um item em match.hosts e browser.home_url. O exemplo também indica o script do navegador porque ele é a forma confiável de reconhecer obras e capítulos. Sem ele, o Nyxovira tenta usar o detector genérico da página, que pode não compreender todos os sites.
Não exigidos para importar o plugin: schema_version, name, version, tags, browser.icon_mode, browser.short_label, GitHub, catálogo ou site de plugins. Declare parser sempre que a fonte exigir API estruturada, headers especiais, criptografia ou download nativo. Se o site fornecer favicon ou logo público e estável, use essa URL em browser.icon_url; se não houver, o ícone pode ser omitido.
| Campo | Quando é necessário |
|---|---|
id | Fortemente recomendado; se faltar, o Nyxovira usa o nome da pasta. |
match.hosts | Obrigatório. Domínios reconhecidos pelo plugin. |
browser.home_url | Obrigatório. Página aberta pelo navegador interno. |
browser.download_target_script_file | Obrigatório em plugin novo; aponta para o script de descoberta e plano de capítulos. |
name, version | Opcionais para importar; úteis para identificação, compartilhamento e atualizações. |
tags | Desnecessárias para executar o plugin. Adicione somente se um catálogo externo usar tags para organização ou filtros. |
browser.icon_url | Opcional. Prefira o favicon ou logo público do próprio site quando estiver disponível. |
parser | Obrigatório para API estruturada, headers especiais, criptografia ou download nativo fora da WebView. Só pode ser omitido quando o plano do navegador já contém o conteúdo final. |
Relacione os nomes usados pelo site com os campos que o Nyxovira espera: título, capa, capítulos, texto e imagens.
var plugin = {
siteBaseUrl: "https://source.invalid",
siteVariable: "SANITIZED_WORK_INDEX",
siteRoutes: {
detailsHash: "series",
readerHash: "reader"
},
appRoutes: {
publicSeriesPath: "manga",
publicChapterPath: "chapter"
},
fields: {
workId: "slug",
workTitle: "name",
workSummary: "synopsis",
workCover: "cover_url",
workChapters: "episodes",
chapterParagraphs: "text_blocks",
chapterPages: "page_urls",
imageSource: "url"
}
};
Quando o usuário toca em baixar, defina window.__nyxoviraChapterPlan imediatamente e retorne a URL canônica da obra.
window.__nyxoviraChapterPlan = JSON.stringify({
title: "Work title",
summary: "Short summary",
canonicalUrl: "https://source.invalid/manga/work/",
coverUrl: "https://source.invalid/cover.png",
chapters: [
{
id: "chapter-forest-hunt",
number: "1",
title: "The Forest Hunt",
contentType: "novel",
paragraphs: ["First paragraph.", "Second paragraph."]
}
]
});
return "https://source.invalid/manga/work/";
Para quadrinhos grandes ou APIs, mantenha o primeiro plano leve. Carregue as URLs das páginas somente depois que o usuário confirmar os capítulos escolhidos.
window.__nyxoviraPrepareDownloadPlan = function (context) {
var selectedIds = Array.isArray(context.selectedChapterIds)
? context.selectedChapterIds
: [];
var plan = context.chapterPlan;
plan.chapters.forEach(function (chapter) {
if (selectedIds.length > 0 && selectedIds.indexOf(chapter.id) < 0) {
return;
}
var payload = getJson(chapter.chapterDataPath);
chapter.pages = payload.pages.map(function (page) {
return page.imageUrl;
});
delete chapter.chapterDataPath;
});
window.__nyxoviraChapterPlan = JSON.stringify(plan);
return plan;
};
O Nyxovira passa { selectedChapterIds, chapterPlan }. A função pode retornar o plano final como objeto ou JSON. Se não retornar nada, o app mantém o plano original.
Invariante de ID: cada chapterPlan.chapters[].id deve ser exatamente igual ao valor correspondente recebido em selectedChapterIds. Nunca acrescente ou remova o prefixo id:, converta para slug ou troque pelo índice visual.
Os adaptadores aceitos são next_payload, html_series e aes_json_api. Campos de rota montam requisições de obra, capítulo, leitor, bootstrap, página e CDN; request_headers fornece headers estáticos; map e *_keys ligam os caminhos reais do JSON; prefixos e dicas de imagem controlam o reconhecimento; campos de criptografia ativam a decodificação com material de chave mapeado. O Markdown descreve o efeito operacional de cada campo.
Abrir referência completa do parser · Abrir plugin.schema.json
Mapeie referer, cookies, login, headers estáticos e tokens por página separadamente. A autenticação não torna o plugin limitado ao conteúdo público: ele pode usar uma sessão autorizada já aberta pelo usuário e somente o acesso concedido a essa sessão. Uma página do plano do navegador pode usar { url, headers }; o Nyxovira transporta esses headers para a requisição nativa da imagem. Não suponha que cookies da WebView chegam às requisições nativas sem incluir explicitamente o valor necessário e nunca solicite, armazene, exporte ou inclua credenciais, cookies ou tokens pessoais nos arquivos do plugin ou nos relatórios. Determine a disponibilidade pela sessão autorizada real, não por texto promocional ou aviso genérico.
Mantenha a descoberta leve, resolva somente capítulos selecionados e percorra paginação ou tokens rotativos até a última página. O hook de preparação atual do app deve terminar de forma síncrona.
Declare somente formatos e material de chave visível no cliente e observado legitimamente. Documente separadamente os campos do envelope, escolha de chave/versão, codificação, origem da API e origem do CDN. Declarar o formato não prova nada; o conteúdo deve ser decodificado e o capítulo completo precisa ser salvo. Veja o fluxo sintético completo de API criptografada, com variantes S-box rotativa e AES/CBC.
Em 401/403 confira transporte; se o 403 ocorrer antes do plugin executar, registre BLOCKED em vez de chamar o plugin de inválido ou contornar o controle de acesso. Sem capítulos confira seletores, paginação e mapeamento; sem páginas confira URL base, CDN e decodificação. Se a página 1 funciona e outra falha, o plugin não é válido.
Use paragraphs para novels e pages para capítulos com imagens. O app também lê images por compatibilidade.
{
"id": "chapter-forest-hunt",
"title": "The Forest Hunt",
"contentType": "novel",
"paragraphs": [
"First paragraph.",
"Second paragraph."
]
}
{
"id": "chapter-arrival",
"title": "Arrival at the Ruins",
"contentType": "images",
"pages": [
"https://source.invalid/page-001.png",
"https://source.invalid/page-002.png"
]
}
O laboratório limitado é o caminho normal durante o desenvolvimento. Ele não possui biblioteca, configurações, catálogos, favoritos nem downloads permanentes. O Nyxovira não exige tags de catálogo nem um ícone hospedado separadamente para testar o plugin. Quando o site já fornecer favicon ou logo público, use-o em browser.icon_url.
Mantenha plugin.json e a pasta browser juntos e crie um único ZIP.
Abra o Laboratório de Plugins, envie o ZIP e informe a URL de uma obra real.
O teste hospedado valida manifesto, mapeamento, IDs e o conteúdo completo do primeiro e do último capítulo da obra informada.
Copie o relatório JSON. O ZIP, a navegação e o conteúdo coletado são descartados antes da resposta.
Abrir o Laboratório Web de Plugins
Envie o ZIP e informe a URL exata da obra que precisa ser testada. O serviço hospedado escolhe o primeiro e o último capítulo automaticamente e só retorna PLUGIN_VALID_FOR_TESTED_WORK depois de baixar todas as páginas dos dois capítulos com o perfil de requisição do Nyxovira. O relatório registra o SHA-256 do ZIP e nunca afirma que outra obra, capítulo, ZIP ou instalação anterior foi validada.
O resultado precisa conter temporaryDataReleased: true e stored: false. Sem validação real de rede, informe: não validado contra o site real.
Exemplos completos e sanitizados: HTML simples, API JSON, novel, manga e API criptografada. Todos usam o domínio reservado source.invalid.
A criação termina depois da validação completa. Tags, schema_version, GitHub, catálogo público e site de plugins são metadados de distribuição, não requisitos para criar ou importar o plugin. Use o favicon ou logo do próprio site quando existir; você não precisa hospedar um ícone separado.
Se depois você decidir compartilhar o plugin pronto, hospede seu próprio catálogo externo independente. Esse é um processo separado e não cria outro tipo de plugin.
Esta etapa opcional vem somente depois que os plugins estiverem prontos e testados. Ela explica como manter uma distribuição independente; não é um segundo modo de criação de plugin.
Uma loja externa mínima pode usar esta estrutura:
Hospede a pasta em um endereço HTTPS público. A aparência, a busca e os cards pertencem à própria loja; o Nyxovira precisa apenas descobrir o catálogo e receber a solicitação de instalação. Adicione um objeto à lista plugins para cada plugin distribuído e informe corretamente seu autor e site de origem.
Declare o catálogo na página principal da loja. Também é aceita uma tag meta com o mesmo nome e a URL em content.
<link rel="nyxovira-plugin-catalog" href="catalog.json">
Sem uma declaração, o Nyxovira procura catalog.json, catalog-store.json e plugins.json na mesma pasta da página. O usuário também pode conectar diretamente a URL do JSON.
{
"schema_version": 1,
"name": "Minha loja de plugins",
"hub_url": "https://plugins.source.invalid/",
"plugins": [{
"id": "my-plugin",
"name": "My Plugin",
"author": "Author",
"version": "1.0.0",
"manifest_url": "plugins/my-plugin/plugin.json",
"icon_url": "https://source.invalid/icon.png",
"site_url": "https://source.invalid/",
"status": "active"
}]
}
hub_url identifica a página da loja quando uma URL JSON é conectada diretamente. store_url e homepage são aliases aceitos. URLs relativas são resolvidas a partir do catálogo. Entradas baseadas em repositório podem usar repository_url, repository_ref e plugin_path.
Este exemplo completo cria o botão, informa quando a página está fora do aplicativo e mostra o resultado retornado pelo Nyxovira.
<button id="install-my-plugin" type="button">Instalar My Plugin</button>
<p id="install-status" aria-live="polite"></p>
<script>
const catalogUrl = new URL("catalog.json", location.href).href;
const status = document.querySelector("#install-status");
document.querySelector("#install-my-plugin").addEventListener("click", () => {
const bridge = globalThis.NyxoviraAndroidBridge
|| globalThis.ArchiveInkAndroidBridge;
if (!bridge || typeof bridge.installCommunityPlugin !== "function") {
status.textContent = "Abra este site pelo Nyxovira para instalar.";
return;
}
try {
const result = JSON.parse(
bridge.installCommunityPlugin(
catalogUrl,
JSON.stringify({ id: "my-plugin" })
) || "{}"
);
status.textContent = result.message
|| (result.success ? "Plugin instalado." : "Não foi possível instalar.");
} catch (error) {
status.textContent = "Não foi possível concluir a instalação.";
}
});
</script>
Quando a loja é aberta em um navegador comum, o exemplo orienta a pessoa a abri-la pelo Nyxovira. Dentro do aplicativo, o botão instala o plugin correspondente no catálogo conectado.
Hospede a página, o catálogo e os arquivos dos plugins em endereços HTTPS públicos.
Para cada plugin, informe corretamente o autor, o site de origem e o caminho do manifesto.
Teste o botão Instalar abrindo a loja pelo cartão criado em Sites externos no Nyxovira.
Publique todos os arquivos em HTTPS.
No Nyxovira, abra Sites → Sites externos e conecte a página ou pasta da loja.
Abra o site conectado pelo cartão e toque em Instalar.
Confirme a mensagem retornada pela instalação.
JSON válido, nome de pasta (ou id) não vazio, pelo menos um host compatível, URL inicial válida e script do navegador testado com conteúdo real; use paragraphs para novels ou pages para quadrinhos. Um capítulo real precisa terminar, ser salvo e reabrir com sucesso.
Se depois você distribuir o plugin, siga a seção separada de catálogo externo após este checklist.