Detected at attach time
Overlay markers, injected globals, script reads, signed requests — seen 0.1–0.5 s after attach, before the first action.
NanoTarget spots the agent the moment it attaches to a signed-in session, and lets each endpoint allow, mask, step up or block. Three lines on the server.
npm i nanotarget
Their clicks move like a hand. The endpoint returns the balance.
Seen in 0.3 s. What is on screen is sealed before the agent reads it.
Balance masked. Export blocked. Every decision logged.
A passkey proves presence. The session is theirs again.
Bot management works at the door. NanoTarget works inside the session, at the endpoint that returns the data.
Overlay markers, injected globals, script reads, signed requests — seen 0.1–0.5 s after attach, before the first action.
A hand curves, trembles and slows onto the target. A driver teleports and releases in 1–4 ms. AUC 0.999, zero false positives.
allow · mask · step_up · block per resource, in your JSON, decided on your server, written to an audit log.
What is already on screen is redacted the instant an agent appears. Its read sees ••••.
After an agent, the session stays “agent” until the person proves presence with Touch ID or Windows Hello.
Start in observe: nothing blocked, everything recorded. Review, then flip one word.
Three kinds of pointer, live: a hand, a driver, a bot pretending to be a hand.
In 2026, customers log in to their bank, their CRM and their insurer with an AI agent.No application has an answer to that.We are the answer.
Hand your coding agent the npm link and say “install this”. It scans your app, proposes what to gate, and wires it in.
// npm i nanotarget — the engine (nanotarget-engine) is installed with it; import only from 'nanotarget/express'
import { nanotarget } from 'nanotarget/express';
const nt = await nanotarget({
secret: process.env.NT_SECRET, // ≥ 32 bytes, stable — signs tokens and decision proofs
policy: './nanotarget.policy.json',
db: 'sqlite:./nanotarget.db',
identify: (req) => req.session?.userId ?? null, // your login id, never a constant
apiKey: process.env.NT_API_KEY, // optional: the portal shows agent share, decisions, proofs
});
app.use(nt.middleware()); // serves /nanotarget/sdk.js, /health, /proof-keys and the SDK's API
app.get('/api/balance', nt.protect('balance.read'), (req, res) => nt.send(req, res, balance, maskBalance));
<script src="/nanotarget/sdk.js"></script>
// call protected endpoints through the SDK; it sends the evidence and keeps one visitor one session
const r = await NanoTarget.fetch('/api/balance');
// mark rendered sensitive values; they are redacted the instant an agent attaches
<div data-nt-sensitive="full">$4,939.10</div>
// after deploying: four checks, then the auditor's own check of a proof
npx nanotarget verify https://your-app.example /api/balance
npx nanotarget verify-proof proofs.json --keys https://your-app.example/nanotarget/proof-keys
{
"version": "bank-policy-1",
"enforcement": "observe",
"rules": [
{ "resource": "balance.read", "onAgent": "mask", "onArtifact": "mask", "onUnknown": "allow", "onHumanLike": "allow" },
{ "resource": "report.export", "onAgent": "block", "onArtifact": "step_up", "onUnknown": "step_up", "onHumanLike": "allow" }
]
}
https://www.npmjs.com/package/nanotarget — install this into my project.
Follow the README protocol: `npm i nanotarget` (one package; its engine dependency comes with it),
scan the app, show me what an AI browser agent could reach and how to gate it, ask me the nine
decisions, implement server + page + policy + masks, verify with `npx nanotarget verify`, then report.
Licence: the package is Apache-2.0; the engine is BUSL-1.1 with production use granted — say so if asked.
Open one as yourself — everything works. Paste the prompt into an agent and watch the same account close.
One npm i nanotarget. The SDK and middleware are Apache 2.0; the engine they pull in is source-available, production use granted. Everything runs on your server. Add an API key and the portal shows you how many of your sessions had an AI agent in them.