Compare commits

...

14 Commits

Author SHA1 Message Date
Xe Iaso
400c945ad6 chore: update spelling
Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-02-15 15:04:04 +00:00
Xe Iaso
957bee6933 docs(AGENTS): make compatible with opencode
Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-02-15 15:02:20 +00:00
Xe Iaso
4fc9943da0 chore: remove symlinks
Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-02-15 14:35:00 +00:00
Xe Iaso
1613735dd8 docs: add AI coding tools policy
Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-02-15 13:34:47 +00:00
hyperdefined
03f5e0d542 feat(apps): add updown.io policy (#1444) 2026-02-15 08:21:39 -05:00
Kurt McKee
b4f15a5d16 Fix a CI warning: "The set-output command is deprecated" (#1443) 2026-02-15 08:19:43 -05:00
Xe Iaso
bf5d66222c chore: set up commitlint, husky, and prettier (#1451)
* chore: add prettier configuration

Signed-off-by: Xe Iaso <me@xeiaso.net>

* format: run prettier tree-wide

Signed-off-by: Xe Iaso <me@xeiaso.net>

* chore(prettier): ignore intentionally ungrammatical files

Signed-off-by: Xe Iaso <me@xeiaso.net>

* ci: add PR title lint rule

Signed-off-by: Xe Iaso <me@xeiaso.net>

* ci: add DCO check

Signed-off-by: Xe Iaso <me@xeiaso.net>

* chore: add commitlint and husky

Signed-off-by: Xe Iaso <me@xeiaso.net>

* chore: add CONTRIBUTING guidelines

Signed-off-by: Xe Iaso <me@xeiaso.net>

* chore: set SKIP_INTEGRATION in precommit tests

Signed-off-by: Xe Iaso <me@xeiaso.net>

* chore: update spelling

Signed-off-by: Xe Iaso <me@xeiaso.net>

* ci(dco): remove reopened trigger

Signed-off-by: Xe Iaso <me@xeiaso.net>

* chore: remove dead file

Signed-off-by: Xe Iaso <me@xeiaso.net>

* chore(prettier): don't format nginx includes

Signed-off-by: Xe Iaso <me@xeiaso.net>

---------

Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-02-15 08:19:12 -05:00
Bart Louwers
005750903d Improve Dutch translations (#1446)
* Improve horrible machine translated Dutch translations

Signed-off-by: Bart Louwers <bart.louwers@gmail.com>

* Apply suggestion from @louwers

Signed-off-by: Bart Louwers <bart.louwers@gmail.com>

* Apply suggestion from @louwers

Signed-off-by: Bart Louwers <bart.louwers@gmail.com>

* Apply suggestion from @louwers

Signed-off-by: Bart Louwers <bart.louwers@gmail.com>

* Apply suggestion from @louwers

Signed-off-by: Bart Louwers <bart.louwers@gmail.com>

* Update check-spelling metadata

---------

Signed-off-by: Bart Louwers <bart.louwers@gmail.com>
Co-authored-by: Jason Cameron <git@jsn.cam>
2026-02-14 21:08:34 +00:00
dependabot[bot]
d2205b11a7 build(deps): bump the github-actions group with 4 updates (#1425)
Bumps the github-actions group with 4 updates: [actions/checkout](https://github.com/actions/checkout), [actions/setup-node](https://github.com/actions/setup-node), [actions/setup-go](https://github.com/actions/setup-go) and [actions/cache](https://github.com/actions/cache).


Updates `actions/checkout` from 6.0.1 to 6.0.2
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](8e8c483db8...de0fac2e45)

Updates `actions/setup-node` from 6.1.0 to 6.2.0
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](395ad32622...6044e13b5d)

Updates `actions/setup-go` from 6.1.0 to 6.2.0
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](4dc6199c7b...7a3fe6cf4c)

Updates `actions/cache` from 5.0.1 to 5.0.2
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](9255dc7a25...8b402f58fb)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: actions/setup-node
  dependency-version: 6.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: actions/setup-go
  dependency-version: 6.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: actions/cache
  dependency-version: 5.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Jason Cameron <git@jsn.cam>
2026-01-28 13:50:19 -05:00
Bertrand Jacquin
09f6f4b153 web: fix spacing/indent (#1423)
web/index.templ CSS contains a mix bag of tab/space along with unaligned
inner CSS. This commit brings consistency
2026-01-24 21:27:16 -05:00
Matthias Dötsch
d2bc5cadb9 performance: remove significant overhead of decaymap (#1420)
I have ~5% base CPU load on an idle server due to mutex 100x per second.

Signed-off-by: Matthias Dötsch <matze@mdoetsch.de>
2026-01-22 19:03:17 +00:00
Jason Cameron
23ec1b82a7 chore: add comments back to Challenge struct. (#1419)
See #1284
and https://github.com/TecharoHQ/anubis/pull/1284#issuecomment-3784096905
2026-01-22 14:52:15 +00:00
dependabot[bot]
d622675edc build(deps): bump preact from 10.28.1 to 10.28.2 in the npm group (#1412)
Bumps the npm group with 1 update: [preact](https://github.com/preactjs/preact).


Updates `preact` from 10.28.1 to 10.28.2
- [Release notes](https://github.com/preactjs/preact/releases)
- [Commits](https://github.com/preactjs/preact/compare/10.28.1...10.28.2)

---
updated-dependencies:
- dependency-name: preact
  dependency-version: 10.28.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Jason Cameron <git@jsn.cam>
2026-01-22 09:50:34 -05:00
dependabot[bot]
493a957f4b build(deps): bump astral-sh/setup-uv in the github-actions group (#1413)
Bumps the github-actions group with 1 update: [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv).


Updates `astral-sh/setup-uv` from 7.1.6 to 7.2.0
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](681c641aba...61cb8a9741)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 7.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...


Co-authored-by: Jason Cameron <git@jsn.cam>
2026-01-22 09:49:50 -05:00
181 changed files with 3059 additions and 1702 deletions

View File

@@ -2,9 +2,7 @@
// README at: https://github.com/devcontainers/templates/tree/main/src/debian // README at: https://github.com/devcontainers/templates/tree/main/src/debian
{ {
"name": "Dev", "name": "Dev",
"dockerComposeFile": [ "dockerComposeFile": ["./docker-compose.yaml"],
"./docker-compose.yaml"
],
"service": "workspace", "service": "workspace",
"workspaceFolder": "/workspace/anubis", "workspaceFolder": "/workspace/anubis",
"postStartCommand": "bash ./.devcontainer/poststart.sh", "postStartCommand": "bash ./.devcontainer/poststart.sh",
@@ -31,4 +29,4 @@
} }
} }
} }
} }

View File

@@ -58,4 +58,3 @@ body:
attributes: attributes:
label: Additional context label: Additional context
description: Add any other context about the problem here. description: Add any other context about the problem here.

View File

@@ -1,6 +1,6 @@
name: Feature request name: Feature request
description: Suggest an idea for this project description: Suggest an idea for this project
title: '[Feature request] ' title: "[Feature request] "
body: body:
- type: textarea - type: textarea

View File

@@ -1,17 +1,17 @@
# check-spelling/check-spelling configuration # check-spelling/check-spelling configuration
File | Purpose | Format | Info | File | Purpose | Format | Info |
-|-|-|- | -------------------------------------------------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
[dictionary.txt](dictionary.txt) | Replacement dictionary (creating this file will override the default dictionary) | one word per line | [dictionary](https://github.com/check-spelling/check-spelling/wiki/Configuration#dictionary) | [dictionary.txt](dictionary.txt) | Replacement dictionary (creating this file will override the default dictionary) | one word per line | [dictionary](https://github.com/check-spelling/check-spelling/wiki/Configuration#dictionary) |
[allow.txt](allow.txt) | Add words to the dictionary | one word per line (only letters and `'`s allowed) | [allow](https://github.com/check-spelling/check-spelling/wiki/Configuration#allow) | [allow.txt](allow.txt) | Add words to the dictionary | one word per line (only letters and `'`s allowed) | [allow](https://github.com/check-spelling/check-spelling/wiki/Configuration#allow) |
[reject.txt](reject.txt) | Remove words from the dictionary (after allow) | grep pattern matching whole dictionary words | [reject](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-reject) | [reject.txt](reject.txt) | Remove words from the dictionary (after allow) | grep pattern matching whole dictionary words | [reject](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-reject) |
[excludes.txt](excludes.txt) | Files to ignore entirely | perl regular expression | [excludes](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-excludes) | [excludes.txt](excludes.txt) | Files to ignore entirely | perl regular expression | [excludes](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-excludes) |
[only.txt](only.txt) | Only check matching files (applied after excludes) | perl regular expression | [only](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-only) | [only.txt](only.txt) | Only check matching files (applied after excludes) | perl regular expression | [only](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-only) |
[patterns.txt](patterns.txt) | Patterns to ignore from checked lines | perl regular expression (order matters, first match wins) | [patterns](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-patterns) | [patterns.txt](patterns.txt) | Patterns to ignore from checked lines | perl regular expression (order matters, first match wins) | [patterns](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-patterns) |
[candidate.patterns](candidate.patterns) | Patterns that might be worth adding to [patterns.txt](patterns.txt) | perl regular expression with optional comment block introductions (all matches will be suggested) | [candidates](https://github.com/check-spelling/check-spelling/wiki/Feature:-Suggest-patterns) | [candidate.patterns](candidate.patterns) | Patterns that might be worth adding to [patterns.txt](patterns.txt) | perl regular expression with optional comment block introductions (all matches will be suggested) | [candidates](https://github.com/check-spelling/check-spelling/wiki/Feature:-Suggest-patterns) |
[line_forbidden.patterns](line_forbidden.patterns) | Patterns to flag in checked lines | perl regular expression (order matters, first match wins) | [patterns](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-patterns) | [line_forbidden.patterns](line_forbidden.patterns) | Patterns to flag in checked lines | perl regular expression (order matters, first match wins) | [patterns](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-patterns) |
[expect.txt](expect.txt) | Expected words that aren't in the dictionary | one word per line (sorted, alphabetically) | [expect](https://github.com/check-spelling/check-spelling/wiki/Configuration#expect) | [expect.txt](expect.txt) | Expected words that aren't in the dictionary | one word per line (sorted, alphabetically) | [expect](https://github.com/check-spelling/check-spelling/wiki/Configuration#expect) |
[advice.md](advice.md) | Supplement for GitHub comment when unrecognized words are found | GitHub Markdown | [advice](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice) | [advice.md](advice.md) | Supplement for GitHub comment when unrecognized words are found | GitHub Markdown | [advice](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice) |
Note: you can replace any of these files with a directory by the same name (minus the suffix) Note: you can replace any of these files with a directory by the same name (minus the suffix)
and then include multiple files inside that directory (with that suffix) to merge multiple files together. and then include multiple files inside that directory (with that suffix) to merge multiple files together.

View File

@@ -2,30 +2,27 @@
<details><summary>If the flagged items are :exploding_head: false positives</summary> <details><summary>If the flagged items are :exploding_head: false positives</summary>
If items relate to a ... If items relate to a ...
* binary file (or some other file you wouldn't want to check at all).
- binary file (or some other file you wouldn't want to check at all).
Please add a file path to the `excludes.txt` file matching the containing file. Please add a file path to the `excludes.txt` file matching the containing file.
File paths are Perl 5 Regular Expressions - you can [test]( File paths are Perl 5 Regular Expressions - you can [test](https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files.
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files.
`^` refers to the file's path from the root of the repository, so `^README\.md$` would exclude [README.md]( `^` refers to the file's path from the root of the repository, so `^README\.md$` would exclude [README.md](../tree/HEAD/README.md) (on whichever branch you're using).
../tree/HEAD/README.md) (on whichever branch you're using).
* well-formed pattern. - well-formed pattern.
If you can write a [pattern]( If you can write a [pattern](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns) that would match it,
https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns
) that would match it,
try adding it to the `patterns.txt` file. try adding it to the `patterns.txt` file.
Patterns are Perl 5 Regular Expressions - you can [test]( Patterns are Perl 5 Regular Expressions - you can [test](https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your lines.
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your lines.
Note that patterns can't match multiline strings. Note that patterns can't match multiline strings.
</details> </details>
<!-- adoption information--> <!-- adoption information-->
:steam_locomotive: If you're seeing this message and your PR is from a branch that doesn't have check-spelling, :steam_locomotive: If you're seeing this message and your PR is from a branch that doesn't have check-spelling,
please merge to your PR's base branch to get the version configured for your repository. please merge to your PR's base branch to get the version configured for your repository.

View File

@@ -2,6 +2,7 @@ acs
Actorified Actorified
actorifiedstore actorifiedstore
actorify actorify
agentic
Aibrew Aibrew
alibaba alibaba
alrest alrest
@@ -61,10 +62,10 @@ checkresult
chibi chibi
cidranger cidranger
ckie ckie
CLAUDE
cloudflare cloudflare
Codespaces Codespaces
confd confd
connnection
containerbuild containerbuild
containerregistry containerregistry
coreutils coreutils
@@ -75,6 +76,7 @@ Cscript
daemonizing daemonizing
databento databento
dayjob dayjob
dco
DDOS DDOS
Debian Debian
debrpm debrpm
@@ -135,6 +137,7 @@ gipc
gitea gitea
GLM GLM
godotenv godotenv
goimports
goland goland
gomod gomod
goodbot goodbot
@@ -257,6 +260,7 @@ Pangu
parseable parseable
passthrough passthrough
Patreon Patreon
perplexitybot
pgrep pgrep
phrik phrik
pidfile pidfile
@@ -355,6 +359,7 @@ unbreakdocker
unifiedjs unifiedjs
unmarshal unmarshal
unparseable unparseable
updown
uvx uvx
UXP UXP
valkey valkey
@@ -367,6 +372,7 @@ VKE
vnd vnd
VPS VPS
Vultr Vultr
WAIFU
weblate weblate
webmaster webmaster
webpage webpage
@@ -404,3 +410,4 @@ Zenos
zizmor zizmor
zombocom zombocom
zos zos
zst

View File

@@ -13,7 +13,7 @@ jobs:
asset_verification: asset_verification:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with: with:
persist-credentials: false persist-credentials: false
@@ -22,12 +22,12 @@ jobs:
sudo apt-get update sudo apt-get update
sudo apt-get install -y build-essential sudo apt-get install -y build-essential
- uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with: with:
node-version: '24.11.0' node-version: "24.11.0"
- uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with: with:
go-version: '1.25.4' go-version: "1.25.4"
- name: install node deps - name: install node deps
run: | run: |

9
.github/workflows/dco-check.yaml vendored Normal file
View File

@@ -0,0 +1,9 @@
name: DCO Check
on: [pull_request]
jobs:
dco_check:
runs-on: ubuntu-latest
steps:
- uses: tisonkun/actions-dco@f1024cd563550b5632e754df11b7d30b73be54a5 # v1.1

View File

@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with: with:
fetch-tags: true fetch-tags: true
fetch-depth: 0 fetch-depth: 0
@@ -26,12 +26,12 @@ jobs:
sudo apt-get update sudo apt-get update
sudo apt-get install -y build-essential sudo apt-get install -y build-essential
- uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with: with:
node-version: '24.11.0' node-version: "24.11.0"
- uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with: with:
go-version: '1.25.4' go-version: "1.25.4"
- uses: ko-build/setup-ko@d006021bd0c28d1ce33a07e7943d48b079944c8d # v0.9 - uses: ko-build/setup-ko@d006021bd0c28d1ce33a07e7943d48b079944c8d # v0.9

View File

@@ -21,7 +21,7 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with: with:
fetch-tags: true fetch-tags: true
fetch-depth: 0 fetch-depth: 0
@@ -36,12 +36,12 @@ jobs:
run: | run: |
echo "IMAGE=ghcr.io/${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV echo "IMAGE=ghcr.io/${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV
- uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with: with:
node-version: '24.11.0' node-version: "24.11.0"
- uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with: with:
go-version: '1.25.4' go-version: "1.25.4"
- uses: ko-build/setup-ko@d006021bd0c28d1ce33a07e7943d48b079944c8d # v0.9 - uses: ko-build/setup-ko@d006021bd0c28d1ce33a07e7943d48b079944c8d # v0.9

View File

@@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with: with:
persist-credentials: false persist-credentials: false

View File

@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with: with:
persist-credentials: false persist-credentials: false

View File

@@ -13,13 +13,13 @@ jobs:
go_mod_tidy_check: go_mod_tidy_check:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with: with:
persist-credentials: false persist-credentials: false
- uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with: with:
go-version: '1.25.4' go-version: "1.25.4"
- name: Check go.mod and go.sum in main directory - name: Check go.mod and go.sum in main directory
run: | run: |

View File

@@ -15,7 +15,7 @@ jobs:
#runs-on: alrest-techarohq #runs-on: alrest-techarohq
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with: with:
persist-credentials: false persist-credentials: false
@@ -24,15 +24,15 @@ jobs:
sudo apt-get update sudo apt-get update
sudo apt-get install -y build-essential sudo apt-get install -y build-essential
- uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with: with:
node-version: '24.11.0' node-version: "24.11.0"
- uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with: with:
go-version: '1.25.4' go-version: "1.25.4"
- name: Cache playwright binaries - name: Cache playwright binaries
uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 uses: actions/cache@8b402f58fbc84540c8b491a91e594a4576fec3d7 # v5.0.2
id: playwright-cache id: playwright-cache
with: with:
path: | path: |

19
.github/workflows/lint-pr-title.yaml vendored Normal file
View File

@@ -0,0 +1,19 @@
name: "Lint PR"
on:
pull_request_target:
types:
- opened
- edited
- synchronize
jobs:
lint_pr_title:
name: Validate PR title
runs-on: ubuntu-latest
permissions:
pull-requests: read
steps:
- uses: amannn/action-semantic-pull-request@0723387faaf9b38adef4775cd42cfd5155ed6017 # v5.5.3
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -14,7 +14,7 @@ jobs:
#runs-on: alrest-techarohq #runs-on: alrest-techarohq
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with: with:
persist-credentials: false persist-credentials: false
fetch-tags: true fetch-tags: true
@@ -25,12 +25,12 @@ jobs:
sudo apt-get update sudo apt-get update
sudo apt-get install -y build-essential sudo apt-get install -y build-essential
- uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with: with:
node-version: '24.11.0' node-version: "24.11.0"
- uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with: with:
go-version: '1.25.4' go-version: "1.25.4"
- name: install node deps - name: install node deps
run: | run: |

View File

@@ -15,7 +15,7 @@ jobs:
#runs-on: alrest-techarohq #runs-on: alrest-techarohq
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with: with:
persist-credentials: false persist-credentials: false
fetch-tags: true fetch-tags: true
@@ -26,12 +26,12 @@ jobs:
sudo apt-get update sudo apt-get update
sudo apt-get install -y build-essential sudo apt-get install -y build-essential
- uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with: with:
node-version: '24.11.0' node-version: "24.11.0"
- uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with: with:
go-version: '1.25.4' go-version: "1.25.4"
- name: install node deps - name: install node deps
run: | run: |

View File

@@ -30,14 +30,14 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with: with:
persist-credentials: false persist-credentials: false
- uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with: with:
node-version: "24.11.0" node-version: "24.11.0"
- uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with: with:
go-version: "1.25.4" go-version: "1.25.4"

View File

@@ -59,16 +59,16 @@ name: Check Spelling
on: on:
push: push:
branches: branches:
- '**' - "**"
tags-ignore: tags-ignore:
- '**' - "**"
pull_request: pull_request:
branches: branches:
- '**' - "**"
types: types:
- 'opened' - "opened"
- 'reopened' - "reopened"
- 'synchronize' - "synchronize"
jobs: jobs:
spelling: spelling:

View File

@@ -18,7 +18,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with: with:
fetch-tags: true fetch-tags: true
fetch-depth: 0 fetch-depth: 0

View File

@@ -22,7 +22,7 @@ jobs:
- aarch64-16k - aarch64-16k
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with: with:
fetch-tags: true fetch-tags: true
fetch-depth: 0 fetch-depth: 0
@@ -35,9 +35,9 @@ jobs:
name: id_rsa name: id_rsa
known_hosts: ${{ secrets.CI_SSH_KNOWN_HOSTS }} known_hosts: ${{ secrets.CI_SSH_KNOWN_HOSTS }}
- uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0 - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with: with:
go-version: '1.25.4' go-version: "1.25.4"
- name: Run CI - name: Run CI
run: go run ./utils/cmd/backoff-retry bash test/ssh-ci/rigging.sh ${{ matrix.host }} run: go run ./utils/cmd/backoff-retry bash test/ssh-ci/rigging.sh ${{ matrix.host }}

View File

@@ -1,12 +1,12 @@
name: zizmor name: zizmor
on: on:
push: push:
paths: paths:
- '.github/workflows/*.ya?ml' - ".github/workflows/*.ya?ml"
pull_request: pull_request:
paths: paths:
- '.github/workflows/*.ya?ml' - ".github/workflows/*.ya?ml"
jobs: jobs:
zizmor: zizmor:
@@ -16,17 +16,17 @@ jobs:
security-events: write security-events: write
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with: with:
persist-credentials: false persist-credentials: false
- name: Install the latest version of uv - name: Install the latest version of uv
uses: astral-sh/setup-uv@681c641aba71e4a1c380be3ab5e12ad51f415867 # v7.1.6 uses: astral-sh/setup-uv@61cb8a9741eeb8a550a1b8544337180c0fc8476b # v7.2.0
- name: Run zizmor 🌈 - name: Run zizmor 🌈
run: uvx zizmor --format sarif . > results.sarif run: uvx zizmor --format sarif . > results.sarif
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload SARIF file - name: Upload SARIF file
uses: github/codeql-action/upload-sarif@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v4.31.9 uses: github/codeql-action/upload-sarif@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v4.31.9

8
.husky/commit-msg Normal file
View File

@@ -0,0 +1,8 @@
npx --no-install commitlint --edit "$1"
# Check if commit message contains Signed-off-by line
if ! grep -q "^Signed-off-by:" "$1"; then
echo "Commit message must contain a 'Signed-off-by:' line."
echo "Please use 'git commit --signoff' or add a Signed-off-by line to your commit message."
exit 1
fi

2
.husky/pre-commit Normal file
View File

@@ -0,0 +1,2 @@
npm run lint
npm run test

View File

@@ -1,13 +1,13 @@
defaultBaseImage: cgr.dev/chainguard/static defaultBaseImage: cgr.dev/chainguard/static
defaultPlatforms: defaultPlatforms:
- linux/arm64 - linux/arm64
- linux/amd64 - linux/amd64
- linux/arm/v7 - linux/arm/v7
builds: builds:
- id: anubis - id: anubis
main: ./cmd/anubis main: ./cmd/anubis
ldflags: ldflags:
- -s -w - -s -w
- -extldflags "-static" - -extldflags "-static"
- -X github.com/TecharoHQ/anubis.Version={{.Env.VERSION}} - -X github.com/TecharoHQ/anubis.Version={{.Env.VERSION}}

4
.prettierignore Normal file
View File

@@ -0,0 +1,4 @@
lib/config/testdata/bad/*
*.inc
AGENTS.md
CLAUDE.md

View File

@@ -8,4 +8,4 @@
"redhat.vscode-yaml", "redhat.vscode-yaml",
"streetsidesoftware.code-spell-checker" "streetsidesoftware.code-spell-checker"
] ]
} }

2
.vscode/launch.json vendored
View File

@@ -24,4 +24,4 @@
"type": "node-terminal" "type": "node-terminal"
} }
] ]
} }

75
AGENTS.md Normal file
View File

@@ -0,0 +1,75 @@
# Agent instructions
Primary agent documentation is in `CONTRIBUTING.md`. You MUST read this file before proceeding.
## Useful Commands
```shell
npm ci # install node dependencies
npm run assets # build JS/CSS (required before any Go build/test)
npm run build # assets + go build -> ./var/anubis
npm run dev # assets + run locally with --use-remote-address
```
## Testing
```shell
npm run test
```
## Linting
```shell
go vet ./...
go tool staticcheck ./...
go tool govulncheck ./...
```
## Commit Messages
Commit messages follow the [**Conventional Commits**](https://www.conventionalcommits.org/en/v1.0.0/) format:
```text
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
```
**Types**: `feat`, `fix`, `docs`, `style`, `refactor`, `perf`, `test`, `build`, `ci`, `chore`, `revert`
- Add `!` after type/scope for breaking changes or include `BREAKING CHANGE:` in the footer.
- Keep descriptions concise, imperative, lowercase, and without a trailing period.
- Reference issues/PRs in the footer when applicable.
- **ALL git commits MUST be made with `--signoff`.** This is mandatory.
### Attribution Requirements
AI agents must disclose what tool and model they are using in the "Assisted-by" commit footer:
```text
Assisted-by: [Model Name] via [Tool Name]
```
Example:
```text
Assisted-by: GLM 4.6 via Claude Code
```
## PR Checklist
- Add description of changes to `[Unreleased]` in `docs/docs/CHANGELOG.md`.
- Add test cases for bug fixes and behavior changes.
- Run integration tests: `npm run test:integration`.
- All commits must have verified (signed) signatures.
## Key Conventions
- **Security-first**: This is security software. Code reviews are strict. Always add tests for bug fixes. Consider adversarial inputs.
- **Configuration**: YAML-based policy files. Config structs validate via `Valid() error` methods returning sentinel errors.
- **Store interface**: `lib/store.Interface` abstracts key-value storage.
- **Environment variables**: Parsed from flags via `flagenv`. Use `.env` files locally (loaded by `godotenv/autoload`). Never commit `.env` files.
- **Assets must be built first**: JS/CSS assets are embedded into the Go binary. Always run `npm run assets` before `go test` or `go build`.
- **CEL expressions**: Policy rules support CEL (Common Expression Language) expressions for advanced matching. See `lib/policy/expressions/`.

2
CLAUDE.md Normal file
View File

@@ -0,0 +1,2 @@
@AGENTS.md
@CONTRIBUTING.md

144
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,144 @@
# Contributing to Anubis
Anubis is a Web AI Firewall Utility (WAIFU) written in Go. It uses sha256 proof-of-work challenges to protect upstream HTTP resources from scraper bots. This is security software -- correctness matters.
## Build & Run
Prerequisites: Go 1.24+, Node.js (any supported version), esbuild, gzip, zstd, brotli. Install all with `brew bundle` if you are using Homebrew.
```shell
npm ci # install node dependencies
npm run assets # build JS/CSS (required before any Go build/test)
npm run build # assets + go build -> ./var/anubis
npm run dev # assets + run locally with --use-remote-address
```
## Testing
```shell
# Run all unit tests (assets must be built first)
npm run test # or: make test
# Run a single test by name
go test -run TestClampIP ./internal/
# Run a single test file's package
go test ./lib/config/
# Run tests with verbose output
go test -v -run TestBotValid ./lib/config/
```
### Smoke tests
The `tests` folder contains "smoke tests" that are intended to set up Anubis in production-adjacent settings and testing it against real infrastructure tools. A smoke test is a folder with `test.sh` that sets up infrastructure, validates the behaviour, and then tears it down. Smoke tests are run in GitHub actions with `.github/workflows/smoke-tests.yaml`.
## Linting
```shell
go vet ./...
go tool staticcheck ./...
go tool govulncheck ./...
```
## Code Generation
The project uses `go generate` for templ templates and stringer. Always run `npm run generate` (or `make assets`) before building or testing. Generated files include:
- `web/*.templ` -> templ-generated Go code
- `web/static/` -> bundled/minified JS and CSS (with .gz, .zst, .br variants)
## Project Layout
Important folders:
- `cmd/anubis`: Main entrypoint for the project. This is the program that runs on servers.
- `lib/*`: The core library for Anubis and all of its features. This is internal code that is made public for ease of downstream consumption. No API stability is guaranteed. Use at your own risk.
- `internal/*`: Actual internal code that is private to the implementation of Anubis. If you need to use a package in this, please copy it out and manually vendor it in your own project.
- `test/*` Smoke tests (see dedicated section for details).
- `web`: Frontend HTML templates.
- `xess`: Frontend CSS framework and build logic.
## Code Style
### Go
This project follows the idioms of the Go standard library. Generally follow the patterns that upstream Go uses, including:
- Prefer packages from the standard library unless there is no other option.
- Use package import aliases only when package names collide.
- Use `goimports` to format code. Run with `npm run format`.
- Use sentinel errors as package-level variables prefixed with `Err` (such as `ErrBotMustHaveName`). Wrap with `fmt.Errorf("package: small message giving context: %w", err)`.
- Use `log/slog` for structured logging. Pass loggers as arguments to functions. Use `lg.With` to preload with context. Prefer using `slog.Debug` unless you absolutely need to report messages to users, some users have magical thinking about log verbosity.
- Name PublicFunctionsAndTypes in PascalCase. Name privateFunctionsAndTypes in camelCase.
- Acronyms stay uppercase (`URL`, `HTTP`, `IP`, `DNS`, etc.)
- Enumerations should use strong types with validation logic for parsing remote input.
- Be conservative in what you send but liberal in what you accept.
- Anything reading configuration values should use both `json` and `yaml` struct tags. Use pointer values for optional configuration values.
- Use [table-driven tests](https://go.dev/wiki/TableDrivenTests) when writing test code.
- Use [`t.Helper()`](https://pkg.go.dev/testing#T.Helper) in helper code (setup/teardown scaffolding).
- Use [`t.Cleanup()`](https://pkg.go.dev/testing#T.Cleanup) to tear down per-test or per-suite scaffolding.
- Use [`errors.Is`](https://pkg.go.dev/errors#Is) for validating function results against sentinel errors.
- Prefer same-package tests over black-box tests (`_test` packages).
### JavaScript / TypeScript
- Source lives in `web/js/`. Built with esbuild, bundled and minified.
- Uses Preact (not React).
- No linter config. Keep functions small. Use `const` by default.
### Templ Templates
Anubis uses [Templ](https://templ.guide) for generating HTML on the server.
- `.templ` files in `web/` generate Go code. Run `go generate ./...` (or `npm run assets`) after modifying them.
- Templates receive typed Go parameters. Keep logic in Go, not templates.
## Commit Messages
Commit messages follow the [**Conventional Commits**](https://www.conventionalcommits.org/en/v1.0.0/) format:
```text
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
```
**Types**: `feat`, `fix`, `docs`, `style`, `refactor`, `perf`, `test`, `build`, `ci`, `chore`, `revert`
- Add `!` after type/scope for breaking changes or include `BREAKING CHANGE:` in the footer.
- Keep descriptions concise, imperative, lowercase, and without a trailing period.
- Reference issues/PRs in the footer when applicable.
- **ALL git commits MUST be made with `--signoff`.** This is mandatory.
### Attribution Requirements
AI agents must disclose what tool and model they are using in the "Assisted-by" commit footer:
```text
Assisted-by: [Model Name] via [Tool Name]
```
Example:
```text
Assisted-by: GLM 4.6 via Claude Code
```
## PR Checklist
- Add description of changes to `[Unreleased]` in `docs/docs/CHANGELOG.md`.
- Add test cases for bug fixes and behavior changes.
- Run integration tests: `npm run test:integration`.
- All commits must have verified (signed) signatures.
## Key Conventions
- **Security-first**: This is security software. Code reviews are strict. Always add tests for bug fixes. Consider adversarial inputs.
- **Configuration**: YAML-based policy files. Config structs validate via `Valid() error` methods returning sentinel errors.
- **Store interface**: `lib/store.Interface` abstracts key-value storage.
- **Environment variables**: Parsed from flags via `flagenv`. Use `.env` files locally (loaded by `godotenv/autoload`). Never commit `.env` files.
- **Assets must be built first**: JS/CSS assets are embedded into the Go binary. Always run `npm run assets` before `go test` or `go build`.
- **CEL expressions**: Policy rules support CEL (Common Expression Language) expressions for advanced matching. See `lib/policy/expressions/`.

View File

@@ -159,5 +159,8 @@ func run(command string) (string, error) {
} }
func setOutput(key, val string) { func setOutput(key, val string) {
fmt.Printf("::set-output name=%s::%s\n", key, val) github_output := os.Getenv("GITHUB_OUTPUT")
f, _ := os.OpenFile(github_output, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
fmt.Fprintf(f, "%s=%s\n", key, val)
f.Close()
} }

View File

@@ -25,6 +25,6 @@
- action: CHALLENGE - action: CHALLENGE
expression: expression:
all: all:
- userAgent.contains("Googlebot") - userAgent.contains("Googlebot")
- path.startsWith("/search") - path.startsWith("/search")
name: robots-txt-policy-disallow-7 name: robots-txt-policy-disallow-7

View File

@@ -20,8 +20,8 @@
- action: CHALLENGE - action: CHALLENGE
expression: expression:
all: all:
- userAgent.contains("Googlebot") - userAgent.contains("Googlebot")
- path.startsWith("/search/") - path.startsWith("/search/")
name: robots-txt-policy-disallow-6 name: robots-txt-policy-disallow-6
- action: WEIGH - action: WEIGH
expression: userAgent.contains("Bingbot") expression: userAgent.contains("Bingbot")
@@ -31,14 +31,14 @@
- action: CHALLENGE - action: CHALLENGE
expression: expression:
all: all:
- userAgent.contains("Bingbot") - userAgent.contains("Bingbot")
- path.startsWith("/search/") - path.startsWith("/search/")
name: robots-txt-policy-disallow-8 name: robots-txt-policy-disallow-8
- action: CHALLENGE - action: CHALLENGE
expression: expression:
all: all:
- userAgent.contains("Bingbot") - userAgent.contains("Bingbot")
- path.startsWith("/admin/") - path.startsWith("/admin/")
name: robots-txt-policy-disallow-9 name: robots-txt-policy-disallow-9
- action: DENY - action: DENY
expression: userAgent.contains("BadBot") expression: userAgent.contains("BadBot")
@@ -54,18 +54,18 @@
- action: CHALLENGE - action: CHALLENGE
expression: expression:
all: all:
- userAgent.contains("TestBot") - userAgent.contains("TestBot")
- path.matches("^/.*/admin") - path.matches("^/.*/admin")
name: robots-txt-policy-disallow-13 name: robots-txt-policy-disallow-13
- action: CHALLENGE - action: CHALLENGE
expression: expression:
all: all:
- userAgent.contains("TestBot") - userAgent.contains("TestBot")
- path.matches("^/temp.*\\.html") - path.matches("^/temp.*\\.html")
name: robots-txt-policy-disallow-14 name: robots-txt-policy-disallow-14
- action: CHALLENGE - action: CHALLENGE
expression: expression:
all: all:
- userAgent.contains("TestBot") - userAgent.contains("TestBot")
- path.matches("^/file.\\.log") - path.matches("^/file.\\.log")
name: robots-txt-policy-disallow-15 name: robots-txt-policy-disallow-15

View File

@@ -9,39 +9,39 @@
- action: DENY - action: DENY
expression: expression:
any: any:
- userAgent.contains("BadBot") - userAgent.contains("BadBot")
- userAgent.contains("SpamBot") - userAgent.contains("SpamBot")
- userAgent.contains("EvilBot") - userAgent.contains("EvilBot")
name: robots-txt-policy-blacklist-3 name: robots-txt-policy-blacklist-3
- action: CHALLENGE - action: CHALLENGE
expression: expression:
all: all:
- userAgent.contains("GoodBot") - userAgent.contains("GoodBot")
- path.startsWith("/private") - path.startsWith("/private")
name: robots-txt-policy-disallow-4 name: robots-txt-policy-disallow-4
- action: WEIGH - action: WEIGH
expression: expression:
any: any:
- userAgent.contains("SlowBot1") - userAgent.contains("SlowBot1")
- userAgent.contains("SlowBot2") - userAgent.contains("SlowBot2")
name: robots-txt-policy-crawl-delay-5 name: robots-txt-policy-crawl-delay-5
weight: weight:
adjust: 3 adjust: 3
- action: CHALLENGE - action: CHALLENGE
expression: expression:
all: all:
- userAgent.contains("SearchBot1") - userAgent.contains("SearchBot1")
- path.startsWith("/search") - path.startsWith("/search")
name: robots-txt-policy-disallow-7 name: robots-txt-policy-disallow-7
- action: CHALLENGE - action: CHALLENGE
expression: expression:
all: all:
- userAgent.contains("SearchBot2") - userAgent.contains("SearchBot2")
- path.startsWith("/search") - path.startsWith("/search")
name: robots-txt-policy-disallow-8 name: robots-txt-policy-disallow-8
- action: CHALLENGE - action: CHALLENGE
expression: expression:
all: all:
- userAgent.contains("SearchBot3") - userAgent.contains("SearchBot3")
- path.startsWith("/search") - path.startsWith("/search")
name: robots-txt-policy-disallow-9 name: robots-txt-policy-disallow-9

View File

@@ -1 +1 @@
[] []

View File

@@ -9,4 +9,4 @@
"name": "robots-txt-policy-disallow-2", "name": "robots-txt-policy-disallow-2",
"action": "CHALLENGE" "action": "CHALLENGE"
} }
] ]

View File

@@ -2,5 +2,5 @@
action: ALLOW action: ALLOW
expression: expression:
all: all:
- '!(method == "HEAD" || method == "GET")' - '!(method == "HEAD" || method == "GET")'
- path.startsWith("/api/") - path.startsWith("/api/")

View File

@@ -4,4 +4,4 @@
path_regex: ^/[.A-Za-z0-9_-]{1,256}?[./A-Za-z0-9_-]*\.atom$ path_regex: ^/[.A-Za-z0-9_-]{1,256}?[./A-Za-z0-9_-]*\.atom$
- name: gitea-feed-rss - name: gitea-feed-rss
action: ALLOW action: ALLOW
path_regex: ^/[.A-Za-z0-9_-]{1,256}?[./A-Za-z0-9_-]*\.rss$ path_regex: ^/[.A-Za-z0-9_-]{1,256}?[./A-Za-z0-9_-]*\.rss$

View File

@@ -3,6 +3,6 @@
- name: qualys-ssl-labs - name: qualys-ssl-labs
action: ALLOW action: ALLOW
remote_addresses: remote_addresses:
- 69.67.183.0/24 - 69.67.183.0/24
- 2600:C02:1020:4202::/64 - 2600:C02:1020:4202::/64
- 2602:fdaa:c6:2::/64 - 2602:fdaa:c6:2::/64

View File

@@ -5,5 +5,5 @@
- name: searx-checker - name: searx-checker
action: ALLOW action: ALLOW
remote_addresses: remote_addresses:
- 167.235.158.251/32 - 167.235.158.251/32
- 2a01:4f8:1c1c:8fc2::1/128 - 2a01:4f8:1c1c:8fc2::1/128

View File

@@ -6,4 +6,4 @@
action: DENY action: DENY
- name: headless-chromium - name: headless-chromium
user_agent_regex: HeadlessChromium user_agent_regex: HeadlessChromium
action: DENY action: DENY

View File

@@ -3,7 +3,7 @@
action: ALLOW action: ALLOW
expression: expression:
all: all:
- remoteAddress == "159.69.213.214" || remoteAddress == "2a01:4f8:c2c:7bf4::1" - remoteAddress == "159.69.213.214" || remoteAddress == "2a01:4f8:c2c:7bf4::1"
- userAgent == "Mozilla/5.0 (compatible; utils.web Limnoria module)" - userAgent == "Mozilla/5.0 (compatible; utils.web Limnoria module)"
- '"X-Http-Version" in headers' - '"X-Http-Version" in headers'
- headers["X-Http-Version"] == "HTTP/1.1" - headers["X-Http-Version"] == "HTTP/1.1"

View File

@@ -3,7 +3,7 @@
action: ALLOW action: ALLOW
expression: expression:
all: all:
- remoteAddress == "45.76.166.57" - remoteAddress == "45.76.166.57"
- userAgent == "Mozilla/5.0 (Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0" - userAgent == "Mozilla/5.0 (Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0"
- '"X-Http-Version" in headers' - '"X-Http-Version" in headers'
- headers["X-Http-Version"] == "HTTP/1.1" - headers["X-Http-Version"] == "HTTP/1.1"

View File

@@ -1,3 +1,3 @@
- name: us-artificial-intelligence-scraper - name: us-artificial-intelligence-scraper
user_agent_regex: \+https\://github\.com/US-Artificial-Intelligence/scraper user_agent_regex: \+https\://github\.com/US-Artificial-Intelligence/scraper
action: DENY action: DENY

View File

@@ -2,6 +2,6 @@
action: ALLOW action: ALLOW
expression: expression:
all: all:
- userAgent.startsWith("Go-http-client/") - userAgent.startsWith("Go-http-client/")
- '"go-get" in query' - '"go-get" in query'
- query["go-get"] == "1" - query["go-get"] == "1"

View File

@@ -4,7 +4,4 @@
user_agent_regex: MistralAI-User/.+; \+https\://docs\.mistral\.ai/robots user_agent_regex: MistralAI-User/.+; \+https\://docs\.mistral\.ai/robots
action: ALLOW action: ALLOW
# https://mistral.ai/mistralai-user-ips.json # https://mistral.ai/mistralai-user-ips.json
remote_addresses: [ remote_addresses: ["20.240.160.161/32", "20.240.160.1/32"]
"20.240.160.161/32",
"20.240.160.1/32",
]

View File

@@ -5,89 +5,90 @@
action: ALLOW action: ALLOW
# https://openai.com/chatgpt-user.json # https://openai.com/chatgpt-user.json
# curl 'https://openai.com/chatgpt-user.json' | jq '.prefixes.[].ipv4Prefix' | sed 's/$/,/' # curl 'https://openai.com/chatgpt-user.json' | jq '.prefixes.[].ipv4Prefix' | sed 's/$/,/'
remote_addresses: [ remote_addresses:
"13.65.138.112/28", [
"23.98.179.16/28", "13.65.138.112/28",
"13.65.138.96/28", "23.98.179.16/28",
"172.183.222.128/28", "13.65.138.96/28",
"20.102.212.144/28", "172.183.222.128/28",
"40.116.73.208/28", "20.102.212.144/28",
"172.183.143.224/28", "40.116.73.208/28",
"52.190.190.16/28", "172.183.143.224/28",
"13.83.237.176/28", "52.190.190.16/28",
"51.8.155.64/28", "13.83.237.176/28",
"74.249.86.176/28", "51.8.155.64/28",
"51.8.155.48/28", "74.249.86.176/28",
"20.55.229.144/28", "51.8.155.48/28",
"135.237.131.208/28", "20.55.229.144/28",
"135.237.133.48/28", "135.237.131.208/28",
"51.8.155.112/28", "135.237.133.48/28",
"135.237.133.112/28", "51.8.155.112/28",
"52.159.249.96/28", "135.237.133.112/28",
"52.190.137.16/28", "52.159.249.96/28",
"52.255.111.112/28", "52.190.137.16/28",
"40.84.181.32/28", "52.255.111.112/28",
"172.178.141.112/28", "40.84.181.32/28",
"52.190.142.64/28", "172.178.141.112/28",
"172.178.140.144/28", "52.190.142.64/28",
"52.190.137.144/28", "172.178.140.144/28",
"172.178.141.128/28", "52.190.137.144/28",
"57.154.187.32/28", "172.178.141.128/28",
"4.196.118.112/28", "57.154.187.32/28",
"20.193.50.32/28", "4.196.118.112/28",
"20.215.188.192/28", "20.193.50.32/28",
"20.215.214.16/28", "20.215.188.192/28",
"4.197.22.112/28", "20.215.214.16/28",
"4.197.115.112/28", "4.197.22.112/28",
"172.213.21.16/28", "4.197.115.112/28",
"172.213.11.144/28", "172.213.21.16/28",
"172.213.12.112/28", "172.213.11.144/28",
"172.213.21.144/28", "172.213.12.112/28",
"20.90.7.144/28", "172.213.21.144/28",
"57.154.175.0/28", "20.90.7.144/28",
"57.154.174.112/28", "57.154.175.0/28",
"52.236.94.144/28", "57.154.174.112/28",
"137.135.191.176/28", "52.236.94.144/28",
"23.98.186.192/28", "137.135.191.176/28",
"23.98.186.96/28", "23.98.186.192/28",
"23.98.186.176/28", "23.98.186.96/28",
"23.98.186.64/28", "23.98.186.176/28",
"68.221.67.192/28", "23.98.186.64/28",
"68.221.67.160/28", "68.221.67.192/28",
"13.83.167.128/28", "68.221.67.160/28",
"20.228.106.176/28", "13.83.167.128/28",
"52.159.227.32/28", "20.228.106.176/28",
"68.220.57.64/28", "52.159.227.32/28",
"172.213.21.112/28", "68.220.57.64/28",
"68.221.67.224/28", "172.213.21.112/28",
"68.221.75.16/28", "68.221.67.224/28",
"20.97.189.96/28", "68.221.75.16/28",
"52.252.113.240/28", "20.97.189.96/28",
"52.230.163.32/28", "52.252.113.240/28",
"172.212.159.64/28", "52.230.163.32/28",
"52.255.111.80/28", "172.212.159.64/28",
"52.255.111.0/28", "52.255.111.80/28",
"4.151.241.240/28", "52.255.111.0/28",
"52.255.111.32/28", "4.151.241.240/28",
"52.255.111.48/28", "52.255.111.32/28",
"52.255.111.16/28", "52.255.111.48/28",
"52.230.164.176/28", "52.255.111.16/28",
"52.176.139.176/28", "52.230.164.176/28",
"52.173.234.16/28", "52.176.139.176/28",
"4.151.71.176/28", "52.173.234.16/28",
"4.151.119.48/28", "4.151.71.176/28",
"52.255.109.112/28", "4.151.119.48/28",
"52.255.109.80/28", "52.255.109.112/28",
"20.161.75.208/28", "52.255.109.80/28",
"68.154.28.96/28", "20.161.75.208/28",
"52.255.109.128/28", "68.154.28.96/28",
"52.225.75.208/28", "52.255.109.128/28",
"52.190.139.48/28", "52.225.75.208/28",
"68.221.67.240/28", "52.190.139.48/28",
"52.156.77.144/28", "68.221.67.240/28",
"52.148.129.32/28", "52.156.77.144/28",
"40.84.221.208/28", "52.148.129.32/28",
"104.210.139.224/28", "40.84.221.208/28",
"40.84.221.224/28", "104.210.139.224/28",
"104.210.139.192/28", "40.84.221.224/28",
] "104.210.139.192/28",
]

View File

@@ -4,9 +4,5 @@
user_agent_regex: Perplexity-User/.+; \+https\://perplexity\.ai/perplexity-user user_agent_regex: Perplexity-User/.+; \+https\://perplexity\.ai/perplexity-user
action: ALLOW action: ALLOW
# https://www.perplexity.com/perplexity-user.json # https://www.perplexity.com/perplexity-user.json
remote_addresses: [ remote_addresses:
"44.208.221.197/32", ["44.208.221.197/32", "34.193.163.52/32", "18.97.21.0/30", "18.97.43.80/29"]
"34.193.163.52/32",
"18.97.21.0/30",
"18.97.43.80/29",
]

View File

@@ -1,6 +1,6 @@
- name: telegrambot - name: telegrambot
action: ALLOW action: ALLOW
expression: expression:
all: all:
- userAgent.matches("TelegramBot") - userAgent.matches("TelegramBot")
- verifyFCrDNS(remoteAddress, "ptr\\.telegram\\.org$") - verifyFCrDNS(remoteAddress, "ptr\\.telegram\\.org$")

View File

@@ -1,6 +1,6 @@
- name: vkbot - name: vkbot
action: ALLOW action: ALLOW
expression: expression:
all: all:
- userAgent.matches("vkShare[^+]+\\+http\\://vk\\.com/dev/Share") - userAgent.matches("vkShare[^+]+\\+http\\://vk\\.com/dev/Share")
- verifyFCrDNS(remoteAddress, "^snipster\\d+\\.go\\.mail\\.ru$") - verifyFCrDNS(remoteAddress, "^snipster\\d+\\.go\\.mail\\.ru$")

View File

@@ -2,5 +2,5 @@
action: ALLOW action: ALLOW
expression: expression:
all: all:
- '!(method == "HEAD" || method == "GET")' - '!(method == "HEAD" || method == "GET")'
- path.startsWith("/api/") - path.startsWith("/api/")

View File

@@ -4,4 +4,4 @@
all: all:
- '"Accept" in headers' - '"Accept" in headers'
- 'headers["Accept"] == "application/json"' - 'headers["Accept"] == "application/json"'
- 'path.startsWith("/api/")' - 'path.startsWith("/api/")'

View File

@@ -1,3 +1,3 @@
- name: no-user-agent-string - name: no-user-agent-string
action: DENY action: DENY
expression: userAgent == "" expression: userAgent == ""

View File

@@ -4,17 +4,18 @@
user_agent_regex: Applebot user_agent_regex: Applebot
action: ALLOW action: ALLOW
# https://search.developer.apple.com/applebot.json # https://search.developer.apple.com/applebot.json
remote_addresses: [ remote_addresses:
"17.241.208.160/27", [
"17.241.193.160/27", "17.241.208.160/27",
"17.241.200.160/27", "17.241.193.160/27",
"17.22.237.0/24", "17.241.200.160/27",
"17.22.245.0/24", "17.22.237.0/24",
"17.22.253.0/24", "17.22.245.0/24",
"17.241.75.0/24", "17.22.253.0/24",
"17.241.219.0/24", "17.241.75.0/24",
"17.241.227.0/24", "17.241.219.0/24",
"17.246.15.0/24", "17.241.227.0/24",
"17.246.19.0/24", "17.246.15.0/24",
"17.246.23.0/24", "17.246.19.0/24",
] "17.246.23.0/24",
]

View File

@@ -2,33 +2,34 @@
user_agent_regex: \+http\://www\.bing\.com/bingbot\.htm user_agent_regex: \+http\://www\.bing\.com/bingbot\.htm
action: ALLOW action: ALLOW
# https://www.bing.com/toolbox/bingbot.json # https://www.bing.com/toolbox/bingbot.json
remote_addresses: [ remote_addresses:
"157.55.39.0/24", [
"207.46.13.0/24", "157.55.39.0/24",
"40.77.167.0/24", "207.46.13.0/24",
"13.66.139.0/24", "40.77.167.0/24",
"13.66.144.0/24", "13.66.139.0/24",
"52.167.144.0/24", "13.66.144.0/24",
"13.67.10.16/28", "52.167.144.0/24",
"13.69.66.240/28", "13.67.10.16/28",
"13.71.172.224/28", "13.69.66.240/28",
"139.217.52.0/28", "13.71.172.224/28",
"191.233.204.224/28", "139.217.52.0/28",
"20.36.108.32/28", "191.233.204.224/28",
"20.43.120.16/28", "20.36.108.32/28",
"40.79.131.208/28", "20.43.120.16/28",
"40.79.186.176/28", "40.79.131.208/28",
"52.231.148.0/28", "40.79.186.176/28",
"20.79.107.240/28", "52.231.148.0/28",
"51.105.67.0/28", "20.79.107.240/28",
"20.125.163.80/28", "51.105.67.0/28",
"40.77.188.0/22", "20.125.163.80/28",
"65.55.210.0/24", "40.77.188.0/22",
"199.30.24.0/23", "65.55.210.0/24",
"40.77.202.0/24", "199.30.24.0/23",
"40.77.139.0/25", "40.77.202.0/24",
"20.74.197.0/28", "40.77.139.0/25",
"20.15.133.160/27", "20.74.197.0/28",
"40.77.177.0/24", "20.15.133.160/27",
"40.77.178.0/23" "40.77.177.0/24",
] "40.77.178.0/23",
]

View File

@@ -2,274 +2,275 @@
user_agent_regex: DuckDuckBot/1\.1; \(\+http\://duckduckgo\.com/duckduckbot\.html\) user_agent_regex: DuckDuckBot/1\.1; \(\+http\://duckduckgo\.com/duckduckbot\.html\)
action: ALLOW action: ALLOW
# https://duckduckgo.com/duckduckgo-help-pages/results/duckduckbot # https://duckduckgo.com/duckduckgo-help-pages/results/duckduckbot
remote_addresses: [ remote_addresses:
"57.152.72.128/32", [
"51.8.253.152/32", "57.152.72.128/32",
"40.80.242.63/32", "51.8.253.152/32",
"20.12.141.99/32", "40.80.242.63/32",
"20.49.136.28/32", "20.12.141.99/32",
"51.116.131.221/32", "20.49.136.28/32",
"51.107.40.209/32", "51.116.131.221/32",
"20.40.133.240/32", "51.107.40.209/32",
"20.50.168.91/32", "20.40.133.240/32",
"51.120.48.122/32", "20.50.168.91/32",
"20.193.45.113/32", "51.120.48.122/32",
"40.76.173.151/32", "20.193.45.113/32",
"40.76.163.7/32", "40.76.173.151/32",
"20.185.79.47/32", "40.76.163.7/32",
"52.142.26.175/32", "20.185.79.47/32",
"20.185.79.15/32", "52.142.26.175/32",
"52.142.24.149/32", "20.185.79.15/32",
"40.76.162.208/32", "52.142.24.149/32",
"40.76.163.23/32", "40.76.162.208/32",
"40.76.162.191/32", "40.76.163.23/32",
"40.76.162.247/32", "40.76.162.191/32",
"40.88.21.235/32", "40.76.162.247/32",
"20.191.45.212/32", "40.88.21.235/32",
"52.146.59.12/32", "20.191.45.212/32",
"52.146.59.156/32", "52.146.59.12/32",
"52.146.59.154/32", "52.146.59.156/32",
"52.146.58.236/32", "52.146.59.154/32",
"20.62.224.44/32", "52.146.58.236/32",
"51.104.180.53/32", "20.62.224.44/32",
"51.104.180.47/32", "51.104.180.53/32",
"51.104.180.26/32", "51.104.180.47/32",
"51.104.146.225/32", "51.104.180.26/32",
"51.104.146.235/32", "51.104.146.225/32",
"20.73.202.147/32", "51.104.146.235/32",
"20.73.132.240/32", "20.73.202.147/32",
"20.71.12.143/32", "20.73.132.240/32",
"20.56.197.58/32", "20.71.12.143/32",
"20.56.197.63/32", "20.56.197.58/32",
"20.43.150.93/32", "20.56.197.63/32",
"20.43.150.85/32", "20.43.150.93/32",
"20.44.222.1/32", "20.43.150.85/32",
"40.89.243.175/32", "20.44.222.1/32",
"13.89.106.77/32", "40.89.243.175/32",
"52.143.242.6/32", "13.89.106.77/32",
"52.143.241.111/32", "52.143.242.6/32",
"52.154.60.82/32", "52.143.241.111/32",
"20.197.209.11/32", "52.154.60.82/32",
"20.197.209.27/32", "20.197.209.11/32",
"20.226.133.105/32", "20.197.209.27/32",
"191.234.216.4/32", "20.226.133.105/32",
"191.234.216.178/32", "191.234.216.4/32",
"20.53.92.211/32", "191.234.216.178/32",
"20.53.91.2/32", "20.53.92.211/32",
"20.207.99.197/32", "20.53.91.2/32",
"20.207.97.190/32", "20.207.99.197/32",
"40.81.250.205/32", "20.207.97.190/32",
"40.64.106.11/32", "40.81.250.205/32",
"40.64.105.247/32", "40.64.106.11/32",
"20.72.242.93/32", "40.64.105.247/32",
"20.99.255.235/32", "20.72.242.93/32",
"20.113.3.121/32", "20.99.255.235/32",
"52.224.16.221/32", "20.113.3.121/32",
"52.224.21.53/32", "52.224.16.221/32",
"52.224.20.204/32", "52.224.21.53/32",
"52.224.21.19/32", "52.224.20.204/32",
"52.224.20.249/32", "52.224.21.19/32",
"52.224.20.203/32", "52.224.20.249/32",
"52.224.20.190/32", "52.224.20.203/32",
"52.224.16.229/32", "52.224.20.190/32",
"52.224.21.20/32", "52.224.16.229/32",
"52.146.63.80/32", "52.224.21.20/32",
"52.224.20.227/32", "52.146.63.80/32",
"52.224.20.193/32", "52.224.20.227/32",
"52.190.37.160/32", "52.224.20.193/32",
"52.224.21.23/32", "52.190.37.160/32",
"52.224.20.223/32", "52.224.21.23/32",
"52.224.20.181/32", "52.224.20.223/32",
"52.224.21.49/32", "52.224.20.181/32",
"52.224.21.55/32", "52.224.21.49/32",
"52.224.21.61/32", "52.224.21.55/32",
"52.224.19.152/32", "52.224.21.61/32",
"52.224.20.186/32", "52.224.19.152/32",
"52.224.21.27/32", "52.224.20.186/32",
"52.224.21.51/32", "52.224.21.27/32",
"52.224.20.174/32", "52.224.21.51/32",
"52.224.21.4/32", "52.224.20.174/32",
"51.104.164.109/32", "52.224.21.4/32",
"51.104.167.71/32", "51.104.164.109/32",
"51.104.160.177/32", "51.104.167.71/32",
"51.104.162.149/32", "51.104.160.177/32",
"51.104.167.95/32", "51.104.162.149/32",
"51.104.167.54/32", "51.104.167.95/32",
"51.104.166.111/32", "51.104.167.54/32",
"51.104.167.88/32", "51.104.166.111/32",
"51.104.161.32/32", "51.104.167.88/32",
"51.104.163.250/32", "51.104.161.32/32",
"51.104.164.189/32", "51.104.163.250/32",
"51.104.167.19/32", "51.104.164.189/32",
"51.104.160.167/32", "51.104.167.19/32",
"51.104.167.110/32", "51.104.160.167/32",
"20.191.44.119/32", "51.104.167.110/32",
"51.104.167.104/32", "20.191.44.119/32",
"20.191.44.234/32", "51.104.167.104/32",
"51.104.164.215/32", "20.191.44.234/32",
"51.104.167.52/32", "51.104.164.215/32",
"20.191.44.22/32", "51.104.167.52/32",
"51.104.167.87/32", "20.191.44.22/32",
"51.104.167.96/32", "51.104.167.87/32",
"20.191.44.16/32", "51.104.167.96/32",
"51.104.167.61/32", "20.191.44.16/32",
"51.104.164.147/32", "51.104.167.61/32",
"20.50.48.159/32", "51.104.164.147/32",
"40.114.182.172/32", "20.50.48.159/32",
"20.50.50.130/32", "40.114.182.172/32",
"20.50.50.163/32", "20.50.50.130/32",
"20.50.50.46/32", "20.50.50.163/32",
"40.114.182.153/32", "20.50.50.46/32",
"20.50.50.118/32", "40.114.182.153/32",
"20.50.49.55/32", "20.50.50.118/32",
"20.50.49.25/32", "20.50.49.55/32",
"40.114.183.251/32", "20.50.49.25/32",
"20.50.50.123/32", "40.114.183.251/32",
"20.50.49.237/32", "20.50.50.123/32",
"20.50.48.192/32", "20.50.49.237/32",
"20.50.50.134/32", "20.50.48.192/32",
"51.138.90.233/32", "20.50.50.134/32",
"40.114.183.196/32", "51.138.90.233/32",
"20.50.50.146/32", "40.114.183.196/32",
"40.114.183.88/32", "20.50.50.146/32",
"20.50.50.145/32", "40.114.183.88/32",
"20.50.50.121/32", "20.50.50.145/32",
"20.50.49.40/32", "20.50.50.121/32",
"51.138.90.206/32", "20.50.49.40/32",
"40.114.182.45/32", "51.138.90.206/32",
"51.138.90.161/32", "40.114.182.45/32",
"20.50.49.0/32", "51.138.90.161/32",
"40.119.232.215/32", "20.50.49.0/32",
"104.43.55.167/32", "40.119.232.215/32",
"40.119.232.251/32", "104.43.55.167/32",
"40.119.232.50/32", "40.119.232.251/32",
"40.119.232.146/32", "40.119.232.50/32",
"40.119.232.218/32", "40.119.232.146/32",
"104.43.54.127/32", "40.119.232.218/32",
"104.43.55.117/32", "104.43.54.127/32",
"104.43.55.116/32", "104.43.55.117/32",
"104.43.55.166/32", "104.43.55.116/32",
"52.154.169.50/32", "104.43.55.166/32",
"52.154.171.70/32", "52.154.169.50/32",
"52.154.170.229/32", "52.154.171.70/32",
"52.154.170.113/32", "52.154.170.229/32",
"52.154.171.44/32", "52.154.170.113/32",
"52.154.172.2/32", "52.154.171.44/32",
"52.143.244.81/32", "52.154.172.2/32",
"52.154.171.87/32", "52.143.244.81/32",
"52.154.171.250/32", "52.154.171.87/32",
"52.154.170.28/32", "52.154.171.250/32",
"52.154.170.122/32", "52.154.170.28/32",
"52.143.243.117/32", "52.154.170.122/32",
"52.143.247.235/32", "52.143.243.117/32",
"52.154.171.235/32", "52.143.247.235/32",
"52.154.171.196/32", "52.154.171.235/32",
"52.154.171.0/32", "52.154.171.196/32",
"52.154.170.243/32", "52.154.171.0/32",
"52.154.170.26/32", "52.154.170.243/32",
"52.154.169.200/32", "52.154.170.26/32",
"52.154.170.96/32", "52.154.169.200/32",
"52.154.170.88/32", "52.154.170.96/32",
"52.154.171.150/32", "52.154.170.88/32",
"52.154.171.205/32", "52.154.171.150/32",
"52.154.170.117/32", "52.154.171.205/32",
"52.154.170.209/32", "52.154.170.117/32",
"191.235.202.48/32", "52.154.170.209/32",
"191.233.3.202/32", "191.235.202.48/32",
"191.235.201.214/32", "191.233.3.202/32",
"191.233.3.197/32", "191.235.201.214/32",
"191.235.202.38/32", "191.233.3.197/32",
"20.53.78.144/32", "191.235.202.38/32",
"20.193.24.10/32", "20.53.78.144/32",
"20.53.78.236/32", "20.193.24.10/32",
"20.53.78.138/32", "20.53.78.236/32",
"20.53.78.123/32", "20.53.78.138/32",
"20.53.78.106/32", "20.53.78.123/32",
"20.193.27.215/32", "20.53.78.106/32",
"20.193.25.197/32", "20.193.27.215/32",
"20.193.12.126/32", "20.193.25.197/32",
"20.193.24.251/32", "20.193.12.126/32",
"20.204.242.101/32", "20.193.24.251/32",
"20.207.72.113/32", "20.204.242.101/32",
"20.204.242.19/32", "20.207.72.113/32",
"20.219.45.67/32", "20.204.242.19/32",
"20.207.72.11/32", "20.219.45.67/32",
"20.219.45.190/32", "20.207.72.11/32",
"20.204.243.55/32", "20.219.45.190/32",
"20.204.241.148/32", "20.204.243.55/32",
"20.207.72.110/32", "20.204.241.148/32",
"20.204.240.172/32", "20.207.72.110/32",
"20.207.72.21/32", "20.204.240.172/32",
"20.204.246.81/32", "20.207.72.21/32",
"20.207.107.181/32", "20.204.246.81/32",
"20.204.246.254/32", "20.207.107.181/32",
"20.219.43.246/32", "20.204.246.254/32",
"52.149.25.43/32", "20.219.43.246/32",
"52.149.61.51/32", "52.149.25.43/32",
"52.149.58.139/32", "52.149.61.51/32",
"52.149.60.38/32", "52.149.58.139/32",
"52.148.165.38/32", "52.149.60.38/32",
"52.143.95.162/32", "52.148.165.38/32",
"52.149.56.151/32", "52.143.95.162/32",
"52.149.30.45/32", "52.149.56.151/32",
"52.149.58.173/32", "52.149.30.45/32",
"52.143.95.204/32", "52.149.58.173/32",
"52.149.28.83/32", "52.143.95.204/32",
"52.149.58.69/32", "52.149.28.83/32",
"52.148.161.87/32", "52.149.58.69/32",
"52.149.58.27/32", "52.148.161.87/32",
"52.149.28.18/32", "52.149.58.27/32",
"20.79.226.26/32", "52.149.28.18/32",
"20.79.239.66/32", "20.79.226.26/32",
"20.79.238.198/32", "20.79.239.66/32",
"20.113.14.159/32", "20.79.238.198/32",
"20.75.144.152/32", "20.113.14.159/32",
"20.43.172.120/32", "20.75.144.152/32",
"20.53.134.160/32", "20.43.172.120/32",
"20.201.15.208/32", "20.53.134.160/32",
"20.93.28.24/32", "20.201.15.208/32",
"20.61.34.40/32", "20.93.28.24/32",
"52.242.224.168/32", "20.61.34.40/32",
"20.80.129.80/32", "52.242.224.168/32",
"20.195.108.47/32", "20.80.129.80/32",
"4.195.133.120/32", "20.195.108.47/32",
"4.228.76.163/32", "4.195.133.120/32",
"4.182.131.108/32", "4.228.76.163/32",
"4.209.224.56/32", "4.182.131.108/32",
"108.141.83.74/32", "4.209.224.56/32",
"4.213.46.14/32", "108.141.83.74/32",
"172.169.17.165/32", "4.213.46.14/32",
"51.8.71.117/32", "172.169.17.165/32",
"20.3.1.178/32", "51.8.71.117/32",
"52.149.56.151/32", "20.3.1.178/32",
"52.149.30.45/32", "52.149.56.151/32",
"52.149.58.173/32", "52.149.30.45/32",
"52.143.95.204/32", "52.149.58.173/32",
"52.149.28.83/32", "52.143.95.204/32",
"52.149.58.69/32", "52.149.28.83/32",
"52.148.161.87/32", "52.149.58.69/32",
"52.149.58.27/32", "52.148.161.87/32",
"52.149.28.18/32", "52.149.58.27/32",
"20.79.226.26/32", "52.149.28.18/32",
"20.79.239.66/32", "20.79.226.26/32",
"20.79.238.198/32", "20.79.239.66/32",
"20.113.14.159/32", "20.79.238.198/32",
"20.75.144.152/32", "20.113.14.159/32",
"20.43.172.120/32", "20.75.144.152/32",
"20.53.134.160/32", "20.43.172.120/32",
"20.201.15.208/32", "20.53.134.160/32",
"20.93.28.24/32", "20.201.15.208/32",
"20.61.34.40/32", "20.93.28.24/32",
"52.242.224.168/32", "20.61.34.40/32",
"20.80.129.80/32", "52.242.224.168/32",
"20.195.108.47/32", "20.80.129.80/32",
"4.195.133.120/32", "20.195.108.47/32",
"4.228.76.163/32", "4.195.133.120/32",
"4.182.131.108/32", "4.228.76.163/32",
"4.209.224.56/32", "4.182.131.108/32",
"108.141.83.74/32", "4.209.224.56/32",
"4.213.46.14/32", "108.141.83.74/32",
"172.169.17.165/32", "4.213.46.14/32",
"51.8.71.117/32", "172.169.17.165/32",
"20.3.1.178/32" "51.8.71.117/32",
] "20.3.1.178/32",
]

View File

@@ -2,262 +2,263 @@
user_agent_regex: \+http\://www\.google\.com/bot\.html user_agent_regex: \+http\://www\.google\.com/bot\.html
action: ALLOW action: ALLOW
# https://developers.google.com/static/search/apis/ipranges/googlebot.json # https://developers.google.com/static/search/apis/ipranges/googlebot.json
remote_addresses: [ remote_addresses:
"2001:4860:4801:10::/64", [
"2001:4860:4801:11::/64", "2001:4860:4801:10::/64",
"2001:4860:4801:12::/64", "2001:4860:4801:11::/64",
"2001:4860:4801:13::/64", "2001:4860:4801:12::/64",
"2001:4860:4801:14::/64", "2001:4860:4801:13::/64",
"2001:4860:4801:15::/64", "2001:4860:4801:14::/64",
"2001:4860:4801:16::/64", "2001:4860:4801:15::/64",
"2001:4860:4801:17::/64", "2001:4860:4801:16::/64",
"2001:4860:4801:18::/64", "2001:4860:4801:17::/64",
"2001:4860:4801:19::/64", "2001:4860:4801:18::/64",
"2001:4860:4801:1a::/64", "2001:4860:4801:19::/64",
"2001:4860:4801:1b::/64", "2001:4860:4801:1a::/64",
"2001:4860:4801:1c::/64", "2001:4860:4801:1b::/64",
"2001:4860:4801:1d::/64", "2001:4860:4801:1c::/64",
"2001:4860:4801:1e::/64", "2001:4860:4801:1d::/64",
"2001:4860:4801:1f::/64", "2001:4860:4801:1e::/64",
"2001:4860:4801:20::/64", "2001:4860:4801:1f::/64",
"2001:4860:4801:21::/64", "2001:4860:4801:20::/64",
"2001:4860:4801:22::/64", "2001:4860:4801:21::/64",
"2001:4860:4801:23::/64", "2001:4860:4801:22::/64",
"2001:4860:4801:24::/64", "2001:4860:4801:23::/64",
"2001:4860:4801:25::/64", "2001:4860:4801:24::/64",
"2001:4860:4801:26::/64", "2001:4860:4801:25::/64",
"2001:4860:4801:27::/64", "2001:4860:4801:26::/64",
"2001:4860:4801:28::/64", "2001:4860:4801:27::/64",
"2001:4860:4801:29::/64", "2001:4860:4801:28::/64",
"2001:4860:4801:2::/64", "2001:4860:4801:29::/64",
"2001:4860:4801:2a::/64", "2001:4860:4801:2::/64",
"2001:4860:4801:2b::/64", "2001:4860:4801:2a::/64",
"2001:4860:4801:2c::/64", "2001:4860:4801:2b::/64",
"2001:4860:4801:2d::/64", "2001:4860:4801:2c::/64",
"2001:4860:4801:2e::/64", "2001:4860:4801:2d::/64",
"2001:4860:4801:2f::/64", "2001:4860:4801:2e::/64",
"2001:4860:4801:31::/64", "2001:4860:4801:2f::/64",
"2001:4860:4801:32::/64", "2001:4860:4801:31::/64",
"2001:4860:4801:33::/64", "2001:4860:4801:32::/64",
"2001:4860:4801:34::/64", "2001:4860:4801:33::/64",
"2001:4860:4801:35::/64", "2001:4860:4801:34::/64",
"2001:4860:4801:36::/64", "2001:4860:4801:35::/64",
"2001:4860:4801:37::/64", "2001:4860:4801:36::/64",
"2001:4860:4801:38::/64", "2001:4860:4801:37::/64",
"2001:4860:4801:39::/64", "2001:4860:4801:38::/64",
"2001:4860:4801:3a::/64", "2001:4860:4801:39::/64",
"2001:4860:4801:3b::/64", "2001:4860:4801:3a::/64",
"2001:4860:4801:3c::/64", "2001:4860:4801:3b::/64",
"2001:4860:4801:3d::/64", "2001:4860:4801:3c::/64",
"2001:4860:4801:3e::/64", "2001:4860:4801:3d::/64",
"2001:4860:4801:40::/64", "2001:4860:4801:3e::/64",
"2001:4860:4801:41::/64", "2001:4860:4801:40::/64",
"2001:4860:4801:42::/64", "2001:4860:4801:41::/64",
"2001:4860:4801:43::/64", "2001:4860:4801:42::/64",
"2001:4860:4801:44::/64", "2001:4860:4801:43::/64",
"2001:4860:4801:45::/64", "2001:4860:4801:44::/64",
"2001:4860:4801:46::/64", "2001:4860:4801:45::/64",
"2001:4860:4801:47::/64", "2001:4860:4801:46::/64",
"2001:4860:4801:48::/64", "2001:4860:4801:47::/64",
"2001:4860:4801:49::/64", "2001:4860:4801:48::/64",
"2001:4860:4801:4a::/64", "2001:4860:4801:49::/64",
"2001:4860:4801:4b::/64", "2001:4860:4801:4a::/64",
"2001:4860:4801:4c::/64", "2001:4860:4801:4b::/64",
"2001:4860:4801:50::/64", "2001:4860:4801:4c::/64",
"2001:4860:4801:51::/64", "2001:4860:4801:50::/64",
"2001:4860:4801:52::/64", "2001:4860:4801:51::/64",
"2001:4860:4801:53::/64", "2001:4860:4801:52::/64",
"2001:4860:4801:54::/64", "2001:4860:4801:53::/64",
"2001:4860:4801:55::/64", "2001:4860:4801:54::/64",
"2001:4860:4801:56::/64", "2001:4860:4801:55::/64",
"2001:4860:4801:60::/64", "2001:4860:4801:56::/64",
"2001:4860:4801:61::/64", "2001:4860:4801:60::/64",
"2001:4860:4801:62::/64", "2001:4860:4801:61::/64",
"2001:4860:4801:63::/64", "2001:4860:4801:62::/64",
"2001:4860:4801:64::/64", "2001:4860:4801:63::/64",
"2001:4860:4801:65::/64", "2001:4860:4801:64::/64",
"2001:4860:4801:66::/64", "2001:4860:4801:65::/64",
"2001:4860:4801:67::/64", "2001:4860:4801:66::/64",
"2001:4860:4801:68::/64", "2001:4860:4801:67::/64",
"2001:4860:4801:69::/64", "2001:4860:4801:68::/64",
"2001:4860:4801:6a::/64", "2001:4860:4801:69::/64",
"2001:4860:4801:6b::/64", "2001:4860:4801:6a::/64",
"2001:4860:4801:6c::/64", "2001:4860:4801:6b::/64",
"2001:4860:4801:6d::/64", "2001:4860:4801:6c::/64",
"2001:4860:4801:6e::/64", "2001:4860:4801:6d::/64",
"2001:4860:4801:6f::/64", "2001:4860:4801:6e::/64",
"2001:4860:4801:70::/64", "2001:4860:4801:6f::/64",
"2001:4860:4801:71::/64", "2001:4860:4801:70::/64",
"2001:4860:4801:72::/64", "2001:4860:4801:71::/64",
"2001:4860:4801:73::/64", "2001:4860:4801:72::/64",
"2001:4860:4801:74::/64", "2001:4860:4801:73::/64",
"2001:4860:4801:75::/64", "2001:4860:4801:74::/64",
"2001:4860:4801:76::/64", "2001:4860:4801:75::/64",
"2001:4860:4801:77::/64", "2001:4860:4801:76::/64",
"2001:4860:4801:78::/64", "2001:4860:4801:77::/64",
"2001:4860:4801:79::/64", "2001:4860:4801:78::/64",
"2001:4860:4801:80::/64", "2001:4860:4801:79::/64",
"2001:4860:4801:81::/64", "2001:4860:4801:80::/64",
"2001:4860:4801:82::/64", "2001:4860:4801:81::/64",
"2001:4860:4801:83::/64", "2001:4860:4801:82::/64",
"2001:4860:4801:84::/64", "2001:4860:4801:83::/64",
"2001:4860:4801:85::/64", "2001:4860:4801:84::/64",
"2001:4860:4801:86::/64", "2001:4860:4801:85::/64",
"2001:4860:4801:87::/64", "2001:4860:4801:86::/64",
"2001:4860:4801:88::/64", "2001:4860:4801:87::/64",
"2001:4860:4801:90::/64", "2001:4860:4801:88::/64",
"2001:4860:4801:91::/64", "2001:4860:4801:90::/64",
"2001:4860:4801:92::/64", "2001:4860:4801:91::/64",
"2001:4860:4801:93::/64", "2001:4860:4801:92::/64",
"2001:4860:4801:94::/64", "2001:4860:4801:93::/64",
"2001:4860:4801:95::/64", "2001:4860:4801:94::/64",
"2001:4860:4801:96::/64", "2001:4860:4801:95::/64",
"2001:4860:4801:a0::/64", "2001:4860:4801:96::/64",
"2001:4860:4801:a1::/64", "2001:4860:4801:a0::/64",
"2001:4860:4801:a2::/64", "2001:4860:4801:a1::/64",
"2001:4860:4801:a3::/64", "2001:4860:4801:a2::/64",
"2001:4860:4801:a4::/64", "2001:4860:4801:a3::/64",
"2001:4860:4801:a5::/64", "2001:4860:4801:a4::/64",
"2001:4860:4801:c::/64", "2001:4860:4801:a5::/64",
"2001:4860:4801:f::/64", "2001:4860:4801:c::/64",
"192.178.5.0/27", "2001:4860:4801:f::/64",
"192.178.6.0/27", "192.178.5.0/27",
"192.178.6.128/27", "192.178.6.0/27",
"192.178.6.160/27", "192.178.6.128/27",
"192.178.6.192/27", "192.178.6.160/27",
"192.178.6.32/27", "192.178.6.192/27",
"192.178.6.64/27", "192.178.6.32/27",
"192.178.6.96/27", "192.178.6.64/27",
"34.100.182.96/28", "192.178.6.96/27",
"34.101.50.144/28", "34.100.182.96/28",
"34.118.254.0/28", "34.101.50.144/28",
"34.118.66.0/28", "34.118.254.0/28",
"34.126.178.96/28", "34.118.66.0/28",
"34.146.150.144/28", "34.126.178.96/28",
"34.147.110.144/28", "34.146.150.144/28",
"34.151.74.144/28", "34.147.110.144/28",
"34.152.50.64/28", "34.151.74.144/28",
"34.154.114.144/28", "34.152.50.64/28",
"34.155.98.32/28", "34.154.114.144/28",
"34.165.18.176/28", "34.155.98.32/28",
"34.175.160.64/28", "34.165.18.176/28",
"34.176.130.16/28", "34.175.160.64/28",
"34.22.85.0/27", "34.176.130.16/28",
"34.64.82.64/28", "34.22.85.0/27",
"34.65.242.112/28", "34.64.82.64/28",
"34.80.50.80/28", "34.65.242.112/28",
"34.88.194.0/28", "34.80.50.80/28",
"34.89.10.80/28", "34.88.194.0/28",
"34.89.198.80/28", "34.89.10.80/28",
"34.96.162.48/28", "34.89.198.80/28",
"35.247.243.240/28", "34.96.162.48/28",
"66.249.64.0/27", "35.247.243.240/28",
"66.249.64.128/27", "66.249.64.0/27",
"66.249.64.160/27", "66.249.64.128/27",
"66.249.64.224/27", "66.249.64.160/27",
"66.249.64.32/27", "66.249.64.224/27",
"66.249.64.64/27", "66.249.64.32/27",
"66.249.64.96/27", "66.249.64.64/27",
"66.249.65.0/27", "66.249.64.96/27",
"66.249.65.128/27", "66.249.65.0/27",
"66.249.65.160/27", "66.249.65.128/27",
"66.249.65.192/27", "66.249.65.160/27",
"66.249.65.224/27", "66.249.65.192/27",
"66.249.65.32/27", "66.249.65.224/27",
"66.249.65.64/27", "66.249.65.32/27",
"66.249.65.96/27", "66.249.65.64/27",
"66.249.66.0/27", "66.249.65.96/27",
"66.249.66.128/27", "66.249.66.0/27",
"66.249.66.160/27", "66.249.66.128/27",
"66.249.66.192/27", "66.249.66.160/27",
"66.249.66.224/27", "66.249.66.192/27",
"66.249.66.32/27", "66.249.66.224/27",
"66.249.66.64/27", "66.249.66.32/27",
"66.249.66.96/27", "66.249.66.64/27",
"66.249.68.0/27", "66.249.66.96/27",
"66.249.68.128/27", "66.249.68.0/27",
"66.249.68.32/27", "66.249.68.128/27",
"66.249.68.64/27", "66.249.68.32/27",
"66.249.68.96/27", "66.249.68.64/27",
"66.249.69.0/27", "66.249.68.96/27",
"66.249.69.128/27", "66.249.69.0/27",
"66.249.69.160/27", "66.249.69.128/27",
"66.249.69.192/27", "66.249.69.160/27",
"66.249.69.224/27", "66.249.69.192/27",
"66.249.69.32/27", "66.249.69.224/27",
"66.249.69.64/27", "66.249.69.32/27",
"66.249.69.96/27", "66.249.69.64/27",
"66.249.70.0/27", "66.249.69.96/27",
"66.249.70.128/27", "66.249.70.0/27",
"66.249.70.160/27", "66.249.70.128/27",
"66.249.70.192/27", "66.249.70.160/27",
"66.249.70.224/27", "66.249.70.192/27",
"66.249.70.32/27", "66.249.70.224/27",
"66.249.70.64/27", "66.249.70.32/27",
"66.249.70.96/27", "66.249.70.64/27",
"66.249.71.0/27", "66.249.70.96/27",
"66.249.71.128/27", "66.249.71.0/27",
"66.249.71.160/27", "66.249.71.128/27",
"66.249.71.192/27", "66.249.71.160/27",
"66.249.71.224/27", "66.249.71.192/27",
"66.249.71.32/27", "66.249.71.224/27",
"66.249.71.64/27", "66.249.71.32/27",
"66.249.71.96/27", "66.249.71.64/27",
"66.249.72.0/27", "66.249.71.96/27",
"66.249.72.128/27", "66.249.72.0/27",
"66.249.72.160/27", "66.249.72.128/27",
"66.249.72.192/27", "66.249.72.160/27",
"66.249.72.224/27", "66.249.72.192/27",
"66.249.72.32/27", "66.249.72.224/27",
"66.249.72.64/27", "66.249.72.32/27",
"66.249.72.96/27", "66.249.72.64/27",
"66.249.73.0/27", "66.249.72.96/27",
"66.249.73.128/27", "66.249.73.0/27",
"66.249.73.160/27", "66.249.73.128/27",
"66.249.73.192/27", "66.249.73.160/27",
"66.249.73.224/27", "66.249.73.192/27",
"66.249.73.32/27", "66.249.73.224/27",
"66.249.73.64/27", "66.249.73.32/27",
"66.249.73.96/27", "66.249.73.64/27",
"66.249.74.0/27", "66.249.73.96/27",
"66.249.74.128/27", "66.249.74.0/27",
"66.249.74.160/27", "66.249.74.128/27",
"66.249.74.192/27", "66.249.74.160/27",
"66.249.74.32/27", "66.249.74.192/27",
"66.249.74.64/27", "66.249.74.32/27",
"66.249.74.96/27", "66.249.74.64/27",
"66.249.75.0/27", "66.249.74.96/27",
"66.249.75.128/27", "66.249.75.0/27",
"66.249.75.160/27", "66.249.75.128/27",
"66.249.75.192/27", "66.249.75.160/27",
"66.249.75.224/27", "66.249.75.192/27",
"66.249.75.32/27", "66.249.75.224/27",
"66.249.75.64/27", "66.249.75.32/27",
"66.249.75.96/27", "66.249.75.64/27",
"66.249.76.0/27", "66.249.75.96/27",
"66.249.76.128/27", "66.249.76.0/27",
"66.249.76.160/27", "66.249.76.128/27",
"66.249.76.192/27", "66.249.76.160/27",
"66.249.76.224/27", "66.249.76.192/27",
"66.249.76.32/27", "66.249.76.224/27",
"66.249.76.64/27", "66.249.76.32/27",
"66.249.76.96/27", "66.249.76.64/27",
"66.249.77.0/27", "66.249.76.96/27",
"66.249.77.128/27", "66.249.77.0/27",
"66.249.77.160/27", "66.249.77.128/27",
"66.249.77.192/27", "66.249.77.160/27",
"66.249.77.224/27", "66.249.77.192/27",
"66.249.77.32/27", "66.249.77.224/27",
"66.249.77.64/27", "66.249.77.32/27",
"66.249.77.96/27", "66.249.77.64/27",
"66.249.78.0/27", "66.249.77.96/27",
"66.249.78.32/27", "66.249.78.0/27",
"66.249.79.0/27", "66.249.78.32/27",
"66.249.79.128/27", "66.249.79.0/27",
"66.249.79.160/27", "66.249.79.128/27",
"66.249.79.192/27", "66.249.79.160/27",
"66.249.79.224/27", "66.249.79.192/27",
"66.249.79.32/27", "66.249.79.224/27",
"66.249.79.64/27", "66.249.79.32/27",
"66.249.79.96/27" "66.249.79.64/27",
] "66.249.79.96/27",
]

View File

@@ -1,8 +1,4 @@
- name: internet-archive - name: internet-archive
action: ALLOW action: ALLOW
# https://ipinfo.io/AS7941 # https://ipinfo.io/AS7941
remote_addresses: [ remote_addresses: ["207.241.224.0/20", "208.70.24.0/21", "2620:0:9c0::/48"]
"207.241.224.0/20",
"208.70.24.0/21",
"2620:0:9c0::/48"
]

View File

@@ -2,9 +2,10 @@
user_agent_regex: \+https\://kagi\.com/bot user_agent_regex: \+https\://kagi\.com/bot
action: ALLOW action: ALLOW
# https://kagi.com/bot # https://kagi.com/bot
remote_addresses: [ remote_addresses:
"216.18.205.234/32", [
"35.212.27.76/32", "216.18.205.234/32",
"104.254.65.50/32", "35.212.27.76/32",
"209.151.156.194/32" "104.254.65.50/32",
] "209.151.156.194/32",
]

View File

@@ -2,10 +2,11 @@
user_agent_regex: search\.marginalia\.nu user_agent_regex: search\.marginalia\.nu
action: ALLOW action: ALLOW
# Received directly over email # Received directly over email
remote_addresses: [ remote_addresses:
"193.183.0.162/31", [
"193.183.0.164/30", "193.183.0.162/31",
"193.183.0.168/30", "193.183.0.164/30",
"193.183.0.172/31", "193.183.0.168/30",
"193.183.0.174/32" "193.183.0.172/31",
] "193.183.0.174/32",
]

View File

@@ -2,4 +2,4 @@
user_agent_regex: \+https\://www\.mojeek\.com/bot\.html user_agent_regex: \+https\://www\.mojeek\.com/bot\.html
action: ALLOW action: ALLOW
# https://www.mojeek.com/bot.html # https://www.mojeek.com/bot.html
remote_addresses: [ "5.102.173.71/32" ] remote_addresses: ["5.102.173.71/32"]

View File

@@ -4,13 +4,14 @@
user_agent_regex: GPTBot/1\.1; \+https\://openai\.com/gptbot user_agent_regex: GPTBot/1\.1; \+https\://openai\.com/gptbot
action: ALLOW action: ALLOW
# https://openai.com/gptbot.json # https://openai.com/gptbot.json
remote_addresses: [ remote_addresses:
"52.230.152.0/24", [
"20.171.206.0/24", "52.230.152.0/24",
"20.171.207.0/24", "20.171.206.0/24",
"4.227.36.0/25", "20.171.207.0/24",
"20.125.66.80/28", "4.227.36.0/25",
"172.182.204.0/24", "20.125.66.80/28",
"172.182.214.0/24", "172.182.204.0/24",
"172.182.215.0/24", "172.182.214.0/24",
] "172.182.215.0/24",
]

View File

@@ -4,10 +4,11 @@
user_agent_regex: OAI-SearchBot/1\.0; \+https\://openai\.com/searchbot user_agent_regex: OAI-SearchBot/1\.0; \+https\://openai\.com/searchbot
action: ALLOW action: ALLOW
# https://openai.com/searchbot.json # https://openai.com/searchbot.json
remote_addresses: [ remote_addresses:
"20.42.10.176/28", [
"172.203.190.128/28", "20.42.10.176/28",
"104.210.140.128/28", "172.203.190.128/28",
"51.8.102.0/24", "104.210.140.128/28",
"135.234.64.0/24" "51.8.102.0/24",
] "135.234.64.0/24",
]

View File

@@ -4,13 +4,14 @@
user_agent_regex: PerplexityBot/.+; \+https\://perplexity\.ai/perplexitybot user_agent_regex: PerplexityBot/.+; \+https\://perplexity\.ai/perplexitybot
action: ALLOW action: ALLOW
# https://www.perplexity.com/perplexitybot.json # https://www.perplexity.com/perplexitybot.json
remote_addresses: [ remote_addresses:
"107.20.236.150/32", [
"3.224.62.45/32", "107.20.236.150/32",
"18.210.92.235/32", "3.224.62.45/32",
"3.222.232.239/32", "18.210.92.235/32",
"3.211.124.183/32", "3.222.232.239/32",
"3.231.139.107/32", "3.211.124.183/32",
"18.97.1.228/30", "3.231.139.107/32",
"18.97.9.96/29", "18.97.1.228/30",
] "18.97.9.96/29",
]

View File

@@ -2,4 +2,4 @@
user_agent_regex: \+https\://help\.qwant\.com/bot/ user_agent_regex: \+https\://help\.qwant\.com/bot/
action: ALLOW action: ALLOW
# https://help.qwant.com/wp-content/uploads/sites/2/2025/01/qwantbot.json # https://help.qwant.com/wp-content/uploads/sites/2/2025/01/qwantbot.json
remote_addresses: [ "91.242.162.0/24" ] remote_addresses: ["91.242.162.0/24"]

View File

@@ -1,6 +1,6 @@
- name: yandexbot - name: yandexbot
action: ALLOW action: ALLOW
expression: expression:
all: all:
- userAgent.matches("\\+http\\://yandex\\.com/bots") - userAgent.matches("\\+http\\://yandex\\.com/bots")
- verifyFCrDNS(remoteAddress, "^.*\\.yandex\\.(ru|com|net)$") - verifyFCrDNS(remoteAddress, "^.*\\.yandex\\.(ru|com|net)$")

View File

@@ -2,4 +2,4 @@
Contains policies that exclusively reference policies in _multiple_ other data folders. Contains policies that exclusively reference policies in _multiple_ other data folders.
Akin to "stances" that the administrator can take, with reference to various topics, such as AI/LLM systems. Akin to "stances" that the administrator can take, with reference to various topics, such as AI/LLM systems.

View File

@@ -3,4 +3,4 @@
- import: (data)/bots/ai-catchall.yaml - import: (data)/bots/ai-catchall.yaml
- import: (data)/clients/ai.yaml - import: (data)/clients/ai.yaml
- import: (data)/crawlers/ai-search.yaml - import: (data)/crawlers/ai-search.yaml
- import: (data)/crawlers/ai-training.yaml - import: (data)/crawlers/ai-training.yaml

View File

@@ -1,2 +1,2 @@
- import: (data)/clients/telegram-preview.yaml - import: (data)/clients/telegram-preview.yaml
- import: (data)/clients/vk-preview.yaml - import: (data)/clients/vk-preview.yaml

26
data/services/updown.yaml Normal file
View File

@@ -0,0 +1,26 @@
# https://updown.io/about
- name: updown
user_agent_regex: updown.io
action: ALLOW
remote_addresses: [
"45.32.74.41/32",
"104.238.136.194/32",
"192.99.37.47/32",
"91.121.222.175/32",
"104.238.159.87/32",
"102.212.60.78/32",
"135.181.102.135/32",
"45.32.107.181/32",
"45.76.104.117/32",
"45.63.29.207/32",
"2001:19f0:6001:2c6::1/128",
"2001:19f0:9002:11a::1/128",
"2607:5300:60:4c2f::1/128",
"2001:41d0:2:85af::1/128",
"2001:19f0:6c01:145::1/128",
"2c0f:c40:4003:4::2/128",
"2a01:4f9:c010:d5f9::1/128",
"2001:19f0:4400:402e::1/128",
"2001:19f0:7001:45a::1/128",
"2001:19f0:5801:1d8::1/128"
]

View File

@@ -2,222 +2,223 @@
user_agent_regex: UptimeRobot user_agent_regex: UptimeRobot
action: ALLOW action: ALLOW
# https://api.uptimerobot.com/meta/ips # https://api.uptimerobot.com/meta/ips
remote_addresses: [ remote_addresses:
"3.12.251.153/32", [
"3.20.63.178/32", "3.12.251.153/32",
"3.77.67.4/32", "3.20.63.178/32",
"3.79.134.69/32", "3.77.67.4/32",
"3.105.133.239/32", "3.79.134.69/32",
"3.105.190.221/32", "3.105.133.239/32",
"3.133.226.214/32", "3.105.190.221/32",
"3.149.57.90/32", "3.133.226.214/32",
"3.212.128.62/32", "3.149.57.90/32",
"5.161.61.238/32", "3.212.128.62/32",
"5.161.73.160/32", "5.161.61.238/32",
"5.161.75.7/32", "5.161.73.160/32",
"5.161.113.195/32", "5.161.75.7/32",
"5.161.117.52/32", "5.161.113.195/32",
"5.161.177.47/32", "5.161.117.52/32",
"5.161.194.92/32", "5.161.177.47/32",
"5.161.215.244/32", "5.161.194.92/32",
"5.223.43.32/32", "5.161.215.244/32",
"5.223.53.147/32", "5.223.43.32/32",
"5.223.57.22/32", "5.223.53.147/32",
"18.116.205.62/32", "5.223.57.22/32",
"18.180.208.214/32", "18.116.205.62/32",
"18.192.166.72/32", "18.180.208.214/32",
"18.193.252.127/32", "18.192.166.72/32",
"24.144.78.39/32", "18.193.252.127/32",
"24.144.78.185/32", "24.144.78.39/32",
"34.198.201.66/32", "24.144.78.185/32",
"45.55.123.175/32", "34.198.201.66/32",
"45.55.127.146/32", "45.55.123.175/32",
"49.13.24.81/32", "45.55.127.146/32",
"49.13.130.29/32", "49.13.24.81/32",
"49.13.134.145/32", "49.13.130.29/32",
"49.13.164.148/32", "49.13.134.145/32",
"49.13.167.123/32", "49.13.164.148/32",
"52.15.147.27/32", "49.13.167.123/32",
"52.22.236.30/32", "52.15.147.27/32",
"52.28.162.93/32", "52.22.236.30/32",
"52.59.43.236/32", "52.28.162.93/32",
"52.87.72.16/32", "52.59.43.236/32",
"54.64.67.106/32", "52.87.72.16/32",
"54.79.28.129/32", "54.64.67.106/32",
"54.87.112.51/32", "54.79.28.129/32",
"54.167.223.174/32", "54.87.112.51/32",
"54.249.170.27/32", "54.167.223.174/32",
"63.178.84.147/32", "54.249.170.27/32",
"64.225.81.248/32", "63.178.84.147/32",
"64.225.82.147/32", "64.225.81.248/32",
"69.162.124.227/32", "64.225.82.147/32",
"69.162.124.235/32", "69.162.124.227/32",
"69.162.124.238/32", "69.162.124.235/32",
"78.46.190.63/32", "69.162.124.238/32",
"78.46.215.1/32", "78.46.190.63/32",
"78.47.98.55/32", "78.46.215.1/32",
"78.47.173.76/32", "78.47.98.55/32",
"88.99.80.227/32", "78.47.173.76/32",
"91.99.101.207/32", "88.99.80.227/32",
"128.140.41.193/32", "91.99.101.207/32",
"128.140.106.114/32", "128.140.41.193/32",
"129.212.132.140/32", "128.140.106.114/32",
"134.199.240.137/32", "129.212.132.140/32",
"138.197.53.117/32", "134.199.240.137/32",
"138.197.53.138/32", "138.197.53.117/32",
"138.197.54.143/32", "138.197.53.138/32",
"138.197.54.247/32", "138.197.54.143/32",
"138.197.63.92/32", "138.197.54.247/32",
"139.59.50.44/32", "138.197.63.92/32",
"142.132.180.39/32", "139.59.50.44/32",
"143.198.249.237/32", "142.132.180.39/32",
"143.198.250.89/32", "143.198.249.237/32",
"143.244.196.21/32", "143.198.250.89/32",
"143.244.196.211/32", "143.244.196.21/32",
"143.244.221.177/32", "143.244.196.211/32",
"144.126.251.21/32", "143.244.221.177/32",
"146.190.9.187/32", "144.126.251.21/32",
"152.42.149.135/32", "146.190.9.187/32",
"157.90.155.240/32", "152.42.149.135/32",
"157.90.156.63/32", "157.90.155.240/32",
"159.69.158.189/32", "157.90.156.63/32",
"159.223.243.219/32", "159.69.158.189/32",
"161.35.247.201/32", "159.223.243.219/32",
"167.99.18.52/32", "161.35.247.201/32",
"167.235.143.113/32", "167.99.18.52/32",
"168.119.53.160/32", "167.235.143.113/32",
"168.119.96.239/32", "168.119.53.160/32",
"168.119.123.75/32", "168.119.96.239/32",
"170.64.250.64/32", "168.119.123.75/32",
"170.64.250.132/32", "170.64.250.64/32",
"170.64.250.235/32", "170.64.250.132/32",
"178.156.181.172/32", "170.64.250.235/32",
"178.156.184.20/32", "178.156.181.172/32",
"178.156.185.127/32", "178.156.184.20/32",
"178.156.185.231/32", "178.156.185.127/32",
"178.156.187.238/32", "178.156.185.231/32",
"178.156.189.113/32", "178.156.187.238/32",
"178.156.189.249/32", "178.156.189.113/32",
"188.166.201.79/32", "178.156.189.249/32",
"206.189.241.133/32", "188.166.201.79/32",
"209.38.49.1/32", "206.189.241.133/32",
"209.38.49.206/32", "209.38.49.1/32",
"209.38.49.226/32", "209.38.49.206/32",
"209.38.51.43/32", "209.38.49.226/32",
"209.38.53.7/32", "209.38.51.43/32",
"209.38.124.252/32", "209.38.53.7/32",
"216.144.248.18/31", "209.38.124.252/32",
"216.144.248.21/32", "216.144.248.18/31",
"216.144.248.22/31", "216.144.248.21/32",
"216.144.248.24/30", "216.144.248.22/31",
"216.144.248.28/31", "216.144.248.24/30",
"216.144.248.30/32", "216.144.248.28/31",
"216.245.221.83/32", "216.144.248.30/32",
"2400:6180:10:200::56a0:b000/128", "216.245.221.83/32",
"2400:6180:10:200::56a0:c000/128", "2400:6180:10:200::56a0:b000/128",
"2400:6180:10:200::56a0:e000/128", "2400:6180:10:200::56a0:c000/128",
"2400:6180:100:d0::94b6:4001/128", "2400:6180:10:200::56a0:e000/128",
"2400:6180:100:d0::94b6:5001/128", "2400:6180:100:d0::94b6:4001/128",
"2400:6180:100:d0::94b6:7001/128", "2400:6180:100:d0::94b6:5001/128",
"2406:da14:94d:8601:9d0d:7754:bedf:e4f5/128", "2400:6180:100:d0::94b6:7001/128",
"2406:da14:94d:8601:b325:ff58:2bba:7934/128", "2406:da14:94d:8601:9d0d:7754:bedf:e4f5/128",
"2406:da14:94d:8601:db4b:c5ac:2cbe:9a79/128", "2406:da14:94d:8601:b325:ff58:2bba:7934/128",
"2406:da1c:9c8:dc02:7ae1:f2ea:ab91:2fde/128", "2406:da14:94d:8601:db4b:c5ac:2cbe:9a79/128",
"2406:da1c:9c8:dc02:7db9:f38b:7b9f:402e/128", "2406:da1c:9c8:dc02:7ae1:f2ea:ab91:2fde/128",
"2406:da1c:9c8:dc02:82b2:f0fd:ee96:579/128", "2406:da1c:9c8:dc02:7db9:f38b:7b9f:402e/128",
"2600:1f16:775:3a00:ac3:c5eb:7081:942e/128", "2406:da1c:9c8:dc02:82b2:f0fd:ee96:579/128",
"2600:1f16:775:3a00:37bf:6026:e54a:f03a/128", "2600:1f16:775:3a00:ac3:c5eb:7081:942e/128",
"2600:1f16:775:3a00:3f24:5bb0:95d7:5a6b/128", "2600:1f16:775:3a00:37bf:6026:e54a:f03a/128",
"2600:1f16:775:3a00:8c2c:2ba6:778f:5be5/128", "2600:1f16:775:3a00:3f24:5bb0:95d7:5a6b/128",
"2600:1f16:775:3a00:91ac:3120:ff38:92b5/128", "2600:1f16:775:3a00:8c2c:2ba6:778f:5be5/128",
"2600:1f16:775:3a00:dbbe:36b0:3c45:da32/128", "2600:1f16:775:3a00:91ac:3120:ff38:92b5/128",
"2600:1f18:179:f900:71:af9a:ade7:d772/128", "2600:1f16:775:3a00:dbbe:36b0:3c45:da32/128",
"2600:1f18:179:f900:2406:9399:4ae6:c5d3/128", "2600:1f18:179:f900:71:af9a:ade7:d772/128",
"2600:1f18:179:f900:4696:7729:7bb3:f52f/128", "2600:1f18:179:f900:2406:9399:4ae6:c5d3/128",
"2600:1f18:179:f900:4b7d:d1cc:2d10:211/128", "2600:1f18:179:f900:4696:7729:7bb3:f52f/128",
"2600:1f18:179:f900:5c68:91b6:5d75:5d7/128", "2600:1f18:179:f900:4b7d:d1cc:2d10:211/128",
"2600:1f18:179:f900:e8dd:eed1:a6c:183b/128", "2600:1f18:179:f900:5c68:91b6:5d75:5d7/128",
"2604:a880:800:14:0:1:68ba:d000/128", "2600:1f18:179:f900:e8dd:eed1:a6c:183b/128",
"2604:a880:800:14:0:1:68ba:e000/128", "2604:a880:800:14:0:1:68ba:d000/128",
"2604:a880:800:14:0:1:68bb:0/128", "2604:a880:800:14:0:1:68ba:e000/128",
"2604:a880:800:14:0:1:68bb:1000/128", "2604:a880:800:14:0:1:68bb:0/128",
"2604:a880:800:14:0:1:68bb:3000/128", "2604:a880:800:14:0:1:68bb:1000/128",
"2604:a880:800:14:0:1:68bb:4000/128", "2604:a880:800:14:0:1:68bb:3000/128",
"2604:a880:800:14:0:1:68bb:5000/128", "2604:a880:800:14:0:1:68bb:4000/128",
"2604:a880:800:14:0:1:68bb:6000/128", "2604:a880:800:14:0:1:68bb:5000/128",
"2604:a880:800:14:0:1:68bb:7000/128", "2604:a880:800:14:0:1:68bb:6000/128",
"2604:a880:800:14:0:1:68bb:a000/128", "2604:a880:800:14:0:1:68bb:7000/128",
"2604:a880:800:14:0:1:68bb:b000/128", "2604:a880:800:14:0:1:68bb:a000/128",
"2604:a880:800:14:0:1:68bb:c000/128", "2604:a880:800:14:0:1:68bb:b000/128",
"2604:a880:800:14:0:1:68bb:d000/128", "2604:a880:800:14:0:1:68bb:c000/128",
"2604:a880:800:14:0:1:68bb:e000/128", "2604:a880:800:14:0:1:68bb:d000/128",
"2604:a880:800:14:0:1:68bb:f000/128", "2604:a880:800:14:0:1:68bb:e000/128",
"2607:ff68:107::4/128", "2604:a880:800:14:0:1:68bb:f000/128",
"2607:ff68:107::14/128", "2607:ff68:107::4/128",
"2607:ff68:107::33/128", "2607:ff68:107::14/128",
"2607:ff68:107::48/127", "2607:ff68:107::33/128",
"2607:ff68:107::50/125", "2607:ff68:107::48/127",
"2607:ff68:107::58/127", "2607:ff68:107::50/125",
"2607:ff68:107::60/128", "2607:ff68:107::58/127",
"2a01:4f8:c0c:83fa::1/128", "2607:ff68:107::60/128",
"2a01:4f8:c17:42e4::1/128", "2a01:4f8:c0c:83fa::1/128",
"2a01:4f8:c2c:9fc6::1/128", "2a01:4f8:c17:42e4::1/128",
"2a01:4f8:c2c:beae::1/128", "2a01:4f8:c2c:9fc6::1/128",
"2a01:4f8:1c1a:3d53::1/128", "2a01:4f8:c2c:beae::1/128",
"2a01:4f8:1c1b:4ef4::1/128", "2a01:4f8:1c1a:3d53::1/128",
"2a01:4f8:1c1b:5b5a::1/128", "2a01:4f8:1c1b:4ef4::1/128",
"2a01:4f8:1c1b:7ecc::1/128", "2a01:4f8:1c1b:5b5a::1/128",
"2a01:4f8:1c1c:11aa::1/128", "2a01:4f8:1c1b:7ecc::1/128",
"2a01:4f8:1c1c:5353::1/128", "2a01:4f8:1c1c:11aa::1/128",
"2a01:4f8:1c1c:7240::1/128", "2a01:4f8:1c1c:5353::1/128",
"2a01:4f8:1c1c:a98a::1/128", "2a01:4f8:1c1c:7240::1/128",
"2a01:4f8:c012:c60e::1/128", "2a01:4f8:1c1c:a98a::1/128",
"2a01:4f8:c013:c18::1/128", "2a01:4f8:c012:c60e::1/128",
"2a01:4f8:c013:34c0::1/128", "2a01:4f8:c013:c18::1/128",
"2a01:4f8:c013:3b0f::1/128", "2a01:4f8:c013:34c0::1/128",
"2a01:4f8:c013:3c52::1/128", "2a01:4f8:c013:3b0f::1/128",
"2a01:4f8:c013:3c53::1/128", "2a01:4f8:c013:3c52::1/128",
"2a01:4f8:c013:3c54::1/128", "2a01:4f8:c013:3c53::1/128",
"2a01:4f8:c013:3c55::1/128", "2a01:4f8:c013:3c54::1/128",
"2a01:4f8:c013:3c56::1/128", "2a01:4f8:c013:3c55::1/128",
"2a01:4ff:f0:bfd::1/128", "2a01:4f8:c013:3c56::1/128",
"2a01:4ff:f0:2219::1/128", "2a01:4ff:f0:bfd::1/128",
"2a01:4ff:f0:3e03::1/128", "2a01:4ff:f0:2219::1/128",
"2a01:4ff:f0:5f80::1/128", "2a01:4ff:f0:3e03::1/128",
"2a01:4ff:f0:7fad::1/128", "2a01:4ff:f0:5f80::1/128",
"2a01:4ff:f0:9c5f::1/128", "2a01:4ff:f0:7fad::1/128",
"2a01:4ff:f0:b2f2::1/128", "2a01:4ff:f0:9c5f::1/128",
"2a01:4ff:f0:b6f1::1/128", "2a01:4ff:f0:b2f2::1/128",
"2a01:4ff:f0:d283::1/128", "2a01:4ff:f0:b6f1::1/128",
"2a01:4ff:f0:d3cd::1/128", "2a01:4ff:f0:d283::1/128",
"2a01:4ff:f0:e516::1/128", "2a01:4ff:f0:d3cd::1/128",
"2a01:4ff:f0:e9cf::1/128", "2a01:4ff:f0:e516::1/128",
"2a01:4ff:f0:eccb::1/128", "2a01:4ff:f0:e9cf::1/128",
"2a01:4ff:f0:efd1::1/128", "2a01:4ff:f0:eccb::1/128",
"2a01:4ff:f0:fdc7::1/128", "2a01:4ff:f0:efd1::1/128",
"2a01:4ff:2f0:193c::1/128", "2a01:4ff:f0:fdc7::1/128",
"2a01:4ff:2f0:27de::1/128", "2a01:4ff:2f0:193c::1/128",
"2a01:4ff:2f0:3b3a::1/128", "2a01:4ff:2f0:27de::1/128",
"2a03:b0c0:2:f0::bd91:f001/128", "2a01:4ff:2f0:3b3a::1/128",
"2a03:b0c0:2:f0::bd92:1/128", "2a03:b0c0:2:f0::bd91:f001/128",
"2a03:b0c0:2:f0::bd92:1001/128", "2a03:b0c0:2:f0::bd92:1/128",
"2a03:b0c0:2:f0::bd92:2001/128", "2a03:b0c0:2:f0::bd92:1001/128",
"2a03:b0c0:2:f0::bd92:4001/128", "2a03:b0c0:2:f0::bd92:2001/128",
"2a03:b0c0:2:f0::bd92:5001/128", "2a03:b0c0:2:f0::bd92:4001/128",
"2a03:b0c0:2:f0::bd92:6001/128", "2a03:b0c0:2:f0::bd92:5001/128",
"2a03:b0c0:2:f0::bd92:7001/128", "2a03:b0c0:2:f0::bd92:6001/128",
"2a03:b0c0:2:f0::bd92:8001/128", "2a03:b0c0:2:f0::bd92:7001/128",
"2a03:b0c0:2:f0::bd92:9001/128", "2a03:b0c0:2:f0::bd92:8001/128",
"2a03:b0c0:2:f0::bd92:a001/128", "2a03:b0c0:2:f0::bd92:9001/128",
"2a03:b0c0:2:f0::bd92:b001/128", "2a03:b0c0:2:f0::bd92:a001/128",
"2a03:b0c0:2:f0::bd92:c001/128", "2a03:b0c0:2:f0::bd92:b001/128",
"2a03:b0c0:2:f0::bd92:e001/128", "2a03:b0c0:2:f0::bd92:c001/128",
"2a03:b0c0:2:f0::bd92:f001/128", "2a03:b0c0:2:f0::bd92:e001/128",
"2a05:d014:1815:3400:6d:9235:c1c0:96ad/128", "2a03:b0c0:2:f0::bd92:f001/128",
"2a05:d014:1815:3400:654f:bd37:724c:212b/128", "2a05:d014:1815:3400:6d:9235:c1c0:96ad/128",
"2a05:d014:1815:3400:90b4:4ef9:5631:b170/128", "2a05:d014:1815:3400:654f:bd37:724c:212b/128",
"2a05:d014:1815:3400:9779:d8e9:100a:9642/128", "2a05:d014:1815:3400:90b4:4ef9:5631:b170/128",
"2a05:d014:1815:3400:af29:e95e:64ff:df81/128", "2a05:d014:1815:3400:9779:d8e9:100a:9642/128",
"2a05:d014:1815:3400:c7d6:f7f3:6cc1:30d1/128", "2a05:d014:1815:3400:af29:e95e:64ff:df81/128",
"2a05:d014:1815:3400:d784:e5dd:8e0:67cb/128", "2a05:d014:1815:3400:c7d6:f7f3:6cc1:30d1/128",
] "2a05:d014:1815:3400:d784:e5dd:8e0:67cb/128",
]

View File

@@ -146,7 +146,7 @@ func (m *Impl[K, V]) Close() {
func (m *Impl[K, V]) cleanupWorker() { func (m *Impl[K, V]) cleanupWorker() {
defer m.wg.Done() defer m.wg.Done()
batch := make([]deleteReq[K], 0, 64) batch := make([]deleteReq[K], 0, 64)
ticker := time.NewTicker(10 * time.Millisecond) ticker := time.NewTicker(500 * time.Millisecond)
defer ticker.Stop() defer ticker.Stop()
flush := func() { flush := func() {

View File

@@ -32,7 +32,7 @@ func TestImpl(t *testing.T) {
// Deletion of expired entries after Get is deferred to a background worker. // Deletion of expired entries after Get is deferred to a background worker.
// Assert it eventually disappears from the map. // Assert it eventually disappears from the map.
deadline := time.Now().Add(200 * time.Millisecond) deadline := time.Now().Add(700 * time.Millisecond)
for time.Now().Before(deadline) { for time.Now().Before(deadline) {
if dm.Len() == 0 { if dm.Len() == 0 {
break break

View File

@@ -1,14 +1,16 @@
import React, { useState, useEffect, useMemo } from 'react'; import React, { useState, useEffect, useMemo } from "react";
import styles from './styles.module.css'; import styles from "./styles.module.css";
// A helper function to perform SHA-256 hashing. // A helper function to perform SHA-256 hashing.
// It takes a string, encodes it, hashes it, and returns a hex string. // It takes a string, encodes it, hashes it, and returns a hex string.
async function sha256(message) { async function sha256(message) {
try { try {
const msgBuffer = new TextEncoder().encode(message); const msgBuffer = new TextEncoder().encode(message);
const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer); const hashBuffer = await crypto.subtle.digest("SHA-256", msgBuffer);
const hashArray = Array.from(new Uint8Array(hashBuffer)); const hashArray = Array.from(new Uint8Array(hashBuffer));
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); const hashHex = hashArray
.map((b) => b.toString(16).padStart(2, "0"))
.join("");
return hashHex; return hashHex;
} catch (error) { } catch (error) {
console.error("Hashing failed:", error); console.error("Hashing failed:", error);
@@ -21,21 +23,42 @@ const generateRandomHex = (bytes = 16) => {
const buffer = new Uint8Array(bytes); const buffer = new Uint8Array(bytes);
crypto.getRandomValues(buffer); crypto.getRandomValues(buffer);
return Array.from(buffer) return Array.from(buffer)
.map(byte => byte.toString(16).padStart(2, '0')) .map((byte) => byte.toString(16).padStart(2, "0"))
.join(''); .join("");
}; };
// Icon components for better visual feedback // Icon components for better visual feedback
const CheckIcon = () => ( const CheckIcon = () => (
<svg xmlns="http://www.w3.org/2000/svg" className={styles.iconGreen} fill="none" viewBox="0 0 24 24" stroke="currentColor"> <svg
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" /> xmlns="http://www.w3.org/2000/svg"
className={styles.iconGreen}
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"
/>
</svg> </svg>
); );
const XCircleIcon = () => ( const XCircleIcon = () => (
<svg xmlns="http://www.w3.org/2000/svg" className={styles.iconRed} fill="none" viewBox="0 0 24 24" stroke="currentColor"> <svg
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z" /> xmlns="http://www.w3.org/2000/svg"
className={styles.iconRed}
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"
/>
</svg> </svg>
); );
@@ -46,7 +69,7 @@ export default function App() {
// State for the nonce, which is the variable we can change // State for the nonce, which is the variable we can change
const [nonce, setNonce] = useState(0); const [nonce, setNonce] = useState(0);
// State to store the resulting hash // State to store the resulting hash
const [hash, setHash] = useState(''); const [hash, setHash] = useState("");
// A flag to indicate if the current hash is the "winning" one // A flag to indicate if the current hash is the "winning" one
const [isMining, setIsMining] = useState(false); const [isMining, setIsMining] = useState(false);
const [isFound, setIsFound] = useState(false); const [isFound, setIsFound] = useState(false);
@@ -55,7 +78,10 @@ export default function App() {
const difficulty = "00"; const difficulty = "00";
// Memoize the combined data to avoid recalculating on every render // Memoize the combined data to avoid recalculating on every render
const combinedData = useMemo(() => `${challenge}${nonce}`, [challenge, nonce]); const combinedData = useMemo(
() => `${challenge}${nonce}`,
[challenge, nonce],
);
// This effect hook recalculates the hash whenever the combinedData changes. // This effect hook recalculates the hash whenever the combinedData changes.
useEffect(() => { useEffect(() => {
@@ -68,7 +94,9 @@ export default function App() {
} }
}; };
calculateHash(); calculateHash();
return () => { isMounted = false; }; return () => {
isMounted = false;
};
}, [combinedData, difficulty]); }, [combinedData, difficulty]);
// This effect handles the automatic mining process // This effect handles the automatic mining process
@@ -93,7 +121,7 @@ export default function App() {
// Update the UI periodically to avoid freezing the browser // Update the UI periodically to avoid freezing the browser
if (miningNonce % 100 === 0) { if (miningNonce % 100 === 0) {
setNonce(miningNonce); setNonce(miningNonce);
await new Promise(resolve => setTimeout(resolve, 0)); // Yield to the browser await new Promise((resolve) => setTimeout(resolve, 0)); // Yield to the browser
} }
} }
}; };
@@ -102,28 +130,27 @@ export default function App() {
return () => { return () => {
continueMining = false; continueMining = false;
} };
}, [isMining, challenge, nonce, difficulty]); }, [isMining, challenge, nonce, difficulty]);
const handleMineClick = () => { const handleMineClick = () => {
setIsMining(true); setIsMining(true);
} };
const handleStopClick = () => { const handleStopClick = () => {
setIsMining(false); setIsMining(false);
} };
const handleResetClick = () => { const handleResetClick = () => {
setIsMining(false); setIsMining(false);
setNonce(0); setNonce(0);
} };
const handleNewChallengeClick = () => { const handleNewChallengeClick = () => {
setIsMining(false); setIsMining(false);
setChallenge(generateRandomHex(16)); setChallenge(generateRandomHex(16));
setNonce(0); setNonce(0);
} };
// Helper to render the hash with colored leading characters // Helper to render the hash with colored leading characters
const renderHash = () => { const renderHash = () => {
@@ -153,12 +180,46 @@ export default function App() {
<div className={styles.block}> <div className={styles.block}>
<h2 className={styles.blockTitle}>2. Nonce</h2> <h2 className={styles.blockTitle}>2. Nonce</h2>
<div className={styles.nonceControls}> <div className={styles.nonceControls}>
<button onClick={() => setNonce(n => n - 1)} disabled={isMining} className={styles.nonceButton}> <button
<svg xmlns="http://www.w3.org/2000/svg" className={styles.iconSmall} fill="none" viewBox="0 0 24 24" stroke="currentColor"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M20 12H4" /></svg> onClick={() => setNonce((n) => n - 1)}
disabled={isMining}
className={styles.nonceButton}
>
<svg
xmlns="http://www.w3.org/2000/svg"
className={styles.iconSmall}
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M20 12H4"
/>
</svg>
</button> </button>
<span className={styles.nonceValue}>{nonce}</span> <span className={styles.nonceValue}>{nonce}</span>
<button onClick={() => setNonce(n => n + 1)} disabled={isMining} className={styles.nonceButton}> <button
<svg xmlns="http://www.w3.org/2000/svg" className={styles.iconSmall} fill="none" viewBox="0 0 24 24" stroke="currentColor"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 4v16m8-8H4" /></svg> onClick={() => setNonce((n) => n + 1)}
disabled={isMining}
className={styles.nonceButton}
>
<svg
xmlns="http://www.w3.org/2000/svg"
className={styles.iconSmall}
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M12 4v16m8-8H4"
/>
</svg>
</button> </button>
</div> </div>
</div> </div>
@@ -172,13 +233,26 @@ export default function App() {
{/* Arrow pointing down */} {/* Arrow pointing down */}
<div className={styles.arrowContainer}> <div className={styles.arrowContainer}>
<svg xmlns="http://www.w3.org/2000/svg" className={styles.iconGray} fill="none" viewBox="0 0 24 24" stroke="currentColor"> <svg
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 14l-7 7m0 0l-7-7m7 7V3" /> xmlns="http://www.w3.org/2000/svg"
className={styles.iconGray}
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M19 14l-7 7m0 0l-7-7m7 7V3"
/>
</svg> </svg>
</div> </div>
{/* Hash Output Block */} {/* Hash Output Block */}
<div className={`${styles.hashContainer} ${isFound ? styles.hashContainerSuccess : styles.hashContainerError}`}> <div
className={`${styles.hashContainer} ${isFound ? styles.hashContainerSuccess : styles.hashContainerError}`}
>
<div className={styles.hashContent}> <div className={styles.hashContent}>
<div className={styles.hashText}> <div className={styles.hashText}>
<h2 className={styles.blockTitle}>4. Resulting Hash (SHA-256)</h2> <h2 className={styles.blockTitle}>4. Resulting Hash (SHA-256)</h2>
@@ -193,18 +267,30 @@ export default function App() {
{/* Mining Controls */} {/* Mining Controls */}
<div className={styles.buttonContainer}> <div className={styles.buttonContainer}>
{!isMining ? ( {!isMining ? (
<button onClick={handleMineClick} className={`${styles.button} ${styles.buttonCyan}`}> <button
onClick={handleMineClick}
className={`${styles.button} ${styles.buttonCyan}`}
>
Auto-Mine Auto-Mine
</button> </button>
) : ( ) : (
<button onClick={handleStopClick} className={`${styles.button} ${styles.buttonYellow}`}> <button
onClick={handleStopClick}
className={`${styles.button} ${styles.buttonYellow}`}
>
Stop Mining Stop Mining
</button> </button>
)} )}
<button onClick={handleNewChallengeClick} className={`${styles.button} ${styles.buttonIndigo}`}> <button
onClick={handleNewChallengeClick}
className={`${styles.button} ${styles.buttonIndigo}`}
>
New Challenge New Challenge
</button> </button>
<button onClick={handleResetClick} className={`${styles.button} ${styles.buttonGray}`}> <button
onClick={handleResetClick}
className={`${styles.button} ${styles.buttonGray}`}
>
Reset Nonce Reset Nonce
</button> </button>
</div> </div>

View File

@@ -48,7 +48,9 @@
background-color: rgb(31 41 55); background-color: rgb(31 41 55);
padding: 1.5rem; padding: 1.5rem;
border-radius: 0.5rem; border-radius: 0.5rem;
box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); box-shadow:
0 10px 15px -3px rgb(0 0 0 / 0.1),
0 4px 6px -4px rgb(0 0 0 / 0.1);
height: 100%; height: 100%;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -158,7 +160,9 @@
.hashContainer { .hashContainer {
padding: 1.5rem; padding: 1.5rem;
border-radius: 0.5rem; border-radius: 0.5rem;
box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); box-shadow:
0 10px 15px -3px rgb(0 0 0 / 0.1),
0 4px 6px -4px rgb(0 0 0 / 0.1);
transition: all 300ms; transition: all 300ms;
border: 2px solid; border: 2px solid;
} }

View File

@@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Add iplist2rule tool that lets admins turn an IP address blocklist into an Anubis ruleset. - Add iplist2rule tool that lets admins turn an IP address blocklist into an Anubis ruleset.
- Add Polish locale ([#1292](https://github.com/TecharoHQ/anubis/pull/1309)) - Add Polish locale ([#1292](https://github.com/TecharoHQ/anubis/pull/1309))
- Fix honeypot and imprint links missing `BASE_PREFIX` when deployed behind a path prefix ([#1402](https://github.com/TecharoHQ/anubis/issues/1402)) - Fix honeypot and imprint links missing `BASE_PREFIX` when deployed behind a path prefix ([#1402](https://github.com/TecharoHQ/anubis/issues/1402))
- Improve idle performance in memory storage
<!-- This changes the project to: --> <!-- This changes the project to: -->

View File

@@ -5,4 +5,4 @@
"type": "generated-index", "type": "generated-index",
"description": "Tradeoffs and considerations you may want to keep in mind when using Anubis." "description": "Tradeoffs and considerations you may want to keep in mind when using Anubis."
} }
} }

View File

@@ -5,4 +5,4 @@
"type": "generated-index", "type": "generated-index",
"description": "Detailed information about configuring parts of Anubis." "description": "Detailed information about configuring parts of Anubis."
} }
} }

View File

@@ -2,4 +2,4 @@
"label": "Challenges", "label": "Challenges",
"position": 10, "position": 10,
"link": null "link": null
} }

View File

@@ -243,16 +243,16 @@ function regexSafe(input: string): string;
`regexSafe` takes a string and escapes it for safe use inside of a regular expression. This is useful when you are creating regular expressions from headers or variables such as `remoteAddress`. `regexSafe` takes a string and escapes it for safe use inside of a regular expression. This is useful when you are creating regular expressions from headers or variables such as `remoteAddress`.
| Input | Output | | Input | Output |
| :------------------------ | :------------------------------ | | :------------------------- | :-------------- |
| `regexSafe("1.2.3.4")` | `1\\.2\\.3\\.4` | | `regexSafe("1.2.3.4")` | `1\\.2\\.3\\.4` |
| `regexSafe("techaro.lol")` | `techaro\\.lol` | | `regexSafe("techaro.lol")` | `techaro\\.lol` |
| `regexSafe("star*")` | `star\\*` | | `regexSafe("star*")` | `star\\*` |
| `regexSafe("plus+")` | `plus\\+` | | `regexSafe("plus+")` | `plus\\+` |
| `regexSafe("{braces}")` | `\\{braces\\}` | | `regexSafe("{braces}")` | `\\{braces\\}` |
| `regexSafe("start^")` | `start\\^` | | `regexSafe("start^")` | `start\\^` |
| `regexSafe("back\\slash")` | `back\\\\slash` | | `regexSafe("back\\slash")` | `back\\\\slash` |
| `regexSafe("dash-dash")` | `dash\\-dash` | | `regexSafe("dash-dash")` | `dash\\-dash` |
### `segments` ### `segments`
@@ -301,9 +301,9 @@ function arpaReverseIP(ip: string): string;
`arpaReverseIP` takes an IP address and returns its value in [ARPA notation](https://www.ietf.org/rfc/rfc2317.html). This can be useful when matching PTR record patterns. `arpaReverseIP` takes an IP address and returns its value in [ARPA notation](https://www.ietf.org/rfc/rfc2317.html). This can be useful when matching PTR record patterns.
| Input | Output | | Input | Output |
| :----------------------------- | :------------------------------------------------------------------- | | :----------------------------- | :---------------------------------------------------------------- |
| `arpaReverseIP("1.2.3.4")` | `4.3.2.1` | | `arpaReverseIP("1.2.3.4")` | `4.3.2.1` |
| `arpaReverseIP("2001:db8::1")` | `1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2` | | `arpaReverseIP("2001:db8::1")` | `1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2` |
#### `lookupHost` #### `lookupHost`

View File

@@ -89,4 +89,4 @@ If you want to deny all traffic except what you explicitly allow, add a catch-al
- The implicit allow rule is always last and cannot be removed. - The implicit allow rule is always last and cannot be removed.
- Use your logs to monitor what traffic is being allowed by default. - Use your logs to monitor what traffic is being allowed by default.
See [Policy Definitions](./policies) for more details on writing rules. See [Policy Definitions](./policies) for more details on writing rules.

View File

@@ -5,4 +5,4 @@
"type": "generated-index", "type": "generated-index",
"description": "Detailed information about individual environments (such as HTTP servers, platforms, etc.) Anubis is known to work with." "description": "Detailed information about individual environments (such as HTTP servers, platforms, etc.) Anubis is known to work with."
} }
} }

View File

@@ -94,10 +94,8 @@ containers:
- ALL - ALL
seccompProfile: seccompProfile:
type: RuntimeDefault type: RuntimeDefault
``` ```
Then add a Service entry for Anubis: Then add a Service entry for Anubis:
```yaml ```yaml

View File

@@ -1,8 +1,2 @@
# /etc/nginx/conf-anubis.inc # /etc/nginx/conf-anubis.inc # Forward to anubis location / { proxy_set_header
Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://anubis; }
# Forward to anubis
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://anubis;
}

View File

@@ -75,7 +75,7 @@ services:
# Telling Anubis, where to listen for Traefik # Telling Anubis, where to listen for Traefik
- BIND=:8080 - BIND=:8080
# Telling Anubis to do redirect — ensure there is a space after '=' # Telling Anubis to do redirect — ensure there is a space after '='
- 'TARGET= ' - "TARGET= "
# Specifies which domains Anubis is allowed to redirect to. # Specifies which domains Anubis is allowed to redirect to.
- REDIRECT_DOMAINS=example.com - REDIRECT_DOMAINS=example.com
# Should be the full external URL for Anubis (including scheme) # Should be the full external URL for Anubis (including scheme)

View File

@@ -5,4 +5,4 @@
"type": "generated-index", "type": "generated-index",
"description": "Information about getting specific frameworks or tools working with Anubis." "description": "Information about getting specific frameworks or tools working with Anubis."
} }
} }

View File

@@ -5,4 +5,4 @@
"type": "generated-index", "type": "generated-index",
"description": "Honeypot features in Anubis, allowing Anubis to passively detect malicious crawlers." "description": "Honeypot features in Anubis, allowing Anubis to passively detect malicious crawlers."
} }
} }

View File

@@ -67,7 +67,7 @@ Currently the following settings are configurable via the policy file:
Anubis uses these environment variables for configuration: Anubis uses these environment variables for configuration:
| Environment Variable | Default value | Explanation | | Environment Variable | Default value | Explanation |
|:-------------------------------|:------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | :----------------------------- | :---------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ASSET_LOOKUP_HEADER` | unset | <EO /> If set, use the contents of this header in requests when looking up custom assets in `OVERLAY_FOLDER`. See [Header-based overlay dispatch](./botstopper.mdx#header-based-overlay-dispatch) for more details. | | `ASSET_LOOKUP_HEADER` | unset | <EO /> If set, use the contents of this header in requests when looking up custom assets in `OVERLAY_FOLDER`. See [Header-based overlay dispatch](./botstopper.mdx#header-based-overlay-dispatch) for more details. |
| `BASE_PREFIX` | unset | If set, adds a global prefix to all Anubis endpoints (everything starting with `/.within.website/x/anubis/`). For example, setting this to `/myapp` would make Anubis accessible at `/myapp/` instead of `/`. This is useful when running Anubis behind a reverse proxy that routes based on path prefixes. | | `BASE_PREFIX` | unset | If set, adds a global prefix to all Anubis endpoints (everything starting with `/.within.website/x/anubis/`). For example, setting this to `/myapp` would make Anubis accessible at `/myapp/` instead of `/`. This is useful when running Anubis behind a reverse proxy that routes based on path prefixes. |
| `BIND` | `:8923` | The network address that Anubis listens on. For `unix`, set this to a path: `/run/anubis/instance.sock` | | `BIND` | `:8923` | The network address that Anubis listens on. For `unix`, set this to a path: `/run/anubis/instance.sock` |
@@ -123,7 +123,7 @@ If you don't know or understand what these settings mean, ignore them. These are
| `TARGET_DISABLE_KEEPALIVE` | `false` | If `true`, disables HTTP keep-alive for connections to the target backend. Useful for backends that don't handle keep-alive properly. | | `TARGET_DISABLE_KEEPALIVE` | `false` | If `true`, disables HTTP keep-alive for connections to the target backend. Useful for backends that don't handle keep-alive properly. |
| `TARGET_HOST` | unset | If set, overrides the Host header in requests forwarded to `TARGET`. | | `TARGET_HOST` | unset | If set, overrides the Host header in requests forwarded to `TARGET`. |
| `TARGET_INSECURE_SKIP_VERIFY` | `false` | If `true`, skip TLS certificate validation for targets that listen over `https`. If your backend does not listen over `https`, ignore this setting. | | `TARGET_INSECURE_SKIP_VERIFY` | `false` | If `true`, skip TLS certificate validation for targets that listen over `https`. If your backend does not listen over `https`, ignore this setting. |
| `TARGET_SNI` | unset | If set, TLS handshake hostname when forwarding requests to the `TARGET`. If set to auto, use Host header. | | `TARGET_SNI` | unset | If set, TLS handshake hostname when forwarding requests to the `TARGET`. If set to auto, use Host header. |
</details> </details>

View File

@@ -5,4 +5,4 @@
"type": "generated-index", "type": "generated-index",
"description": "Various server roles you will need to keep in mind with Anubis." "description": "Various server roles you will need to keep in mind with Anubis."
} }
} }

View File

@@ -5,4 +5,4 @@
"type": "generated-index", "type": "generated-index",
"description": "How Anubis is designed and the tradeoffs it makes." "description": "How Anubis is designed and the tradeoffs it makes."
} }
} }

View File

@@ -5,4 +5,4 @@
"type": "generated-index", "type": "generated-index",
"description": "Guides and suggestions to make Anubis development go smoothly for everyone." "description": "Guides and suggestions to make Anubis development go smoothly for everyone."
} }
} }

View File

@@ -0,0 +1,13 @@
# AI Coding Policy
At some level it would be nice to be able to have the following AI coding policy from an ideological standpoint:
> Anubis does not accept code made primarily with the use of agentic AI tools such as Claude Code, Gemini CLI, GitHub Copilot, Zed, OpenCode, or any other similar tools. Please do not use them when contributing to this repo.
However, I'd be in violation by doing this because I have knowingly committed minor bits of code to the Anubis repo that were generated by AI tools (mostly things for smoke tests).
As such, Anubis is taking more of a centrist approach with regards to AI coding tools: regardless of what tool you use to make contributions to Anubis, when you sign off your code, you are taking responsibility for what you commit. You are also expected to understand what you are changing, what the implications are, and all other relevant factors.
If you use AI coding tools for a majority of your committed work, you MUST disclose it with [the `Assisted-by` footer](https://xeiaso.net/notes/2025/assisted-by-footer/). The Anubis maintainers will be using tooling that looks for these footers and will prioritize scrutiny and level of attention appropriately.
In order to ensure compliance with this policy, language has been placed in `AGENTS.md` and `CLAUDE.md` to entice AI coding tools to add these footers.

View File

@@ -5,4 +5,4 @@
"type": "generated-index", "type": "generated-index",
"description": "Information for users on sites that use Anubis." "description": "Information for users on sites that use Anubis."
} }
} }

View File

@@ -1,62 +1,62 @@
import { themes as prismThemes } from 'prism-react-renderer'; import { themes as prismThemes } from "prism-react-renderer";
import type { Config } from '@docusaurus/types'; import type { Config } from "@docusaurus/types";
import type * as Preset from '@docusaurus/preset-classic'; import type * as Preset from "@docusaurus/preset-classic";
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...) // This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
const config: Config = { const config: Config = {
title: 'Anubis', title: "Anubis",
tagline: 'Weigh the soul of incoming HTTP requests to protect your website!', tagline: "Weigh the soul of incoming HTTP requests to protect your website!",
favicon: 'img/favicon.ico', favicon: "img/favicon.ico",
// Set the production url of your site here // Set the production url of your site here
url: 'https://anubis.techaro.lol', url: "https://anubis.techaro.lol",
// Set the /<baseUrl>/ pathname under which your site is served // Set the /<baseUrl>/ pathname under which your site is served
// For GitHub pages deployment, it is often '/<projectName>/' // For GitHub pages deployment, it is often '/<projectName>/'
baseUrl: '/', baseUrl: "/",
// GitHub pages deployment config. // GitHub pages deployment config.
// If you aren't using GitHub pages, you don't need these. // If you aren't using GitHub pages, you don't need these.
organizationName: 'TecharoHQ', // Usually your GitHub org/user name. organizationName: "TecharoHQ", // Usually your GitHub org/user name.
projectName: 'anubis', // Usually your repo name. projectName: "anubis", // Usually your repo name.
onBrokenLinks: 'throw', onBrokenLinks: "throw",
onBrokenMarkdownLinks: 'warn', onBrokenMarkdownLinks: "warn",
// Even if you don't use internationalization, you can use this field to set // Even if you don't use internationalization, you can use this field to set
// useful metadata like html lang. For example, if your site is Chinese, you // useful metadata like html lang. For example, if your site is Chinese, you
// may want to replace "en" with "zh-Hans". // may want to replace "en" with "zh-Hans".
i18n: { i18n: {
defaultLocale: 'en', defaultLocale: "en",
locales: ['en'], locales: ["en"],
}, },
markdown: { markdown: {
mermaid: true, mermaid: true,
}, },
themes: ['@docusaurus/theme-mermaid'], themes: ["@docusaurus/theme-mermaid"],
presets: [ presets: [
[ [
'classic', "classic",
{ {
blog: { blog: {
showReadingTime: true, showReadingTime: true,
feedOptions: { feedOptions: {
type: ['rss', 'atom', "json"], type: ["rss", "atom", "json"],
xslt: true, xslt: true,
}, },
editUrl: 'https://github.com/TecharoHQ/anubis/tree/main/docs/', editUrl: "https://github.com/TecharoHQ/anubis/tree/main/docs/",
onInlineTags: 'warn', onInlineTags: "warn",
onInlineAuthors: 'warn', onInlineAuthors: "warn",
onUntruncatedBlogPosts: 'throw', onUntruncatedBlogPosts: "throw",
}, },
docs: { docs: {
sidebarPath: './sidebars.ts', sidebarPath: "./sidebars.ts",
editUrl: 'https://github.com/TecharoHQ/anubis/tree/main/docs/', editUrl: "https://github.com/TecharoHQ/anubis/tree/main/docs/",
}, },
theme: { theme: {
customCss: './src/css/custom.css', customCss: "./src/css/custom.css",
}, },
} satisfies Preset.Options, } satisfies Preset.Options,
], ],
@@ -67,47 +67,47 @@ const config: Config = {
respectPrefersColorScheme: true, respectPrefersColorScheme: true,
}, },
// Replace with your project's social card // Replace with your project's social card
image: 'img/social-card.jpg', image: "img/social-card.jpg",
navbar: { navbar: {
title: 'Anubis', title: "Anubis",
logo: { logo: {
alt: 'A happy jackal woman with brown hair and red eyes', alt: "A happy jackal woman with brown hair and red eyes",
src: 'img/favicon.webp', src: "img/favicon.webp",
}, },
items: [ items: [
{ to: '/blog', label: 'Blog', position: 'left' }, { to: "/blog", label: "Blog", position: "left" },
{ {
type: 'docSidebar', type: "docSidebar",
sidebarId: 'tutorialSidebar', sidebarId: "tutorialSidebar",
position: 'left', position: "left",
label: 'Docs', label: "Docs",
}, },
{ {
to: '/docs/admin/botstopper', to: "/docs/admin/botstopper",
label: "Unbranded Version", label: "Unbranded Version",
position: "left" position: "left",
}, },
{ {
href: 'https://github.com/TecharoHQ/anubis', href: "https://github.com/TecharoHQ/anubis",
label: 'GitHub', label: "GitHub",
position: 'right', position: "right",
}, },
{ {
href: 'https://github.com/sponsors/Xe', href: "https://github.com/sponsors/Xe",
label: "Sponsor the Project", label: "Sponsor the Project",
position: 'right' position: "right",
}, },
], ],
}, },
footer: { footer: {
style: 'dark', style: "dark",
links: [ links: [
{ {
title: 'Docs', title: "Docs",
items: [ items: [
{ {
label: 'Intro', label: "Intro",
to: '/docs/', to: "/docs/",
}, },
{ {
label: "Installation", label: "Installation",
@@ -116,32 +116,32 @@ const config: Config = {
], ],
}, },
{ {
title: 'Community', title: "Community",
items: [ items: [
{ {
label: 'GitHub Discussions', label: "GitHub Discussions",
href: 'https://github.com/TecharoHQ/anubis/discussions', href: "https://github.com/TecharoHQ/anubis/discussions",
}, },
{ {
label: 'Bluesky', label: "Bluesky",
href: 'https://bsky.app/profile/techaro.lol', href: "https://bsky.app/profile/techaro.lol",
}, },
], ],
}, },
{ {
title: 'More', title: "More",
items: [ items: [
{ {
label: 'Blog', label: "Blog",
to: '/blog', to: "/blog",
}, },
{ {
label: 'GitHub', label: "GitHub",
href: 'https://github.com/TecharoHQ/anubis', href: "https://github.com/TecharoHQ/anubis",
}, },
{ {
label: 'Status', label: "Status",
href: 'https://techarohq.github.io/status/' href: "https://techarohq.github.io/status/",
}, },
], ],
}, },
@@ -153,13 +153,13 @@ const config: Config = {
darkTheme: prismThemes.dracula, darkTheme: prismThemes.dracula,
magicComments: [ magicComments: [
{ {
className: 'code-block-diff-add-line', className: "code-block-diff-add-line",
line: 'diff-add' line: "diff-add",
}, },
{ {
className: 'code-block-diff-remove-line', className: "code-block-diff-remove-line",
line: 'diff-remove' line: "diff-remove",
} },
], ],
}, },
} satisfies Preset.ThemeConfig, } satisfies Preset.ThemeConfig,

View File

@@ -21,4 +21,4 @@ spec:
service: service:
name: anubis-docs name: anubis-docs
port: port:
name: anubis name: anubis

View File

@@ -5,10 +5,10 @@ metadata:
spec: spec:
version: 3 version: 3
rules: rules:
- port: - port:
number: 80 number: 80
backend: backend:
service: service:
name: anubis-docs name: anubis-docs
port: port:
number: 80 number: 80

View File

@@ -6,9 +6,9 @@ spec:
selector: selector:
app: anubis-docs app: anubis-docs
ports: ports:
- port: 80 - port: 80
targetPort: 80 targetPort: 80
name: http name: http
- port: 8081 - port: 8081
targetPort: 8081 targetPort: 8081
name: anubis name: anubis

View File

@@ -1,4 +1,4 @@
import type {SidebarsConfig} from '@docusaurus/plugin-content-docs'; import type { SidebarsConfig } from "@docusaurus/plugin-content-docs";
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...) // This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
@@ -14,7 +14,7 @@ import type {SidebarsConfig} from '@docusaurus/plugin-content-docs';
*/ */
const sidebars: SidebarsConfig = { const sidebars: SidebarsConfig = {
// By default, Docusaurus generates a sidebar from the docs folder structure // By default, Docusaurus generates a sidebar from the docs folder structure
tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], tutorialSidebar: [{ type: "autogenerated", dirName: "." }],
// But you can create a sidebar manually // But you can create a sidebar manually
/* /*

View File

@@ -1,4 +1,4 @@
import styles from './styles.module.css'; import styles from "./styles.module.css";
export default function EnterpriseOnly({ link }) { export default function EnterpriseOnly({ link }) {
return ( return (
@@ -8,4 +8,4 @@ export default function EnterpriseOnly({ link }) {
</div> </div>
</a> </a>
); );
} }

Some files were not shown because too many files have changed in this diff Show More