Um ponto único de assinatura tipado para cada documento.
A1/PKCS#12, PDF/PAdES, XML-DSig e provedores remotos, tudo nativo de Effect. Troque o assinador, mantenha o programa — navegador ou servidor, erros tipados, segredos Redacted.
- Clicksign
- Assinafy
- ZapSign
- DocuSeal
- Documenso
Ao vivo · no seu navegador
Assine um PDF real, aqui mesmo.
Sem backend, sem upload, sem SaaS. Solte um PDF, clique onde a assinatura vai, carregue seu A1 (e-CPF / e-CNPJ) e assine com WebCrypto. O documento e a chave privada nunca saem da página.
Envie seu PDF
Renderizado localmente com pdf.js.
Clique para posicionar
Solte o retângulo de assinatura PAdES em qualquer lugar de qualquer página.
Assine com seu A1
Seu .pfx e a senha assinam no navegador via WebCrypto.
100% no cliente · WebCrypto · PAdES (AdES-BES)
Autoassinatura
Posicione uma vez. Assine a pilha inteira.
Vários contratos reais são gerados no seu navegador com @react-pdf/renderer, renderizados no mesmo canvas de posicionamento pdf.js que o assinador usa, e então posicionados e assinados automaticamente numa fila — um documento por vez.
Provedores remotos
Um SDK para cada assinador.
Oito provedores de assinatura, um único formato de requisição. Escolha um provedor — a chamada create*SignatureRequest muda, o código da sua aplicação não.
- Adaptadores
- Cada provedor é um create*SignatureRequest sobre um SignatureHttpClient compartilhado — o código específico do provedor fica fora do seu app.
- Erros tipados
- Nada lança exceção. Toda falha é um SignatureKitError no canal do Effect, marcado com o provedor e um código literal.
- Segredos protegidos
- Tokens e chaves de API permanecem em Redacted até a chamada HTTP — nunca logados, nunca vazados.
- Um formato de requisição
- A mesma requisição title / documents / recipients normaliza para um RemoteSignatureRequest em todos os oito provedores.
import { createClicksignSignatureRequest } from "@signature-kit/clicksign"
import { signatureHttpClientLive } from "@signature-kit/core/http"
import { Effect, Redacted } from "effect"
const request = yield* createClicksignSignatureRequest(
{
accessToken: Redacted.make(process.env.CLICKSIGN_TOKEN ?? ""),
environment: "sandbox",
locale: "pt-BR",
autoClose: true,
},
{
title: "Membership agreement",
documents: [{ fileName: "agreement.pdf", mimeType: "application/pdf", content: pdfBytes }],
recipients: [{ name: "Bruno Lima", email: "bruno@example.com", role: "signer" }],
},
).pipe(Effect.provide(signatureHttpClientLive))Sete capacidades
Tudo o que você assina, uma só API.
A1 / PKCS#12 no navegador ou no servidor, PDF·PAdES e XML-DSig, oito provedores remotos, um canal de erros tipado e uma camada React para assinatura no navegador — a mesma ergonomia nativa de Effect em todos os backends.
import { signatures } from "@signature-kit/core/signatures"a1SignaturesLayer({ pfx, password: Redacted.make(password) })signPdf({ pdf, policy: "pades-icp-brasil" })signXml({ xml, referenceId: "nfe-1" })createClicksignSignatureRequest(config, request)Effect.catchTag("SignatureKitError", handle)import { signBrowserPdf } from "@signature-kit/pdf/browser"Dois passos
Sua primeira assinatura, de ponta a ponta.
Instale o núcleo e o assinador A1, depois construa uma layer e execute um programa que inspeciona o certificado e assina.
bun add @signature-kit/core @signature-kit/a1npm install @signature-kit/core @signature-kit/a1pnpm add @signature-kit/core @signature-kit/a1yarn add @signature-kit/core @signature-kit/a1@signature-kit/core é o ponto de entrada tipado. Cada assinador e formato é instalado apenas quando você precisa dele: /a1/pdf/xml
import { a1SignaturesLayer } from "@signature-kit/a1/signer"
import { signatures } from "@signature-kit/core/signatures"
import { Effect, Redacted } from "effect"
// Load the A1 / PKCS#12 container once — pfx is the .pfx/.p12 *bytes*.
const layer = a1SignaturesLayer({
pfx,
password: Redacted.make(process.env.A1_PASSWORD ?? ""),
})
// Inspect the certificate, then sign — typed errors, no thrown exceptions.
const program = Effect.gen(function* () {
const identity = yield* signatures.inspect()
const artifact = yield* signatures.sign({
content,
algorithm: "rsa-sha256",
})
return { identity, artifact }
}).pipe(Effect.provide(layer))
const { identity, artifact } = await Effect.runPromise(program)runPromiseresolve para aidentityanalisada e oartifactassinado. A partir daqui, troque a layer A1 por um formato —signPdfousignXml— ou entregue o programa a um provedor remoto.
Quando você quiser
Implemente a camada de assinatura uma vez.
Código aberto, licença MIT, nativo de Effect. A1, PDF, XML e provedores remotos sob um único programa tipado — cada falha um valor no qual você pode fazer match.