TILLSHIELD · TILLDEV

See the attack.
Act on it.

Root, jailbreak, pinning failures, overlay abuse — the security signals TillPulse already collects, watched by rules that raise an incident, quarantine the session, or revoke the user’s auth. And now the same rules run inline, at your own edge and origin, deciding each request in real time. Detection you don’t have to be awake for.

LIVE · watching + enforcing
device-compromise · cert-pinning · overlay · threat-intel · inline-waf · human-check
WHAT’S INSIDE

Five moving parts.

DetectionGA

Device integrity, TLS pinning, overlay abuse, web + desktop tamper — collected by the SDKs, scored by severity and confidence.

› Read the docs
Reactive rulesGA

Watch security signals; when a trigger crosses its threshold, take one action — automatically. Test-mode and cooldowns included.

› Read the docs
Inline WAFGA

Enforce rules at request time on your own edge or origin. Rules and a sha256 deny list are fetched and cached; each request is decided locally, off the hot path.

› Read the docs
IncidentsGA

Findings about the same attack become one case: status, an assignee, merges, and one timeline of findings, notes and playbook steps.

› Read the docs
Insider riskGA

Rules for your own members and service credentials: mass clones, repos made public, secrets revealed in bulk, guardrails turned off. A reason to look, never a verdict.

› Read the docs
ComplianceGA

Thirty controls judged from what your products already record, mapped to SOC 2, ISO 27001 and NIST CSF, in snapshots an auditor can verify.

› Read the docs
Threat intelGA

Privacy-preserving sha256 indicators shared across every org. A binary caught attacking others surfaces for you first.

› Read the docs
WHAT IT SEES

Threats, already in the pipe.

TillShield doesn’t ask you to instrument anything new. It reads the security telemetry your TillPulse SDKs already send, scores it, and puts it in front of a rule.

MOBILE · SDK

Root & jailbreak

The TillPulse mobile SDKs report device-integrity failures at runtime — a rooted Android or jailbroken iOS device is a compromised trust boundary, and TillShield treats it as one.

MOBILE · TRANSPORT

TLS certificate-pinning failures

A pinned connection that doesn’t match its expected certificate is a man-in-the-middle in progress. The failure the SDK reports becomes a signal you can act on before the session continues.

ANDROID · UI

Overlay-permission abuse

Foreign windows drawn on top of your app are the classic tap-jacking and credential-capture vector. TillShield flags overlay abuse the moment the SDK detects it over a sensitive screen.

WEB · DESKTOP

Tamper signals

Web and desktop runtimes report their own tamper indicators. Same pipeline, same scoring, same rules — so a single policy can span every surface you ship on.

CROSS-ORG

Shared threat intelligence

Every detection carries privacy-preserving sha256 indicators. A package, certificate, or binary caught attacking another TillDev customer surfaces for you before it reaches you.

SCORING

Severity & confidence

Every signal lands with a security type, a severity, and a confidence score. Rules trigger on those numbers — so you decide how sure and how serious a threat has to be before anything happens.

THE REACTIVE LAYER

A trigger, and one action.

A rule watches a set of security types and fires when they cross a threshold — a minimum severity, a minimum confidence, and a count within a time window. When it does, it takes exactly one action.

Run a new rule in test-mode first — it logs what it would have done without doing it. A per-rule cooldown keeps one bad actor from firing the same action a hundred times a minute.

Writing rules →
ts · rule.ts
// Kill sessions on repeated integrity failures.
{
  name: "integrity-lockdown",
  when: {
    types: ["device_compromised", "cert_pinning_failure"],
    minSeverity: "high",
    minConfidence: 0.8,
    threshold: { count: 3, within: "10m" },
  },
  then: { action: "revoke_auth_sessions" }, // via TillAuth
  testMode: false,   // dry-run: log, don't act
  cooldown: "30m",
}
THE FOUR ACTIONS
raise_incident

Open a triage record with the triggering events attached.

quarantine_session

Cut off the offending session without touching the rest of the account.

revoke_auth_sessions

Kill every auth session for the user — TillShield asks TillAuth to do it.

alert

Notify the channel you already route TillPulse alerts to.

WHEN SOMETHING FIRES

An incident, not an inbox.

Findings about the same account, address, session or target fold into one incident, so an attack is one case to work, not forty alerts. It has a status, a severity, an assignee, and one append-only timeline of every finding, every note and change, and every step a playbook took.

open
investigating
contained
resolved

Group it

A new finding joins the open incident it shares a subject with. Duplicates merge in one step, and their findings and runs come along.

Assign it

Hand it to a teammate and it lands under Assigned to me in their queue and their CLI. No separate ticketing tool to reconcile.

Trace it

Findings, notes, status changes and each playbook step sit in one ordered record. Nothing gets quietly edited away.

Learn from it

Resolve it as real, a false alarm or a duplicate, with the ATT&CK techniques it showed. Real incidents no rule saw become the rules to write next.

SHARED, NEVER SHARED

One customer’s attacker
is everyone’s warning.

When a malicious package, certificate, or binary is seen attacking one TillDev customer, its indicator is shared across every org — so it can surface for you before it ever reaches your users.

The catch is that we never share the thing itself. Indicators are sha256 hashes only — a fingerprint you can match against, carrying no raw identifier, no user data, and nothing that ties a threat back to the org that first saw it.

THE PRIVACY MODEL
Hashed

Indicators are sha256 digests — one-way, no reversible payload.

Anonymous

No org name travels with an indicator. You see the threat, not the victim.

Opt-out

Contribution is on by default and can be turned off; you still consume the shared feed and address patterns.

Yours to act on

A shared indicator is just another signal — the same rules and actions apply.

NOT A BOLT-ON

Same workspace. Same login.

TillShield isn’t a separate product to integrate — it’s the security layer of the TillDev workspace you already have. It reads what TillPulse collects and acts on what TillAuth controls, and every move lands in the one audit log.

01 · READS

TillPulse telemetry

The device-integrity, pinning, and overlay signals TillShield reacts to are the ones your TillPulse SDKs already send. Nothing new to install.

02 · ACTS ON

TillAuth sessions

revoke_auth_sessions and quarantine work because TillShield can reach into TillAuth and end a session — the same sessions your users authenticate against.

03 · RECORDS

One audit log

Every rule fire, incident change, and automated action writes to the shared TillDev audit log, next to your Pulse and Auth events — one history, not three.

THE INLINE LAYER · NOW GA

Not just after. Now during.

TillShield now sits in the request path. An inline WAF enforces your rules at your own edge and origin — a detection becomes a decision before the request is served, not after.

Rules and a sha256 threat-intel deny list are fetched from TillDev and cached, so every request is decided locally — no phone-home on the hot path. Decisions report back asynchronously, and it fails open by default (configurable to fail closed) so a control-plane blip never wedges your traffic.

Auth is a per-project, server-side edge key (tse_…) minted under Shield → Inline WAF — a secret, kept distinct from your public ingest DSN.

Inline WAF integration guide →
ts · rule.ts
// An inline rule — first match wins, evaluated per request.
{
  name: "deny-known-hostile",
  priority: 10,
  mode: "block",            // block | challenge | log
  match: {
    threat_intel: true,     // sha256(client IP) on the shared deny list
    paths: ["/api/*", "/login"],
    methods: ["POST"],
    // countries, ip_cidrs, user_agent_regex also supported
  },
  rate_limit: { requests: 20, window_seconds: 60, by: "ip" },
  response_status: 403,
}
THREE WAYS TO DEPLOY IT
NODE ORIGINS
@tillstack/shield-node

One package, three adapters: Express / Connect middleware, a Fastify onRequest hook, and a raw http handler. Drop it in front of the routes you already serve.

CLOUDFLARE WORKERS
@tillstack/shield-cloudflare

Decide at the edge using Cloudflare’s own request signals. Wrap your fetch handler, or pass a KV namespace for a rate limiter shared across isolates.

DROP-IN · ZERO CODE
tillshield-edge

A ready-made reverse-proxy Worker. Set an edge key and your origin, deploy it, and route your hostname at it — no changes to your application code at all.

THE HUMAN CHECK · TILLGATE

Prove there’s a human.

TillGate is a drop-in bot challenge. A widget issues a signed pass token after the browser does a small proof-of-work — bound to your hostname, with a short TTL — and your server verifies it at /siteverify.

It’s a cost on automation, not a surveillance tool: no third-party tracking, no cross-site cookies, no behavioral scoring. Three modes — managed, invisible, interactive — and a per-project site key (tg_site_…) minted under Shield → TillGate.

And it plugs into the inline WAF: a rule in challenge mode can present TillGate instead of a bare 429.

html · login.html
<!-- Drop-in: the widget writes a pass into tillgate-response. -->
<script src="https://tilldev.dev/tillgate.js" async defer></script>

<form method="POST" action="/login">
  <div class="tillgate" data-sitekey="tg_site_…"></div>
  <button type="submit">Sign in</button>
</form>

<!-- Server verifies at:
  POST https://tilldev.dev/api/tillgate/siteverify
  { "secret": "tg_secret_…", "response": "<token>" }
  → { "success": true, "hostname": "example.com", "error-codes": [] } -->
THE DETECTION ENGINE · TILLTELL

Every attack has a tell.

TillTell reads one security stream made of what every Till product already records on the server: sign-ins and second factors, keys and roles, secret reads, pushes and branch protection, backup deletions, and the decisions TillGate makes at the edge. With the endpoint agent, your servers and workstations join it. A library of rules, each tied to a MITRE ATT&CK technique, watches it.

Rules earn their way. Each starts in shadow, recorded and never alerting. You promote it when you trust it; it demotes itself when it cries wolf. Verdicts are appended, never edited. A rule that would revoke or block never fires on evidence an app merely claimed.

Write your own for the attacks only your team would recognise. Same format as the library, held to the same tests, and replayed against your recent events before it runs. Patterns can't backtrack, and a rule that runs too long pauses itself instead of slowing anyone down.

TillHunt is for the attack nobody has written a rule for yet. Ask the same stream a question in the rule grammar, find the rarest address or the busiest reader, pivot on any value, and keep what you find as a rule with tests made from the real events. When a hunt stops short of the whole range, it says exactly how far back it read.

The coverage map shows the gaps, not just the wins. Every ATT&CK technique reads no rule, rule, or proven by drill, and the ones your connected products can't see are faded instead of counted. A gap names the product whose records would close it.

LIBRARY · A SAMPLE62 rules · shadow by default
tell-cred-stuffingT1110.004
tell-mfa-fatigueT1621
tell-password-then-mfa-removedT1098
tell-secret-mass-readT1552
tell-branch-protection-droppedT1685
tell-backup-mass-deleteT1490
tell-session-theftT1539
tell-scim-mass-deprovisionT1531
+ up to 100 of your owntested · backtested
THE APPROVAL LADDERper workspace · per rule
ADefaultEvery step waits for an owner or admin
BYour callNotifications and second-factor challenges run alone
CEarnedA rule with a clean record runs every step
THE RESPONSE · PLAYBOOKS

A finding proposes. A person decides.

When a live rule fires, its playbook is ready: tell the right people, make the account prove its second factor, sign it out everywhere, block the address at the edge for a day, stop a compromised app session from sending data, end a process on a host, or cut the host off the network.

Nothing that takes access away runs on its own until the rule has earned it. A waiting run reminds you once, then expires. Nobody can wave off a response aimed at their own account, and drills rehearse every step without touching anyone. Alerts reach email, Slack and a signed webhook.

THE HOSTS · ENDPOINTS

Your servers have tells too.

The TillTell agent reports what happens on Linux, macOS and Windows hosts: processes started, sign-ins, sudo, new accounts and admins, persistence, SSH keys, kernel modules, listening ports, cleared logs and defences turned off. The same rules, hunts and incidents read them, and the coverage map lights up what only a host can show.

One command installs it, after checking the release signature. A new host waits until someone approves the fingerprint it printed. Secrets in command lines are scrubbed before they leave the host. When a source is missing, such as an audit policy that is off, the host says so and names the command that turns it on.

When the host is the problem, end the process or isolate the host: it keeps only its link back to TillShield, so you can watch it and let it go. Every command is signed for one host and checked by the agent before it acts, and undoing an isolation on the host is reported.

WHERE IT READSuser mode · no kernel driver
Linuxprocess connector · journald · auth logs · /proc
macOSprocess table · unified log · Directory Services
Windowsevent logs · Sysmon · registry · socket tables
HOW IT ISOLATESsigned · one host · kept in place
Linuxnftables · iptables
macOSpf anchor
WindowsWindows Filtering Platform
curl -fsSL …/install.sh | sudo sh
PROOF → WHAT IT ALLOWSchecked before every run
DNS recordpassive · latency · active over https · defense
verified domainpassive · latency · active over https · defense
file on the serverpassive · latency · active · intrusive · load · defense
connected cloud accountexposure of the addresses it holds
_tillshield.app.example.com TXT "tillshield-verify=…"
FROM THE OUTSIDE · TILLDRILL

Rehearse the attack before it comes.

TillDrill tests your sites and APIs from the outside, the way an attacker or a traffic spike would. It starts with ownership. It tests only targets you prove are yours, and checks the proof again before every run.

A DNS record proves the name. A file on the server proves the server, and only that lets a load drill run, because a name can point at anyone's machine. A domain you already verified for single sign-on or TillAuth counts, with nothing to publish.

Passive checks are live now. They are OWASP-tagged checks of TLS, headers, cookies and the DNS records that guard mail and certificates. Run them by hand, or let each target repeat them daily or weekly. You hear about it when something new breaks.

Active checks ask the target itself, and read only. Paths that leak by accident, a folder listing its files, the methods it states, what it shares with another origin, a link parameter that sends visitors off-site, a name pointing at a provider that no longer claims it, advisories for the version it names. Nothing is written, no credential is guessed, and the origin and host it asks with are reserved names that cannot resolve. They need the file on your server, or a record over https, and stay off until you turn them on.

Intrusive probes go one step further, and so they ask more of you. They send inputs built to be mishandled — a stray quote, a value a template engine would run, an over-long field, a sign-in that must fail against a name that can never exist — to find where your own target slips. They turn on only with the file proof, your written authorisation, and a maintenance window you set, run one at a time, and still write nothing and guess no real password.

Latency is measured from regions around the world, four of them in Africa, against a budget you set, hourly or daily. Load drills ramp up to a planned rate with hard caps, and stop on their own when errors or latency pass your threshold.

It reads the apps you ship, too. Upload an APK, an IPA or a desktop build, or pick a TillForge release, and TillDrill flags debuggable builds, plain-text traffic, components any app can open, keys shipped in the code and weak crypto, each tagged with its OWASP MASVS control. The build is deleted once read, and a release can fail in CI on what it made worse.

Your machines get the same treatment, from their own side. Connect a cloud account and TillDrill reads the public addresses it holds; each one can then be scanned for the ports that answer the internet, what is listening, and the certificates they serve. It opens a connection, reads what the service announces and closes — no payload, no credential, nothing changed. Then it lines that up against the rules the account itself declares, and names the port answering that no rule opens and the rule that opens a port with nothing behind it.

And it drills your detection. A defense drill replays a TillTell rule’s own test as signed drill traffic, kept apart from the real thing, and times how long the rule takes to fire and the playbook to finish, every step simulated. A rule that fires is marked proven on the ATT&CK map, dated.

FROM THE INSIDE · POSTURE

Know what you actually run.

Posture reads your accounts on a schedule and keeps an inventory of what is there: each resource, the settings that matter for security, and when it appeared, changed and went. Connectors only read, and they read settings, never secret values.

Start with your own workspace: repositories and the policy on each default branch, service tokens, API keys and sign-in apps. Then connect AWS, Google Cloud and Azure through federation: TillDev signs a token that lasts five minutes and a read-only role, workload identity pool or app registration in your account trusts it, so no cloud key or secret is ever stored. IAM, storage, networks, instances, databases and audit trails. Cloudflare and DigitalOcean, which have no federation, read with a read-only token sealed the moment you add it: Cloudflare members and two-factor, API tokens, each zone’s TLS, HSTS and DNSSEC, and public R2 buckets; DigitalOcean Droplets, firewalls, databases, Kubernetes and load balancers.

A resource leaves the inventory only when a full read no longer finds it. A read that falls short keeps what it had and says so, so a provider hiccup never looks like a deletion.

Every sync judges each resource against a library of checks: a port for remote administration open to the internet, a public bucket, a user without MFA, a key nobody rotated. Failures open findings that close on their own once fixed, and a check that couldn’t read what it needs says so instead of passing. Choose which checks alert, accept a risk with a reason and an end date, and see each setting that changed since the last baseline.

INVENTORY · TILLDEV + CLOUDSread in full · daily
TillForge repositories14+1 ~2
TillSecrets service tokens9−1
IAM roles38+2
S3 buckets21~1
Security groups17~3
Cloud Storage buckets8+1
VPC firewall rules12~1
Azure storage accounts6~1
Cloudflare zones5~1
Droplets11+1
Admin port open to the internethigh · 22
sub workspace:…:connector:… · expires in 5 min
VULNERABILITIES · SOONEST DUE1 overdue · 2 due soon
criticalAdmin port open to the internet · Posture2d late
highlodash: prototype pollution · DependenciesPR #41
highSession cookie without Secure · TillDrill9d left
mediumDebuggable release build · App builds61d left
mediumS3 bucket without logging · IaCaccepted
ONE LIST · VULNERABILITIES

Every finding has a due date.

TillDrill, app build scans, Posture, and TillForge’s dependency, code, IaC and secret scanning each keep their own page. Vulnerabilities puts what they find in one list, with days to fix set per level, an owner for each item, and a message when something falls overdue. An item closes when the next scan no longer finds it.

Accept a risk with a reason and an end date, and watch mean time to fix by level. On a vulnerable dependency, one click opens the pull request: npm, pnpm, yarn, pip, Go and Cargo lockfiles are edited to the smallest version that fixes every advisory, and where a change wouldn’t be safe you get the command to run instead.

DISCLOSURE · RESEARCHERS

A front door for the people who find things.

Publish a disclosure program in minutes: your policy, what is in scope, safe harbor, reward ranges, and how quickly you answer. TillShield writes the security.txt that points researchers to it, and checks the copy on each of your domains.

Reports arrive only after the researcher confirms them, sealed with your workspace’s key. Your inbox keeps a clock for the first reply and one for the decision, and an accepted report joins Vulnerabilities with a due date. Emails on either side carry a link, never the report.

DISCLOSURES · INBOXmedian first reply 6h
#31IDOR on invoice export · newreply in 9h
#30Open redirect after sign-in · triagingdecide in 4d
#28Stored XSS in support notes · acceptedfix in 27d
#27Missing rate limit on OTP · duplicateof #19
Contact: https://tilldev.dev/disclose/acme
E-4 · PURPLE EXERCISEauthorised · testing
T1078.004Cloud accounts · 2 TillTelldetected
T1110.003Password spraying · 1 TillTelldetected
T1098Account manipulation · playbookblocked
T1567.002Exfiltration to cloud storage · rule to writemissed
3 of 4 defendedF-1 high · retest
ENGAGEMENTS · PEOPLE WHO TEST

Purple team, red team and pentests, on the record.

Write the rules of engagement once: scope, the networks testing comes from, the window and who to call to stop. An owner authorises exactly that, and the window starts and ends testing on its own.

Each technique tried is checked against what TillTell saw from the testers’ networks, and a detected one proves the technique on your coverage map. Outside testers work through a private link, findings land in Vulnerabilities with a fix-by date, and the report is ready for your auditor.

THREAT INTEL · CONTEXT

Know what everyone else already saw.

Every security event is checked against the Tor exit list and against addresses that three or more other workspaces’ findings named in the last 30 days. The finding says how many saw it and which techniques they saw, never who, and your own rules can act on it.

In Vulnerabilities, a CVE on CISA’s known-exploited list rises to the top, with its EPSS score from FIRST.org beside it. Feeds ship only when their licence allows it, and intel adds context; it never blocks anyone on its own.

THREAT INTEL · LAST 30 DAYS3 feeds current
highSign-in from a flagged address · 45.155.205.94 workspaces
mediumSign-in from a Tor exit relay · 185.220.101.4Tor exit
criticallog4j-core: Log4Shell · CVE-2021-44228KEV · EPSS 94%
highlodash: prototype pollution · CVE-2021-23337EPSS 1.4%
Tor Project · CISA KEV · FIRST EPSS
COMPLIANCE · LAST 90 DAYSchain intact
passTwo-factor sign-inCC6.1 · A.5.17 · PR.AA-03
passRestore testingA1.3 · A.8.13 · RC.RP-03
attentionFinding triageCC7.3 · A.5.25 · DE.AE-02
failFix-by datesCC7.1 · A.8.8 · ID.RA-01
passSecurity policyCC5.3 · A.5.1 · GV.PO-01
snapshot 7 · sha256 3f9a…c21e · prev 81d0…4b7a
COMPLIANCE · EVIDENCE

The evidence is already recorded.

Who signs in with a second factor, whether detections were proven by a drill, how fast vulnerabilities were fixed, whether a backup was actually restored: TillShield reads it from your products over the period you choose and judges thirty controls, each mapped to SOC 2, ISO/IEC 27001 and NIST CSF criteria.

Policies and reviews you keep elsewhere are attested, with a fresh approval. Snapshots can’t be changed, each carries the digest of the one before, and your auditor can check the export without us. It is evidence for their assessment, not a replacement for it.

INSIDER RISK · YOUR OWN PEOPLE

Trusted and watched.

Fourteen TillTell rules look inward: every repository cloned in an hour, a repository made public, a mirror pushing code somewhere new, secrets revealed or deleted in bulk, a detection turned down, required two-factor switched off, and API keys and service tokens doing what they never did before.

They read what your products already record, start in shadow, and rank each member and credential by what fired. Benign findings stop counting. A score tells you where to look first, never what to conclude.

INSIDER RISK · LAST 30 DAYS3 of 14 rules alerting
Repository made publicmember · tillforgehigh+4
Many repositories cloned in an hourmember · tillforgehigh+4
Credential did something newcredential · tillsecretsmedium+2
Secret read from a new projectmember · tillsecretslow+1
a reason to look · never a verdict
TURN IT ON

If TillPulse is already watching your projects, TillShield is one workspace away from watching for the attacks — and blocking them inline.

PART OF TILLDEV

One of seven.

You don't have to use the rest. But they fit together — same workspace, same audit log, same shortcut to switch between them. Add what you need when you need it.