F
Feint
Canary tokens for your codebase

Give them
something
to find.

Decoy credentials that look real and grant next to nothing, placed where intruders and their agents go looking. The first use tells you where they are and when they were there, with the source address whenever the platform records one.

Start a pilot See how it works
DECOY / gl-pat-01 Armed
.env.production
GITLAB_TOKEN=glpat-xxxxxxxxxxxxxxxxxxxx
# rotated 04-02 — do not commit
Token used
gitlab.com · projects.list
203.0.113.44 · 02:14:07 UTC
Your team is emailed as soon as GitLab reports the use.

The intruder is increasingly
a program that reads everything

Threat actors now hand the tedious part to agents: sweep a foothold for credentials, try each one, map what it opens. A git token is the prize, because source access is where the next moves come from — vulnerabilities to exploit, secrets to harvest, and a copy of the codebase to hold for extortion.

An agent does not weigh whether a token looks suspicious. It finds a credential, it uses it, it moves on. That reflex is exactly what a decoy is built to catch: a token that exists only to be picked up, in an environment where nothing legitimate ever would.

Why agents trip decoys
01

They enumerate. Every file, variable and log that might hold a secret gets read, so a decoy in any of them gets read too.

02

They validate. A found token is tried against the platform to see what it opens. That single call is the alert.

03

They are fast. Minutes from foothold to harvest, which is why the signal has to come from the first touch, not from a pattern learned over weeks.

Attackers rarely
trip an alarm.
They sign in.

Once a credential is in hand, everything an intruder does looks like ordinary work. Repos get read, code gets cloned, releases get published. No rule fires, because no rule was broken.

The build pipeline is where those credentials live, and it is where this year's supply-chain compromises went. A decoy credential placed there is the one thing in that environment only an attacker would ever touch.

Grafanagithub workflow · post-incident review

A workflow let untrusted pull-request code run with credentials in reach. The alert that told them came from a canary token.

LiteLLMpypi · march 2026

Malicious releases pushed straight to PyPI after a security scanner inside the CI pipeline was compromised.

TanStacknpm · may 2026

Malicious releases published from the project's own trusted workflow, via a cache-poisoning chain in GitHub Actions. No password was stolen.

Three steps, one afternoon

01

Generate

Create a decoy secret from the console. It has the shape and prefix of a real credential and access to nothing.

02

Place

Put it where someone would go looking — a config file, a CI variable, an internal runbook, a stale branch. You record the placement in your own words; that is what the alert will name.

03

Hear about it

The first time it is used, your team gets an email naming the placement and the time, with the source address whenever the platform records one. The canary's page keeps every use after that.

Where a decoy earns its keep

A token only works if it sits where someone would go looking. These are the places attackers and their agents search first; your team decides which ones are in scope. GitLab project tokens today; GitHub is in development, with more token types to follow.

01 Repo config .env files, sample configs, committed fixtures
02 CI variables Actions secrets and build environments
03 Internal docs Runbooks and wiki pages an agent will read first
04 Stale branches Abandoned work nobody audits any more
05 Developer laptops Dotfiles and local credential stores

One alert, one meaning

A decoy credential has no legitimate use in your estate. If it fires, someone found it. There is no tuning phase and no baseline to learn.

Nothing to deploy

A token is a string. No agents on endpoints, no sensor fleet to maintain, no change window to negotiate with platform teams.

Reads well upstairs

The alert names a placement in your own words and a time. That reads the same to the engineer who triages it and to the board that asks what was touched and for how long.

One decoy in the pipeline

A CI variable nothing legitimate reads. The pipeline runs exactly as before; the first job, script or person that does read it has told you where they are.

A decoy token placed in CI variables raises an alert the moment it is used A pipeline of four stages: source, CI variables, CI runner, deploy. One CI variable is a decoy token. Below, in order: someone reads it by dumping the runner's job environment, the token is used against GitLab, and the alert names the CI variables of that pipeline. 01 · Source push main a3f9c1e 02 · CI variables DATABASE_URL •••••••••••• SENTRY_DSN •••••••••••• GITLAB_TOKEN glpat-xxxxxxxxxxxxxxxxxxxx decoy 03 · CI runner job env loaded 04 · Deploy prod ok dumps the runner's job environment 1 · Someone reads it A compromised runner, a leaked job log, an agent with repo access, a departed contractor's laptop. $ env | grep TOKEN 2 · Token used gitlab.com · projects.list from 203.0.113.44 It grants next to nothing. GitLab still records the use. 3 · Alert CI variables · pipeline web-api Not "something is wrong". Exactly where they were. Emailed to your team as soon as GitLab reports the use.

One repo.
Two decoys.
One week.

We will sit with your detection team, pick the placements together, and be on the call when the first alert lands. If nothing fires, you have lost a week and learned where your blind spots are not.

Read access is never required. A decoy token grants next to nothing, so nothing in production changes.