Contents

Table of Contents

Every chapter in this report, in order — click any entry to jump straight to it.

I Introduction & Context
01 · Introduction

Foreword — About CIRCL and the NGSOTI Project

Before explaining what Rulezet does, it helps to know who built it and why — this isn't a weekend side project, it's a tool built by a national CERT for the community it already serves every day.

Rulezet is developed at CIRCL — the Computer Incident Response Center Luxembourg, the country's governmental CERT. CIRCL's day job is responding to and coordinating the response to computer security incidents affecting Luxembourg, but it's also known well beyond its borders for building and operating open tools the wider security community relies on: MISP (the threat intelligence sharing platform), the MISP taxonomies and galaxy knowledge bases that standardize how threats are described, and Vulnerability Lookup, a fast CVE/vulnerability reference search engine.

Rulezet was built at CIRCL as part of NGSOTI, a project aimed at giving the next generation of SOC analysts and detection engineers better tooling and training. MISP solved the "how do we share threat indicators" problem for the community years ago. Rulezet exists to solve the equivalent problem for detection rules — the YARA signatures, Sigma queries, and Suricata/Zeek scripts that actually do the detecting, which never had an equivalent shared home.

Why this matters to you as a reader
Knowing Rulezet comes out of an organization that already runs trusted, widely-adopted security infrastructure (MISP) should set your expectations correctly: this is designed with the same "built by practitioners, for practitioners" philosophy, not a generic content-management system repurposed for security data.

Everything in this documentation — and everything on the live platform — is shared under a TLP:CLEAR posture: open, disclosable, meant to be spread. If you're not familiar with Traffic Light Protocol classification, chapter 5 (Core Terminology) explains it — you'll see it again as a default tag on every rule.

Screenshot
Next: the problem this platform was actually built to solve.
02 · Introduction

The Problem — Why Detection Rule Sharing Is Broken

Detection rules are the operational output of threat detection work — and today, they live everywhere except one trustworthy place.

Ask any detection engineer where "the rules" live and you'll get an uncomfortable answer: scattered across dozens of GitHub repositories, buried in blog post code blocks, pasted into private Slack channels, or sitting in a folder on someone's laptop who left the team eighteen months ago. Every one of those rules represents real analytical work — someone noticed a pattern, wrote logic to catch it, and then had nowhere durable to put it except "wherever was convenient at the time."

That scattering isn't just untidy, it actively costs security teams detection quality:

  • No single place to check "has this already been solved?" — a team burns half a day writing a rule for a technique that a dozen other teams already detect, because there was no shared index to search first.
  • No consistent way to judge if a rule is actually good. Syntactically valid isn't the same as effective, and a rule copied from a blog post with a silent typo in a field name will pass code review and fail in production, quietly, for months.
  • Format fragmentation compounds everything. YARA, Sigma, Suricata, Zeek and others all describe detection logic differently — there was no tool that treated them as equally first-class, so teams standardized on whichever format they happened to start with and struggled to reuse anything written for a different one.
  • Ownership evaporates. A rule written by an analyst who has since left the team becomes an orphan — still running, still generating alerts or silently failing to, with nobody left who remembers why it exists or whether it still should.
A concrete failure mode
Two SOC teams at the same organization each write a YARA rule for the same malware family within a week of each other — neither knew the other was working on it, because there was no shared, searchable place either would have thought to check first. Weeks later, someone notices the duplication by accident while triaging an alert flood from both rules firing on the same sample.

Rulezet's answer isn't "yet another paste bin with search." It's a platform that validates a rule's syntax the moment it arrives, flags likely duplicates automatically, tracks who owns what, and puts community review directly into the workflow — so that scattering stops being the default and becomes something you'd have to actively choose instead.

Next: what Rulezet actually is, and what it deliberately is not.
03 · Introduction

What Is Rulezet — Vision, Mission, Goals

An open-source, community-driven platform to create, import, validate, discuss, and curate cybersecurity detection rules across multiple formats.

Rulezet gives detection content the same treatment source code gets from a modern developer platform: version history, peer review, ownership, quality gates, and a search index that actually understands what it's looking at. The four goals that shaped every feature in this report:

1
Simplify rule management and collaborative evaluation
One place to create, edit, and review — instead of a rule's lifecycle being spread across a repo, a chat thread, and someone's memory.
2
Enable collaboration across organizations, not just within one team
Public rules and bundles mean the analytical work of one organization can benefit every other one running the same instance or federated with it.
3
Reduce the chaos of scattered open-source detection content
Import from GitHub once, and the rule lives in a structured, searchable, versioned home from then on.
4
Validate both the syntax and, as far as automatable, the relevance of every rule
A broken rule never gets to silently pretend it works — see chapter 8 for exactly how far that guarantee goes.
What Rulezet is not It is not a SIEM and it does not execute rules against live traffic itself. It is not a replacement for MISP — MISP is for threat indicators (IPs, hashes, domains), Rulezet is for the detection logic that acts on that kind of data. The two are complementary, not competing.

Supported rule formats today

YARA, Sigma, Suricata, Zeek, Wazuh, NSE, CRS, Nova, Elastic, and a free-text "no format" fallback for anything else. This list is deliberately not fixed — chapter 29 explains how a new format gets added as a self-contained plug-in, without touching anything else in the platform.

Screenshot
04 · Introduction

Audience & How to Read This Documentation

This report is long on purpose — here's where to start depending on who you are, so you don't have to read all of it to get value from it.

SOC analyst / detection engineer
Read Part II end to end. It's written for you first — every chapter opens with the problem before the feature.
Team lead / instance admin
Part II, then chapter 25 (Administration) closely, then skim Part III to know what you're responsible for operating.
Contributor / developer
Skim Part II for context, read Part III in full — especially chapters 29 and 31 before opening a pull request.
Instance-to-instance integrator
Chapter 22 (Connectors) plus chapter 27's architecture overview.

Day to day, this documentation is meant to be browsed as a website with the navigation menu on the left. When you need an offline or formal copy — onboarding a new analyst, sharing with a partner organization evaluating Rulezet — use the Export button in the top-right at any time, either as a printable PDF or as a plain Markdown file.

05 · Introduction

Core Terminology & Concepts

A handful of words this report leans on constantly — defined once here, so every later chapter can use them without re-explaining.

TermMeaning
Detection ruleRègle de détection A piece of logic, written in a specific format, that flags something as suspicious or malicious when matched against data — a file, a log line, network traffic.
Rule formatFormat de règle The syntax/engine a rule targets. Different detection surfaces need different tools — YARA reads files, Sigma describes log conditions abstractly, Suricata/Zeek watch network traffic.
TLP / PAPTLP / PAP Traffic Light Protocol / Permissible Actions Protocol — standardized labels (clear, green, amber, red) describing how freely a piece of content can be shared or acted on. Every new rule gets tlp:clear and pap:clear by default.
Edit proposal A pull-request-style review mechanism: someone proposes a change to a rule they don't own, the owner reviews a diff and approves or rejects it.
BundleBundle A curated, named collection of rules — the detection equivalent of a playlist.
Tag / taxonomy / galaxy MISP-standard vocabularies reused for classification. A taxonomy is a structured vocabulary (like TLP); a galaxy is a knowledge base of clusters (threat actors, malware families); a tag is the concrete label attached to a rule, coming from either.
ATT&CK technique MITRE's standard framework for describing adversary behavior (e.g. T1068); rules can be mapped to the technique(s) they detect.
OwnershipPropriété Every rule has exactly one owning user — the accountable point of contact, and the person (besides an admin) allowed to change or delete it.
Instance / connector A "Rulezet instance" is one deployment (e.g. the official rulezet.org). A connector lets one instance pull content from another, or from MISP.
Background job Any operation heavy or slow enough to run asynchronously with visible progress instead of blocking a page load.

A fuller alphabetical list, including every format acronym used in this report, is in Appendix A — Glossary.

II Feature Guide
06 · Feature Guide

Accounts, Roles & Permissions

Any collaborative platform needs to know who is doing what — accountability is what makes community-contributed detection content trustworthy at all.

Why
A rule with no accountable owner is a rule nobody will fix when it breaks. Rulezet's entire permission model exists to keep every piece of content traceable to a real, responsible person — while still letting anyone browse and learn from what's public.

Every visitor to Rulezet falls into exactly one of three tiers, and this three-tier model is the single most important concept to understand before anything else in this report — nearly every later chapter refers back to it instead of re-explaining permissions from scratch.

TierCan doCannot do
AnonymousBrowse public rules, bundles, and blog postsVote, comment, favorite, create anything
AuthenticatedCreate rules/bundles, vote, comment, propose edits, favorite, request ownershipEdit or delete another user's resources, access admin tools
AdminEverything, plus moderation, platform administration, and acting on any user's resources

Within the "authenticated" tier, one more distinction matters everywhere: ownership. Whoever created a rule, bundle, or comment is its owner, and — together with any admin — is the only one who can edit or delete it. This single rule (owner-or-admin, nobody else) is applied identically across every feature in this report; once you've internalized it here, you won't need it re-explained per chapter.

New analyst joining a team
Signs up, verifies their email, and immediately has everything needed to start proposing improvements to existing rules — no admin approval required just to participate.
Automation-minded team lead
Generates a personal API key from their profile to let an internal pipeline pull the latest public rules automatically (see chapter 26).

What this feature covers

  • Registration, email verification, login, password reset.
  • Profile editing (name, avatar) and a public contributor profile (see chapter 18, Gamification).
  • API key generation and rotation for programmatic access.
  • Notification preferences (chapter 19).
A known limitThere is no granular role system between "regular user" and "admin" today — it's intentionally binary. If your organization needs, say, a "moderator who isn't a full admin" tier, that's a gap worth flagging to the team rather than assuming it exists.
Screenshot
07 · Feature Guide

Rule Management — Create, Import, Version

The rule is the atomic unit of the entire platform. Every other feature in this report exists to make rules easier to find, safer to trust, or better maintained.

Why
A detection rule that only exists in one person's head or one repo's history is a single point of failure. Making rule creation and import a first-class, validated workflow is what turns "a file someone wrote" into "an asset the team can rely on."

There are two ways a rule comes into existence on Rulezet, and both end up going through the exact same validation gate (chapter 8 covers that gate in depth):

1
Manual creation
Fill in the create-rule form — title, format, license, source, description, content — and Rulezet validates it against the chosen format's rules before saving. Two default tags, tlp:clear and pap:clear, are attached automatically so every rule starts from a known, shareable classification.
2
GitHub import
Point Rulezet at a repository and it walks the tree, extracts every rule it can find across every format present, and validates each one individually. A rule that fails validation doesn't get silently dropped — it lands in the Bad Rules queue instead (chapter 8), where the person who ran the import can review and fix it.
Live incident response
An analyst writes a Suricata rule directly from what they're seeing in an active incident, so it's captured immediately rather than "written up properly later" (and forgotten).
Bootstrapping a team's presence
A team imports their entire existing GitHub rule repository in one operation instead of recreating years of work rule by rule.

What you can do with a rule once it exists

  • Edit content, metadata, and associated CVE/vulnerability identifiers (if you own it, or you're an admin).
  • Favorite it and vote it up or down — community signal that factors into how it surfaces in search.
  • View its full detail page: metadata, syntax-highlighted content, edit history, similarity matches, and the comment thread — each of those gets its own chapter later in this Part.
  • Delete it — which, importantly, is a soft delete (see the callout below), never an instant, irreversible removal from a single click.
Soft delete, by designDeleting a rule moves it to a recoverable Trash rather than erasing it outright. Only an admin can permanently purge it from there — a deliberate two-step safety net against an accidental or malicious single-click deletion. See chapter 25 for the admin-side Trash workflow.
An honest limitationImport quality depends entirely on how the source repository is structured and how confidently the format parser can recognize where one rule ends and the next begins. A messy, non-standard repository layout will import less cleanly than one that follows common conventions — this is a real constraint, not a bug to be fixed away entirely.
Screenshot
08 · Feature Guide

Rule Validation, Quality & Similarity Detection

This chapter is the safety net — the direct answer to "rules may contain syntax errors, and even valid ones offer no guarantee they're not a duplicate of something that already exists."

Why
Trusting a rule you didn't write yourself requires some evidence it's at least well-formed and not a redundant copy of one you already have. Automating both checks removes the two easiest, most common ways low-quality content quietly accumulates.

Two independent mechanisms work together here. Validation happens the instant a rule is created or imported — a format-specific parser (chapter 29 explains the mechanism behind this) checks that the content actually parses as valid syntax for its declared format. Similarity detection is a separate, on-demand analysis that compares a rule's content against everything else already in the library to flag likely duplicates or near-duplicates for human review.

When validation fails: the Bad Rules queue

A rule that fails validation is never silently discarded and never silently accepted broken — it's quarantined into a dedicated queue, visible to whoever submitted it (or an admin), with the specific errors that were found. This matters most during a bulk GitHub import: out of, say, forty imported files, three might fail — those three show up for the importer to fix or discard deliberately, instead of vanishing into a log nobody reads.

When two rules look alike: similarity detection

A similarity scan compares rule content across the library and ranks candidate pairs by how alike they are, surfacing them for a human to decide: genuinely the same rule imported twice, a deliberate variant worth keeping separately, or coincidentally similar and fine as-is. Every rule's detail page also carries its own "similar rules" panel so this isn't only something an admin runs platform-wide — anyone reviewing one rule can immediately see its closest relatives.

Cleaning up after a bulk import
A 500-rule GitHub import completes; three rules land in the Bad Rules queue with clear parser errors, and a similarity scan flags eleven pairs that turn out to be the same detection logic imported from two different upstream repositories.
What this does not guaranteeValidation checks that a rule is well-formed — it does not and cannot tell you the rule actually detects anything real in production. Being explicit about this distinction matters for credibility: "passes validation" means "correct syntax," not "proven effective." If you need that second guarantee, see chapter 20, Rule Tester.
A known limitationSimilarity detection is a heuristic aid, not an authority — expect both false positives (rules flagged as similar that really aren't) and false negatives (genuine duplicates it misses). It exists to focus human review, not replace it.
Screenshot
09 · Feature Guide

Collaborative Edit Proposals

The pull-request model, applied to detection content — anyone can suggest an improvement to a rule they don't own, without ever needing direct write access to make the suggestion.

Why
Detection rules improve fastest under real scrutiny from people other than the original author — but giving everyone direct edit rights to everyone else's rules would remove accountability entirely. Edit proposals give you both: open contribution and a single accountable approver.

Any authenticated user who spots something worth changing in a rule — a condition that's too broad, a false-positive-prone pattern, a stale reference — can open an edit proposal: write the change plus a short message explaining why, and submit it for review. From there, a proposal moves through exactly three possible states.

StateMeaning
pendingAwaiting the owner's (or an admin's) review — nothing has changed on the live rule yet.
approvedThe change was accepted and applied to the live rule; a history entry records it (chapter 12).
rejectedThe owner declined the change, ideally with a reason — keeping a transparent record of why, not just a silent no.

The review itself happens against a full side-by-side diff of the current content versus the proposed content, with its own dedicated comment thread underneath for back-and-forth discussion before a decision is made — the same review ergonomics engineers already expect from a code review, applied to a Sigma condition or a YARA string.

Spotting a false positive
A user notices a rule fires on legitimate administrative scripts and proposes a narrower condition instead of just leaving a comment that may or may not get acted on.
A transparent rejection
An owner declines a proposal that would have broken detection for a related technique, and records why — so the next person who has the same idea can see it was already considered.
Something to be aware ofOnly one proposal's worth of change is reviewed at a time — if two people propose changes to the same rule concurrently, whichever is approved first will make the other's diff stale. Treat proposals as a serial review queue per rule, not a merge system.
Screenshot
10 · Feature Guide

Ownership & Transfer Requests

Rules need a responsible owner at all times — this is the formal, auditable mechanism for that responsibility to change hands.

Why
People leave teams; rules outlive them. Without a deliberate transfer mechanism, ownership either freezes forever (nobody can act on the rule) or gets quietly reassigned with no record of who approved it or why. Neither is acceptable for content other people rely on.

There are two distinct paths to a change of ownership, and Rulezet is careful to make both show up identically in the audit trail even though they start very differently.

1
Individual request
A user asks to take over a specific rule — say, one whose original author has left. The current owner (or an admin) approves or rejects the request; a history entry is recorded either way.
2
Manual / bulk admin transfer
An admin selects many rules at once — optionally narrowed by a filter — and reassigns them all to a new owner in a single background operation (chapter 23). Because this bypasses the normal request-and-approve flow, Rulezet still auto-creates an "approved" history entry, deliberately framed as if the new owner had requested it and the admin had approved it — so the audit trail reads the same regardless of which path was actually used.

Both regular users and admins share the exact same requests page — a deliberate choice: a regular user tracking their own requests should never see "admin" anywhere in that URL or its layout, because it's a page they use routinely, not an administrative tool they're being let into. What differs is visible content, not the address: a regular user sees their own pending requests, history, and requests made to them; an admin additionally sees a processing queue for everyone else's requests and a Manual Ownership tool for bulk transfers.

Contributor stepping in
A long-time contributor requests ownership of a rule whose original author is no longer active, so it has a real accountable owner again.
Team offboarding at scale
An admin reassigns 150 rules from a departing contributor to a team account in one bulk operation, instead of processing 150 individual requests by hand.

A request's detail page shows exactly what's being transferred: a single rule for an individual request, or the full list of rules covered for a bulk manual grant — so "what did this actually affect" is always answerable, never a mystery buried in a count.

Irreversible from the UIA manual bulk transfer has no built-in "undo" button once it completes — treat the confirmation step before running one as the last checkpoint, not a formality.
Screenshot
11 · Feature Guide

Bundles — Curated Rule Collections

If a rule is the atom, a bundle is the molecule — how a coherent, shareable "detection pack" gets assembled and distributed as a single thing.

Why
"Give me every rule relevant to threat actor X" or "here's our team's baseline ruleset" are questions people ask constantly — a bundle turns the answer into a single, linkable, versionable object instead of a list you re-assemble from memory every time.

A bundle is a named collection of rules that can be organized into folders (not just a flat list) via a drag-and-drop structure editor — useful when a bundle mirrors the layout of a source repository, or when a large bundle benefits from being grouped by technique, log source, or campaign phase. Like rules, bundles get the full community treatment: voting, view/download counts, and comments.

Access control is the other half of what makes bundles useful: a bundle can be public (anyone can see it) or private (visible only to its owner and admins) — so a "starter kit" can be iterated on privately and published only once it's actually ready.

Publishing a starter kit
A team assembles every rule relevant to a specific log source into one public bundle so other teams can adopt the whole set in a single action instead of hunting down each rule individually.
Maturing privately first
A bundle stays private while its rules are still being tuned, and is switched to public only once the team is confident enough to stand behind it publicly.

Capabilities

  • Create, edit, and delete a bundle (owner or admin).
  • Add rules individually or via a bulk rule-selector.
  • Arrange rules into a folder-style structure tree.
  • An "official" verified badge, presumably admin-granted, for particularly trusted bundles.
Worth confirming operationallyIf a rule referenced inside a bundle's structure is later permanently removed from the platform entirely, the bundle's folder tree should not be left pointing at a dangling reference — this is exactly the kind of edge case worth testing deliberately rather than assuming away.
Screenshot
12 · Feature Guide

Rule History & Audit Trail

The place a reader goes to answer "what happened to this rule over time, and who did it" — regardless of which mechanism actually caused the change.

Why
A rule can change through an accepted edit proposal (chapter 9), a manual admin edit, or an ownership transfer (chapter 10) — three very different mechanisms. Without a unified history view, understanding "why does this rule look different than I remember" would mean checking three separate places.

Every accepted change to a rule's content or ownership appends an entry to that rule's own History tab: what changed, who did it, and when — with a link back to the originating edit proposal or ownership request where one exists. It's deliberately additive-only: there's no way to edit or delete a past history entry after the fact, because the point of an audit trail is that it can't be quietly rewritten.

Investigating a surprise
A user notices a rule's condition looks different from what they remembered importing, and checks History to see it was updated three weeks ago via an approved edit proposal, with a link straight to that proposal's discussion.
Verifying a support claim
Before escalating "I was told ownership was transferred to me but I still can't edit this rule," someone checks History first and confirms — or disproves — that the transfer actually completed.
Screenshot
13 · Feature Guide

Tags, MISP Taxonomies & Galaxies

Free-text search only goes so far — a shared vocabulary lets rules be classified consistently across an entire community instead of every team inventing its own labels.

Why
If every team labels things their own way, "find every TLP:amber rule" or "find every rule tagged to this threat actor" becomes impossible across a shared platform. Reusing MISP's already-standardized vocabularies means Rulezet speaks the same classification language the rest of the community — and MISP itself — already uses.

Three related but distinct words matter here, and mixing them up is the single most common point of confusion for newcomers:

TermWhat it isExample
TaxonomyA structured vocabulary — a defined set of terms and their meaning.TLP (tlp:clear, tlp:amber...)
GalaxyA knowledge base of "clusters" — richer, curated entities rather than simple labels.A specific threat actor or malware family
TagThe concrete label actually attached to a rule or bundle — it may originate from either a taxonomy or a galaxy cluster.tlp:clear attached to a specific rule

Every new rule gets tlp:clear and pap:clear attached automatically the moment it's created — a sensible, shareable default that a user can tighten later if the content warrants a stricter classification.

Filtering by classification
Narrowing the entire rule library down to tlp:amber content only, before deciding what's safe to share with an external partner.
Associating with a threat actor
Tagging a rule with a galaxy cluster so it's immediately clear which known adversary group the detection logic relates to.
Freshness depends on your update cadenceTaxonomy and galaxy data is only as current as the last time it was refreshed on your instance — worth confirming and documenting your own update rhythm for this rather than assuming it's always automatically current.
Screenshot
14 · Feature Guide

MITRE ATT&CK Mapping

Ties every rule to the industry-standard adversary-behavior framework, so coverage can be reasoned about as a whole — not counted rule by rule by hand.

Why
"Which techniques do we actually have detections for?" is one of the most common questions a detection team gets asked — by leadership, by auditors, by their own gap-analysis process. Answering it by manually cross-referencing a spreadsheet doesn't scale; a live, computed coverage view does.

A rule can be linked to one or more ATT&CK techniques (identified by their standard ID, like T1068) either manually, or via an auto-parse pass that attempts to extract technique references directly from a rule's own content — an accelerator for bulk imports, not a substitute for a human glancing over the result.

Interactive matrix
The full ATT&CK matrix shows which techniques have at least one rule — click any cell to filter straight to those rules.
Coverage heatmap
Color intensity shows rule density per technique, so gaps are visible at a glance instead of requiring a manual count.
Per-bundle coverage
Every bundle carries its own scoped coverage view, so a detection set can be reasoned about as a unit.
Gap analytics
A dedicated view surfaces techniques with zero or very few associated rules — the starting point for "what should we write next."
Prioritizing new detection work
A detection engineer checks the coverage gap view before deciding what to write next, instead of guessing at what's missing.
Set expectations correctlyAuto-parsing accuracy depends entirely on how explicitly a rule's own content references technique IDs — treat an auto-parsed mapping as a draft worth a quick human check, not a guaranteed-correct classification.
Screenshot
15 · Feature Guide

Community Discussion — Comments, Reactions & Moderation

Detection rules get better under scrutiny — this is the mechanism for that scrutiny to happen in the open, attached directly to the content it's actually about.

Why
Feedback that lives in a separate chat channel, disconnected from the rule itself, gets lost the moment the conversation scrolls away. Attaching discussion directly to the rule, bundle, proposal, or blog post it concerns means the context never separates from the content.

The exact same threaded comment experience — replies, emoji-style reactions — appears in every place discussion can happen: on a rule, on a bundle, inside an edit proposal, and under a blog post. Learning it once means you already know it everywhere. A separate Comment Hub view lets you catch up on everything being discussed right now across the whole platform, instead of hunting object by object for what's new.

Moderation is deliberately kept separate from ordinary discussion: any comment, rule, or bundle can be reported/flagged by any user, which raises it — privately — into an admin moderation queue for review, resolution, or dismissal. The reported party never sees that a report was filed against them.

From comment to fix
A false positive is reported in a comment thread on a rule, which prompts its owner (or anyone else) to open a formal edit proposal (chapter 9) instead of the feedback just sitting there unresolved.
Resolving abuse
An admin resolves a flagged comment for abusive content via the moderation queue, without the reporter or the reported user needing to interact directly.
A data-hygiene guarantee, not an accidentDeleting the underlying rule, bundle, edit proposal, or blog post also removes its entire comment thread — comments are never left orphaned, pointing at content that no longer exists.
A deliberate trade-offComments on a deleted object are purged, not archived. If a future audit requirement ever needs deleted-object comments preserved, that would be a conscious policy change, not today's default behavior.
Screenshot
16 · Feature Guide

Blog & Knowledge Sharing

Rules alone don't carry the "why" — a blog post is where the narrative context a set of rules is responding to actually gets told.

Why
A rule's code tells you what it matches; it rarely tells you why it exists, what campaign prompted it, or what was learned building it. Pairing narrative writeups with the actual actionable rules — in the same place — means the two never drift apart.

A post can be drafted privately and iterated on before publishing, and — critically — can directly associate itself with specific rules, bundles, ATT&CK techniques, and CVE identifiers, so the write-up and the actionable content it discusses are one linked unit rather than two things a reader has to reconcile themselves. Readers discuss a post through the exact same comment system used everywhere else (chapter 15).

As a starting accelerator, a draft post can be generated from a CVE reference automatically — useful as a first pass a human still needs to review and rewrite before publishing, not an autonomous authoring feature.

Publishing a CVE writeup
A team documents what they learned building detection for a newly disclosed vulnerability, with the actual rules they wrote attached directly to the post.
Drafting before publishing
A post is iterated on privately across several review passes, and only made public once the team is confident it reflects the finished analysis.
Human review still requiredCVE-based draft generation produces a starting point, not a finished, fact-checked article — publish only after a human has actually read and corrected it.
Screenshot
17 · Feature Guide

Personal Workspaces

An investigation rarely fits neatly into "one rule" or "one bundle" — a workspace is the flexible scratch space for everything in between.

Why
Forcing every piece of working material into a formal, published bundle before it's ready creates friction that discourages people from organizing their work at all. A workspace is deliberately lower-stakes: a private area to collect things while an investigation is still taking shape.

A workspace lets you gather a working set of rules alongside freeform notes (documents) and reference links, with a quick KPI panel summarizing what's inside — all without committing to publishing anything. It's the working-notes layer that sits before a bundle, not a replacement for one.

Triaging an active incident
Every rule relevant to an ongoing investigation gets collected into one workspace as the picture develops, instead of scattered across browser tabs and a separate notes app.
Keeping notes next to the rules
Investigation notes and external reference links live directly alongside the rules they relate to, instead of in a disconnected document.
Worth clarifying with your teamWhether a workspace can be promoted directly into a published bundle, or whether that today means manually re-creating the bundle from scratch, is worth confirming — it's a natural next feature request once people start using workspaces heavily.
Screenshot
18 · Feature Guide

Gamification & Leaderboard

Community platforms live or die on sustained contribution — recognizing effort is the incentive layer that keeps people coming back to review, propose, and own rules.

Why
Reviewing someone else's rule or maintaining ownership of an old one is unglamorous, easy-to-skip work. Making that contribution visible — points, levels, a public leaderboard — gives it the recognition it otherwise wouldn't get, which is what keeps a volunteer-driven platform actually maintained over time.

Actions across the platform — an edit proposal being accepted, a rule attracting likes, taking on ownership of orphaned content — accumulate into a points total, which maps to a level. A contributor's own profile shows their full breakdown; a global leaderboard (searchable, sortable, paginated) shows how everyone stacks up, with category-specific views for different kinds of contribution.

Tracking personal progress
A contributor checks their own level and point breakdown on their profile after a productive week of accepted proposals.
Recognizing top contributors
The global leaderboard highlights the community's most active contributors over a period, giving visible credit for sustained, unglamorous maintenance work.
An honest trade-offAny points system risks rewarding quantity over quality — someone could, in theory, propose many trivial edits to accumulate points. Weighting accepted contributions rather than merely submitted ones is the main safeguard against this, and is worth actively monitoring as the community grows.
Screenshot
19 · Feature Guide

Notifications

With this many collaborative workflows running at once, users need one place that says "something happened that needs your attention" — instead of having to poll every page just in case.

Why
Edit proposals, ownership requests, comments, reports, and background jobs can all produce something worth knowing about, often for someone who isn't actively looking at that specific page. A single, unified notification layer means nothing important depends on lucky timing.

Nearly every collaborative action described elsewhere in this report — a proposal submitted or decided, a new comment or reply, a report filed, ownership requested or granted, a long-running job finishing — creates a notification for whoever needs to know: the owner, an admin, a follower. A bell icon shows a live unread count and a short recent list; a full page lists and paginates everything with read/unread state, and a preferences page lets each user control which event types actually notify them.

Immediate awareness
A rule owner gets notified the instant someone proposes an edit to it, instead of discovering the proposal by chance days later.
Passive admin awareness
An admin is notified the moment a report is filed, rather than needing to proactively check the moderation queue on a schedule.
Worth confirming preciselyWhether delivery is in-app only, or also reaches email/another channel, is exactly the kind of detail an evaluator will ask about early — confirm the current channel(s) precisely rather than assuming.
Screenshot
20 · Feature Guide

Rule Tester

A rule that's syntactically valid isn't necessarily a rule that matches anything real — the Rule Tester is where you find out before you trust it.

Why
Chapter 8 was explicit that syntax validation cannot prove a rule actually detects anything. The Rule Tester is the feature that closes that specific gap — by running a rule against real sample data instead of only checking that it parses.

Sample data is attached to a rule, the test is run, and matches (or the lack of them) are reviewed with notes kept alongside for future reference. A test can be kept private or shared, and bulk testing lets a larger validation effort run across many rules against a reference dataset at once rather than one at a time.

Confirming a rule actually fires
A new Suricata rule is run against a captured, sample-derived dataset to confirm it actually matches before anyone treats it as trusted, production-ready detection.
Bulk-validating an import
An entire freshly-imported rule set is bulk-tested against a reference dataset in one pass, rather than testing each rule by hand.
Currently suspendedThis feature is presently disabled in navigation and test history pending re-enablement — this documentation describes it as designed, not as currently reachable in the live UI. Revisit this chapter (and take its screenshots) once it's switched back on.
Screenshot
21 · Feature Guide

Customizable Dashboard

Different people care about different signals — a manager wants trend charts, an analyst wants a rule list — a fixed homepage can never serve both well.

Why
Rather than guessing at one "right" default view for every user, a widget-based dashboard lets each person build the view that actually matches what they check first every day.

Widgets — KPI tiles, charts, a rule list, an ATT&CK coverage heatmap, trending vulnerabilities, an activity feed, an activity calendar, a "format race" comparison, and summary stat rows — can be added, removed, resized, and rearranged on a drag-and-drop grid. The layout is saved per user and reloaded automatically next time, with a one-click reset back to the platform default if an experiment doesn't work out.

A personal "morning check"
A user builds a dashboard combining recent activity, trending CVEs, and a KPI row — everything they check first each morning, in one screen.
Worth documenting per widgetNot every widget refreshes at the same cadence — an activity feed is effectively live, while something like trending vulnerabilities may update on a longer cycle. Setting that expectation per widget avoids someone assuming a widget is stale when it's actually just on a slower refresh schedule.
Screenshot
22 · Feature Guide

Connectors & Federation

No single Rulezet instance should be an island — connectors let instances share content with each other, so a smaller or private deployment still benefits from a larger community's work.

Why
A private, internal Rulezet instance shouldn't have to choose between staying private and benefiting from the public community's rules. A connector lets it pull curated content on its own schedule, on its own terms, without giving up isolation.

An admin configures a connector pointing at another Rulezet instance (or a MISP source), tests connectivity, previews exactly what a pull would bring in, and then runs it — as a trackable background job (chapter 23), not a black-box operation. Every pull is logged in the connector's own history for later audit.

Pull modeBehavior
SoftSkip anything that already exists locally — safe, additive only.
HardUpdate existing content in place to match the remote — can overwrite local edits, use deliberately.

Matching between instances is done strictly by a stable UUID, never by title or name — this avoids the obvious failure mode of two unrelated rules that happen to share a name being incorrectly merged.

Private instance, public benefit
An internal-only Rulezet deployment periodically pulls curated content from the public rulezet.org instance, staying current without ever exposing its own private content back.
Read before running a hard pullA hard pull can overwrite local edits to previously-synced content — this is a genuine data-loss risk if the distinction from a soft pull isn't understood before clicking it, not a hypothetical edge case.
A structural limitContent without a stable UUID (rare, but possible for hand-entered content) cannot be matched this way — worth knowing before assuming every piece of content is sync-able.
Screenshot
23 · Feature Guide

Background Jobs & Async Operations

Several operations across this report — bulk transfers, GitHub imports, similarity scans, connector pulls — are slow by nature. This is what keeps them visible and safe instead of freezing the interface.

Why
A 500-rule import that blocks the page for several minutes with no feedback looks broken, even when it isn't. Making heavy operations asynchronous — with live progress and the ability to pause — turns "is this stuck?" into "here's exactly where it is."

Any operation heavy enough to matter runs as a trackable job with a visible status (pending, running, paused, completed, failed, cancelled) instead of tying up a request. A live progress view shows what's happening as it happens, and a structured, timestamped log is attached to every job for troubleshooting after the fact. If the server restarts mid-job, the job is automatically recovered back to a pending state rather than being silently lost.

Crucially, jobs can be paused and resumed without starting over — a large operation doesn't have to run start-to-finish in one sitting, and doesn't lose the work already done if it's interrupted.

Watching real progress
A 500-rule GitHub import shows live progress instead of a blank, unresponsive screen for several minutes.
Pausing a large operation
A large bulk ownership transfer is paused partway through and resumed later, continuing from where it left off rather than reprocessing rules already handled.

This mechanism underlies operations described throughout this report: bulk tag add/remove, GitHub rule deletion, activity log cleanup, MISP data refresh, trash restore/purge, connector pulls, bulk ownership transfer, ATT&CK data refresh and bulk parsing, bulk field parsing, and CVE-based blog draft generation — each covered in its own chapter; this one is about the shared mechanism they all run on.

A throughput constraint to plan aroundJobs are processed one at a time by design — a very large bulk operation will queue behind whatever's already running rather than executing in parallel with it. Plan the timing of large operations with this in mind.
Screenshot
24 · Feature Guide

Activity Log & Audit Trail (Platform-Wide)

Complements the per-rule history from chapter 12 with a platform-wide, cross-feature trail — the answer to "what has been happening on this instance," mainly for admins.

Why
Per-rule history answers "what happened to this one rule." Running an actual platform means also being able to answer "who deleted this bundle" or "what happened around 2pm yesterday" — questions that span features, not just one object.

Every significant action anywhere on the platform is recorded consistently, and each action type carries configurable metadata — an admin can adjust its visibility and description rather than that being hard-coded — which is what powers a curated, public-facing activity feed alongside the full admin-only log. Old entries can be bulk-purged as a background job (chapter 23) rather than growing forever unchecked.

Investigating a deletion
An admin traces exactly who deleted a specific bundle and when, using the full log rather than relying on memory or a lucky Slack message.
Curating the public feed
An admin tunes which action types are visible on the public activity feed versus kept admin-only, balancing transparency with noise.
Worth documenting for compliance planningLogs grow indefinitely unless actively purged — confirm and document your instance's actual purge cadence if audit or compliance retention requirements matter to your organization.
Screenshot
25 · Feature Guide

Administration & Platform Settings

Someone has to run the instance day to day — this is the admin's operational chapter, distinct from the feature-specific admin actions already covered per topic elsewhere in this report.

Why
Every feature chapter mentions its own admin actions in passing. This chapter is where instance-level operation — who can log in, what formats are accepted, whether the instance is backed up — lives on its own, because it's a different job than moderating any single feature.

Everything here is admin-only, without exception: user management, the rule format catalogue (enabling or disabling formats, and whether a format is treated as "executable"), the Trash (restoring or permanently purging soft-deleted rules, individually or in bulk), system/package/environment configuration, backups, and the instance's own configuration — including the "official instance" flag that enables the daily telemetry phone-home, deliberately true only on the canonical rulezet.org deployment.

A separate Platform Insights view gives instance-wide usage analytics — distinct from the per-user dashboard in chapter 21, this one is about the health of the whole deployment, not one person's workflow.

Bringing an instance online
A new deployment's first admin reviews system settings and confirms backups are working before inviting the rest of the team in.
Cleaning house
An admin reviews the Trash periodically and permanently purges rules that were soft-deleted long ago and are genuinely no longer needed.
Two genuinely irreversible actions live herePermanently purging a rule from Trash cannot be undone — the same warning given for every hard-delete path in this report applies here too, consistently, every time it comes up. Editing system/environment configuration from the UI is similarly sensitive; know precisely what fields are exposed this way before changing them.
Screenshot
26 · Feature Guide

Public REST API

Not every interaction with Rulezet should require clicking through a browser — the API is what lets a team automate rule pulls or build Rulezet into their own tooling.

Why
A platform that only works through a human clicking buttons can't be part of an automated pipeline. Exposing the same actions the UI offers as a proper API is what makes Rulezet something you can build on, not just visit.

Authentication is a personal API key (generated from your profile, chapter 6) sent in a request header. Every namespace is documented and directly exercisable through interactive documentation built into the running instance — you can try a real request before writing a single line of integration code.

Automated ingestion
An internal detection pipeline pulls the latest public rules on a schedule, without a human ever opening the Rulezet UI.
CI-driven bundle management
A CI process creates and updates bundles automatically as part of a broader release pipeline.

Every action still respects the exact same ownership and admin rules described in chapter 6 — the API is a different door into the platform, not a way around its permission model.

Confirm before integratingRate limiting behavior isn't something to assume either way — check the current behavior directly (and the live interactive docs for the current, authoritative list of available endpoints) before building an integration that depends on a particular assumption.
Screenshot
III Architecture & Developer Guide
A different kind of chapterPart I and II were written for anyone who uses Rulezet. This Part is written for anyone who wants to extend it. It stays deliberately conceptual — ideas, reasoning, and worked examples — rather than a code walkthrough; treat it as the mental model to have in mind before opening the source, not a substitute for reading it.
27 · Architecture

System Architecture Overview

The thirty-thousand-foot view every contributor should have before touching anything else described in this Part.

Rulezet is built as a fairly classical web application: a server that renders pages and handles requests, a relational database holding everything durable, and a lightweight interactive layer in the browser that takes over once a page has loaded — no separate build pipeline stands between writing a page's code and seeing it run. That choice is deliberate: it keeps the barrier to contributing low. Anyone can open a single file, see the page's structure and its interactive behavior together, and understand the whole picture without first learning a separate front-end toolchain.

Why this matters
A platform built by (and for) a security community benefits more from "any contributor can read the whole stack in one sitting" than from squeezing out marginal front-end performance with a heavier toolchain. Simplicity of the stack is treated as a feature, not a limitation.

Alongside ordinary request/response handling, three things run continuously in the background, all triggered by the same everyday user actions described throughout Part II:

  • The background job engine (chapter 28) — anything too slow to do inline becomes a trackable, resumable task instead.
  • The audit trail (chapter 24) — nearly every meaningful action writes a record as it happens.
  • Notifications (chapter 19) — the same actions fan out to whoever needs to know about them.

A single example ties all three together: an admin runs a bulk ownership transfer (chapter 10). That transfer runs as a background job so the browser stays responsive throughout; each affected rule's ownership change is written to the audit trail as it happens; and the new owner receives a notification the moment it's done. Three chapters, one action — this is the pattern to recognize whenever a new feature is being designed.

Three environments, one codebaseThe exact same application code runs in three modes — a local development mode, an automated-testing mode (using a disposable, in-memory database so tests never touch real data), and production. Switching between them is a single setting, never a code change.
28 · Architecture

The Background Job Engine

The mechanism behind every "this might take a while" operation from chapter 23 — explained for someone who wants to make a brand-new operation work the same way.

Why
Without a shared mechanism, every slow feature would reinvent its own progress tracking, its own pause/resume logic, and its own way of surviving a server restart — inconsistently, and mostly badly. One engine, used everywhere a heavy operation exists, means all of that gets solved once.

The core idea is simple to state and easy to get wrong in practice: a background operation processes its work in small chunks, and after each chunk it writes down exactly how far it's gotten — a "bookmark." Nothing about its progress is allowed to live only in memory, because the operation might be paused by a user, or the whole server might restart, at any moment between chunks. When it resumes — whether a second later or the next day — it starts by reading its own bookmark and continuing from there, not from the beginning.

Worked example
A bulk operation covering several thousand rules works through them in batches of a few hundred at a time. After each batch, it records "the last 300 are done." If someone pauses it after four batches, or the server restarts unexpectedly, resuming reads that bookmark and starts at rule 1,201 — never rule 1.

Conceptually, adding a new kind of background operation means:

1
Describe the work as small, repeatable chunks
Not one giant all-or-nothing step — something that can be checkpointed meaningfully partway through.
2
Write a bookmark after every chunk
Enough information to resume correctly — an offset, a list of what's already been processed, whatever the operation actually needs to pick back up cleanly.
3
Check periodically whether you've been asked to pause or stop
Between chunks is the natural, safe point to check — never partway through one.
4
Let the shared engine handle the rest
Status tracking, the live progress view, pause/resume/cancel controls, and restart recovery all come for free once an operation follows this shape — nothing feature-specific needs to be built to get them.
The single most common mistakeAssuming something survives in memory between a pause and a resume. It doesn't — a resumed operation starts as if freshly launched, with no memory of anything except what was actually written to its bookmark. If it's not in the bookmark, treat it as lost.
One at a time, by designOperations run strictly one after another rather than in parallel with each other — a deliberate simplicity trade-off. Design new operations with that constraint in mind rather than assuming concurrency with other background work.
29 · Architecture

The Rule Format Parsing Engine — How to Add a New Format

How Rulezet treats nine very different detection languages identically everywhere else in the platform — and exactly what's involved in adding a tenth.

Why
If rule creation, import, validation, and the bad-rule queue each had special-case logic per format, adding a new format would mean touching all of them, carefully, without breaking the others. Instead, every format is an interchangeable plug-in that promises the same small set of answers — the rest of the platform only ever asks those questions, never anything format-specific.

Concretely, a format only ever needs to answer three questions about a piece of content: is this valid for the format (and if not, what exactly is wrong with it), what metadata does it carry (title, author, whatever the format naturally exposes), and — only relevant for bulk import — how do I find individual rules inside a larger file or repository that might contain many of them. Every existing format (YARA, Sigma, Suricata, Zeek, and the rest) answers those same three questions in its own way; nothing else in the platform needs to know or care how.

Rule content
any format
Matching format plug-in
validate + read metadata
Rule created — or Bad Rule
same pipeline, every format

Adding a new format, conceptually

1
Define what "valid" means for this format
This is the single most important piece — it's what decides whether a submission becomes a real rule or gets quarantined in the Bad Rules queue (chapter 8).
2
Define what metadata to pull out
Whatever the format naturally exposes — a title, an author field, a description — so it's searchable and displayed consistently with every other format.
3
Define how to split a bulk file into individual rules
Only needed if the format supports many rules per file, and only matters for the GitHub-import path — a format only ever created one rule at a time can implement this minimally.
4
Nothing else changes
Rule creation, import, search, the bad-rule queue, and validation error display all already know how to work with any format that answers the three questions above — a new format plugs into all of them automatically.
Failing validation is a correct outcome, not an error to avoidA new format implementation must be comfortable saying "this is not valid" clearly and specifically — that's precisely what routes a bad submission to the Bad Rules queue for human review (chapter 8) instead of it being silently accepted broken, or silently thrown away.
Keep it self-containedA format implementation shouldn't depend on anything about the specific request or user submitting it — it should behave the same way regardless of when or how it's called, which is what lets the platform load and reuse every format's logic interchangeably.
30 · Architecture

Frontend Architecture & Shared Components

How the interactive layer is organized, and why the same handful of building blocks show up in nearly every chapter of Part II.

Why
Every page is rendered on the server first, so its content and structure exist immediately — then a lightweight interactive layer takes over for anything dynamic: voting, live filtering, in-place editing, charts. Keeping this layer simple and dependency-light (no separate compiled bundle to reason about) is what keeps the whole codebase approachable to a new contributor.

Rather than every feature reinventing its own version of a code viewer, a diff viewer, a comment thread, or a rule list, a small catalogue of shared building blocks exists and gets reused everywhere the same need comes up. This is why, across this entire report, the same interaction patterns keep reappearing: the comment thread on a rule (chapter 15), on a bundle (chapter 11), and under a blog post (chapter 16) isn't three separate implementations that could quietly drift apart — it's the same one, used three times.

Worked example
The same rule-list building block powers the homepage's recent rules, a bundle's rule list, and a workspace's rule list. Adding a new sort option to it once improves all three places at the same time — there's no second or third copy left unfixed.
Code & diff viewing
Shared components render syntax-highlighted rule content and side-by-side diffs consistently wherever a rule's content is shown or compared.
Comment thread
One threaded-comment-with-reactions component, reused across rules, bundles, proposals, and blog posts (chapter 15).
Rule & data listings
A shared list/table building block with built-in search, sort, and filtering, reused for rules, logs, and other tabular data across the platform.
Charts & visualizations
A common charting layer powers the dashboard (chapter 21), Platform Insights, and ATT&CK coverage views alike.
Permissions stay server-authoritativeWhat a given user is allowed to do — edit, delete, moderate — is always decided on the server and simply handed to the interactive layer to reflect (show or hide a button, for instance). The frontend never independently decides who is allowed to do what; it only displays a decision that's already been made.
31 · Architecture

Development Conventions & Use Cases to Respect

A short list of hard rules — each one exists because breaking it caused a real problem before, not as an arbitrary style preference.

Deleted content stays deleted, everywhere

A rule (or bundle, or post) that's been removed must not resurface anywhere it's referenced — search results, listings, the API — and everything attached to it (like its discussion thread) needs to be cleaned up consistently at the same time, not left behind pointing at something that no longer exists. This principle underlies the comment-cleanup guarantee described in chapter 15.

Soft delete before hard delete

Destructive actions get a recoverable, reviewable middle step before anything is truly, permanently gone — the Trash described in chapters 7 and 25. Treat "permanently remove" as a deliberate, separate, admin-only second action, never the direct result of an ordinary delete click.

Ownership and admin rights are the only two ways in

The rule from chapter 6 — only a resource's owner or an admin can change or remove it — applies everywhere a resource can be acted on, without a feature-by-feature exception. A new feature that lets someone act on a resource needs to apply this same check, not invent its own variant.

Shared pages gate only their admin-specific parts

A page that both regular users and admins need — like the requests page in chapter 10 — must gate only the pieces that are genuinely admin-only, never the whole page. Locking an entire shared page behind an admin check by mistake is a real regression this project has hit before, and is exactly the kind of thing worth testing deliberately from a non-admin account.

A structural change and its rollout are one action, not two

If how data is organized changes, the operational step that applies that change to the running system must happen at the same time — not "eventually," not "before the next deploy." A structural change that's only half-applied can break the live system the moment anything touches it.

Ordered lists need to be told their order

A paginated list with no explicit, deliberate ordering can present newly added items on any page at all, not predictably at the top — a bug that looks like "data is missing" when the data is actually just unpredictably placed. Every list a user pages through needs an intentional order, not an assumed one.

Every meaningful action leaves a trace

Anything worth knowing happened — the kind of thing chapter 24's audit trail exists to answer questions about — needs to be recorded at the moment it happens. A missing record is invisible right up until the moment someone goes looking for an entry that was never made, which is always the worst possible time to discover the gap.

Treat this chapter as load-bearingNone of the seven principles above are style preferences — each maps to a real, previously-observed failure mode in how this kind of platform breaks when they're skipped. Read this chapter before your first contribution, not after your first incident.
IV Appendices
A · Appendix

Glossary of Terms & Acronyms

Every acronym and term used across this report, in one place — link back here any time a chapter uses one you don't recognize.

TermMeaning
APIApplication Programming Interface — the way external software talks to Rulezet directly, without a browser (chapter 26).
ATT&CKA MITRE framework cataloguing known adversary behaviors as a standard, referenceable set of techniques (chapter 14).
BundleA named, curated collection of rules (chapter 11).
CIRCLComputer Incident Response Center Luxembourg — the organization that builds and operates Rulezet (chapter 1).
CRSCore Rule Set — a detection rule format used with web application firewalls.
CVECommon Vulnerabilities and Exposures — the standard identifier scheme for publicly known vulnerabilities.
Edit proposalA pull-request-style suggested change to a rule, reviewed and accepted or rejected by its owner (chapter 9).
ElasticA detection rule format associated with the Elastic Stack / Elastic Security.
GalaxyA MISP knowledge base of curated clusters — threat actors, malware families, and similar entities (chapter 13).
MISPAn open-source threat intelligence sharing platform built by CIRCL — Rulezet reuses its tag vocabularies (taxonomies and galaxies) and can connect to it directly (chapters 13, 22).
NGSOTIThe project under which Rulezet was built at CIRCL, focused on improving tooling and training for the next generation of SOC analysts (chapter 1).
NovaA threat-hunting rule format supported by Rulezet.
NSENmap Scripting Engine — a scripting format for network reconnaissance detection.
OwnershipThe accountable user attached to a rule, bundle, or other resource (chapter 10).
PAPPermissible Actions Protocol — a classification describing what actions are allowed on shared content (chapter 5).
SigmaA generic, log-source-agnostic detection rule format designed to describe conditions abstractly rather than for one specific tool.
SOCSecurity Operations Center — the team responsible for monitoring and responding to security events.
STIXStructured Threat Information Expression — a standard format for representing threat intelligence, used as one of ATT&CK's own data formats.
SuricataA network intrusion detection/prevention rule format for inspecting network traffic.
TaxonomyA MISP-standard structured vocabulary, such as TLP (chapter 13).
TLPTraffic Light Protocol — a classification describing how freely content can be shared (chapter 5).
UUIDUniversally Unique Identifier — a stable identifier used to match the same piece of content across different systems or instances (chapter 22).
WazuhA SIEM platform with its own XML-based detection rule format.
WorkspaceA personal, flexible working area for rules, notes, and links (chapter 17).
YARAA pattern-matching rule format primarily used to identify and classify malware samples.
ZeekA network traffic analysis framework with its own scripting-based detection format.
B · Appendix

Roadmap & Future Directions

Where the platform is headed next — dated deliberately, since a roadmap is the part of any report that goes stale fastest.

As of 2026Confirm these items are still accurate before relying on this appendix — check with the team for anything time-sensitive.
  • MISP import/export — the ability to import and export rules and bundles directly to and from MISP, closing the loop between Rulezet's detection-rule focus and MISP's indicator focus.
  • Vulnerability Lookup integration — linking rules to CIRCL's own Vulnerability Lookup service (vulnerability.circl.lu) for faster, more direct CVE traceability than a plain identifier field.

Both items reflect the same underlying goal: deepening Rulezet's integration with the rest of CIRCL's open tooling ecosystem, rather than growing it as an isolated product.

C · Appendix

Screenshot & Media Master Checklist

Every "Screenshot to capture" note from this report, aggregated in chapter order — a one-stop shot list for an actual capture session.

Ch.ChapterWhat to capture
1ForewordHomepage hero.
3What Is Rulezet"Recent Rules" card grid on the homepage.
6Accounts & RolesRegistration form, login form, profile page with API key section.
7Rule ManagementCreate-rule form, GitHub import flow, a full rule detail page.
8Validation & SimilarityBad Rules queue, a rule's similar-rules panel, admin similarity-scan results.
9Edit ProposalsPropose-edit form, diff view, proposal comment thread.
10Ownership & RequestsRequests page (user view), requests page (admin view), a bulk-grant request detail page.
11BundlesBundle list, create/edit form, bundle detail page (rule list + structure tree).
12Rule HistoryA rule's History tab.
13Tags & TaxonomiesTag browser, tag autocomplete on create form, admin taxonomy/galaxy import screen.
14ATT&CK MappingHeatmap/matrix page, a rule's technique badges, coverage gap analytics.
15Community & ModerationA comment thread with reply + reaction, the Comment Hub, admin moderation queue.
16BlogBlog list, post editor, a published post with attached rules/techniques.
17WorkspacesWorkspace list, workspace detail (rules + documents + links + KPIs).
18GamificationGlobal leaderboard, a contributor profile page.
19NotificationsBell dropdown, full notifications page, preferences page.
20Rule TesterTest run screen, test result view, bulk test screen — once re-enabled.
21DashboardFull dashboard, widget picker, ATT&CK heatmap + activity calendar widgets close-up.
22Connectors & FederationConnector list, create-connector form, pull preview, connector history.
23Background JobsJob list, job detail mid-run with live log, pause/resume controls.
24Activity LogAdmin logs page (search/filter), public activity feed, log definitions screen.
25AdministrationUser management, format management, Trash/purge, backups, system settings, Platform Insights.
26Public REST APIInteractive API docs landing page, one expanded example request/response.

Chapters not listed here (Part I's remaining chapters, and all of Part III) are narrative or conceptual and don't need a screenshot.

End of report Use the Export button (top-right) at any time to print this as a PDF or download it as a standalone Markdown file — in whichever language is currently selected.