TECHNOLOGY

How Axis works

What it watches, when it acts and what it keeps. The numbers on this page are the defaults in the running code; each server can tune them from the panel.

axis · defaults
Subsystems
8
Verification layers
15
Anti-nuke cut
4 actions in 10 s
Slow nuke
24 actions in 15 min
Raid lock
8 joins in 10 s
Audit log
SHA-256 hash chain
Public signature
Ed25519
IP addresses
scrypt · 16 MB per hash
Backups
AES-256-GCM
ARCHITECTURE

From a Discord event to a response

Axis listens to the Discord gateway: every audit log entry, every member who joins, every message and every interaction. ONYX hands each event to eight subsystems, which decide whether to act. Every decision is written to the audit log.

DISCORDONYXRESPONSEAudit logJoinsMessagesInteractionsStrip rolesBan or kickLock the doorDelete messagesAlert staffGATEGateSHIELDShieldSURGESurgeFILTERFilterLEDGERLedgerRECALLRecallTRACETraceRELAYRelayEverything goes to the audit log: SHA-256 hash chain, signed with Ed25519
DISCORDAudit logJoinsMessagesInteractions
ONYXGATESHIELDSURGEFILTERLEDGERRECALLTRACERELAY
RESPONSEStrip rolesBan or kickLock the doorDelete messagesAlert staff
GATEGateVerifies who joins and recognises people coming back on another account.
SHIELDShieldStops anyone mass-deleting, banning or handing out permissions, admins included.
SURGESurgeSpots accounts joining together and locks the door.
FILTERFilterSpam, links, mass mentions and scams in messages.
LEDGERLedgerEvery action, hash-chained, with copies of what was deleted.
RECALLRecallEncrypted backups of channels, roles and permissions, and the restore.
TRACETraceA member’s file: who invited them, alt accounts, names and sanctions.
RELAYRelayWebhook inventory and purge, and a watch on new ones.
ANTI-NUKE · SHIELD

How much each action weighs

A nuke is a burst of destructive actions. Axis adds up the weight of what each account does in a 10-second window and cuts it off at 4. Deleting weighs more than creating and editing weighs little, so reorganising a server doesn’t set anything off.

Illustration
An account with administrator permissions
  1. Deletes #general+1
  2. Creates a webhook+0.75
  3. Deletes the @Moderators role+1
  4. Renames #rules+0.25
  5. Deletes #announcements+1
0threshold 4
Cut off: loses every role with permissions
ActionWeight
Deleting a channel, role, emoji or sticker; banning, kicking or pruning; changing a member’s roles1
Creating a webhook0.75
Creating a channel or role; deleting a webhook0.5
Editing channels, roles, permissions or the server; creating emojis or stickers; unbanning0.25
Setting slowmode or closing permissions, which is what a raid lockdown does0
Slow nukes24 weighted actions in 15 minutes also trigger it, for anyone who deletes slowly and waits in between.
A ceiling for everyoneNot even trusted staff can go past 20 actions in 10 seconds.
Attacking botsThey get banned; if Discord won’t allow it, kicked; if not even that, their role is emptied of permissions.
Undo damageRebuilds channels and roles with their permissions and gives every role back to whoever had it.
The first 48 hoursRules about edits only warn while Axis learns how the server works. Destructive rules act from the first minute.
RAIDS · SURGE

A raid shows up in the join rate

8 accounts joining within 10 seconds lock the door: the server raises its verification level and new accounts wait. A slower 2-hour window catches raids that trickle in, and a trap channel catches bots that post where no person would.

Illustration
Door locked
8 / 10 s · 2 waiting
VERIFICATION · GATE

15 layers to recognise someone coming back

A banned user comes back on another account, another IP and sometimes another browser. Each layer looks at something different. None is enough on its own, and weak signals only count when several line up.

ConnectionIP · IPv6 /64Same IP or same network block. On IPv6 the whole /64 is compared, because rotating inside it costs nothing.
Anonymous networksTor · VPN · proxyTor exits, VPNs and data-centre proxies.
Device fingerprintcanvas · WebGL · GPURecognises the device even when the connection changes.
Security cookiepersistent markA mark in the browser that survives a new IP and a new fingerprint.
Linked accountsSteam · SpotifyThe same Steam or Spotify account connected to two Discord accounts. Only if the server turns it on.
Proof of workadaptive difficultyA computation in the browser that gets harder when there are risk signals. It makes bot farms more expensive.
Who invited theminviter trustAn account invited by someone who already brought in a group of new accounts.
Invitesrate · vanityInvite spikes and vanity URL changes before a raid.
Shared networksCGNAT · schools · officesMobile data or a school wifi: there the IP isn’t enough to link accounts, and Axis accounts for it.
Verified roleonly Axis grants itIf someone hands out the role manually to skip the gate, it doesn’t count.
BehaviourscoringWhat the account does after joining: who it messages, which links it sends and how fast.
Account agenew accountsOn its own it proves nothing. Together with other signals, it counts.
Fingerprint by partspartial matchCompared part by part: switching browser or screen isn’t enough to look like someone else.
Consistencyconnection vs browserAn Amsterdam IP with the clock, language and keyboard of Madrid points to a VPN on the user’s own machine.
PhoneDiscord verificationRequire a phone verified on Discord. A number costs money; an IP doesn’t.

Strong matches, like the cookie or the same device on a network that isn’t shared, hold the account. Weak ones open a review for staff. Mobile data, the same phone model or a school wifi are never enough on their own.

AUDIT LOG · LEDGER

A log that can’t be rewritten without it showing

Every action is chained to the SHA-256 hash of the previous one: changing one row breaks everything after it. The root of a Merkle tree (RFC 6962) is signed with Ed25519 and published, so rewriting the whole history doesn’t go unnoticed either.

Illustration
event #1041ChannelDelete #generalprev 0000000000…hash 1e7d0ebe3f…
event #1042MemberRoleUpdate -Adminprev 1e7d0ebe3f…hash 65c26df9b3…
event #1043ChannelCreate #generalprev 65c26df9b3…hash b32d4c6672…
event #1044MemberBanAdd 8xx…prev b32d4c6672…hash d3e850978c…
Merkle rootSigned · Ed25519753d48f7f30d3f9cecaa7c…
ReceiptsSomeone who gets sanctioned can check that the decision was in the log on that date, with an inclusion proof, without seeing the rest.
Copies of deletionsDeleted messages and their files stay in the server’s log.
Operator accessIf the Axis team opens a server’s data, it is written to that server’s log and its staff are told.
DATA

What Axis keeps and what it doesn’t

Keeps

  • IP addresses, only as a scrypt hash (16 MB of memory per hash) with a key that isn’t in the database.
  • The browser fingerprint, only as HMAC-SHA256.
  • Verification records, for 90 days; those of sanctioned accounts, for as long as the sanction lasts.
  • Server backups, encrypted with AES-256-GCM and a key derived with scrypt for each backup.
  • Incident reports, for 180 days.

Doesn’t keep

  • Plain-text IP addresses.
  • Private messages between members: a bot can’t read them.
  • The text of messages the automod checks and lets through.
  • Payment details: Lemon Squeezy processes them.
  • What the AI analyses: only the verdict is kept, never who posted it.
INFRASTRUCTURE

Two nodes and no open ports

Axis runs on a primary node and a standby on a different provider. If the primary stops responding, the standby takes over with the replicated configuration. The web server only listens on 127.0.0.1 and is reached through a Cloudflare tunnel, with its firewall in front.

BrowserCloudflare · WAFTunnelPrimary node127.0.0.1Standby nodeheartbeat
Browser
Cloudflare · WAF
Tunnel
Primary node · 127.0.0.1Standby nodeheartbeat
CSP on every requestEvery public page carries a content security policy with a fresh nonce per visit.
Rate limitsPer IP on every route, and stricter on the verification portal and the API.
Public statusLive availability and 90 days of history at /status.
LIMITS

What Axis can’t do

Take power away from the server ownerDiscord doesn’t allow it. If that account is stolen, Axis alerts, but can’t stop it. The same goes for any role above Axis’s own: that is why its role goes at the top, and the panel warns if it isn’t.
Guarantee no alt gets throughA bought account, a new phone and mobile data can pass the gate. Discord’s phone verification is what really makes it expensive.
Recover what happened beforeIt can only restore what it saved. Messages deleted before Axis was added don’t come back.
Read private messagesIt doesn’t, and it can’t.

Add Axis and check it yourself

The documentation covers every setting. The service status is public.

Service status →