diff --git a/src/Filtering/Filter.coffee b/src/Filtering/Filter.coffee
index f7ba967a8..39fedfe22 100644
--- a/src/Filtering/Filter.coffee
+++ b/src/Filtering/Filter.coffee
@@ -22,6 +22,10 @@ Filter =
boards = filter.match(/boards:([^;]+)/)?[1].toLowerCase() or 'global'
boards = if boards is 'global' then null else boards.split(',')
+ # boards to exclude from an otherwise global rule
+ if boards is null
+ excludes = filter.match(/exclude:([^;]+)/)?[1].toLowerCase().split(',') or null
+
if key in ['uniqueID', 'MD5']
# MD5 filter will use strings instead of regular expressions.
regexp = regexp[1]
@@ -64,7 +68,7 @@ Filter =
top = filter.match(/top:(yes|no)/)?[1] or 'yes'
top = top is 'yes' # Turn it into a boolean
- @filters[key].push @createFilter regexp, boards, op, stub, hl, top
+ @filters[key].push @createFilter regexp, boards, excludes, op, stub, hl, top
# Only execute filter types that contain valid filters.
unless @filters[key].length
@@ -75,7 +79,7 @@ Filter =
name: 'Filter'
cb: @node
- createFilter: (regexp, boards, op, stub, hl, top) ->
+ createFilter: (regexp, boards, excludes, op, stub, hl, top) ->
test =
if typeof regexp is 'string'
# MD5 checking
@@ -92,6 +96,8 @@ Filter =
(value, boardID, isReply) ->
if boards and boardID not in boards
return false
+ if excludes and boardID in excludes
+ return false
if isReply and op is 'only' or !isReply and op is 'no'
return false
unless test value
diff --git a/src/General/Settings/Filter-guide.html b/src/General/Settings/Filter-guide.html
index 9d453ced6..50ffaf0af 100644
--- a/src/General/Settings/Filter-guide.html
+++ b/src/General/Settings/Filter-guide.html
@@ -10,6 +10,10 @@
Per boards, separate them with commas. It is global if not specified.
For example: boards:a,jp;.
+
exclude:vg,v;.
+ op:only;, op:no; or op:yes;.