Compare commits

...

71 Commits

Author SHA1 Message Date
Xe Iaso
8f2f0b506b chore: go mod tidy
Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-03-21 18:58:26 +00:00
Xe Iaso
17bdc15288 ci(yeet): add .exe for windows executables
Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-03-21 18:56:58 +00:00
Xe Iaso
960b577acc chore(test): go mod tidy
Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-03-21 18:53:48 +00:00
Xe Iaso
e88abfc061 ci(yeet): enable windows builds
This also requires a bump to the minimum go version (#1525), but
enables Windows builds. Windows is a bit of an experimental target
for Anubis (I don't personally have any windows machines), but it
compiles and should theoretically work.

This is probably very worth it, I'm not aware of any distributions
that need to package Anubis that don't have a supported version of
Go packaged. If your distro does not, please consider upgrading to
a supported version of Go.

Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-03-21 18:48:13 +00:00
BALLOON | FU-SEN
edbfd180b8 locales/ja: Change the position of the バージョン (version) (#1527)
When displayed in Japanese, the `バージョン` (version) is in the middle, but the version number is at the end, so it is displayed strangely. Improve this.

**"version_info":**
```
このウェブサイトはAnubisバージョンで動作しています
```
to
```
このウェブサイトはAnubisで動作しています バージョン
```

Signed-off-by: BALLOON | FU-SEN <5434159+fu-sen@users.noreply.github.com>
2026-03-21 06:36:40 +00:00
Xe Iaso
efde4f0dc7 docs(faq): document that disabling JIT makes Anubis slow (#1526)
* docs(faq): document that disabling JIT makes Anubis slow

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

* chore: fix spelling

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

---------

Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Xe Iaso <xe.iaso@techaro.lol>
2026-03-20 22:16:50 +00:00
Marielle Volz
24857f430f feat(data): add Citoid to good bots list (#1524)
* Add Wikimedia Foundation citoid services file

Wikimedia Foundation runs a service called citoid which retrieves citation metadata from urls in order to create formatted citations. 

This file contains the ip ranges allocated to the WMF (https://wikitech.wikimedia.org/wiki/IP_and_AS_allocations) from which the services make requests, as well as regex for the User-Agents from both services used to generate citations (citoid, and Zotero's translation-server which citoid makes requests to as well in order to generate the metadata).

Signed-off-by: Marielle Volz <marielle.volz@gmail.com>

* Add Wikimedia Citoid crawler to allowed list

Signed-off-by: Marielle Volz <marielle.volz@gmail.com>

* chore: update spelling

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

---------

Signed-off-by: Marielle Volz <marielle.volz@gmail.com>
Signed-off-by: Xe Iaso <me@xeiaso.net>
Co-authored-by: Xe Iaso <me@xeiaso.net>
2026-03-20 11:13:26 +00:00
Simon Rozman
e0ece7d333 feat(docs): Update HAProxy Advanced Variant documentation (#1521)
Added note on HAProxy's responsibility to handle Git HTTP and bot
traffic whitelisting.

Signed-off-by: Simon Rozman <simon@rozman.si>
2026-03-19 11:03:14 +00:00
fhoekstra
3eab1d873d (docs): Add instructions on using Anubis with envoy-gateway (#1460)
Signed-off-by: fhoekstra <32362869+fhoekstra@users.noreply.github.com>
2026-03-18 18:03:29 +00:00
Jason Cameron
c7b31d0ca9 fix: nil ptr deref (#1467)
Signed-off-by: Jason Cameron <jason.cameron@stanwith.me>
Signed-off-by: Jason Cameron <git@jasoncameron.dev>
2026-03-18 18:02:57 +00:00
Xe Iaso
3154ff5004 chore: add sponsor logo
Closes: #1472
Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-03-18 16:07:06 +00:00
Jason Cameron
5186d7d3ad chore: gofix (#1466)
Signed-off-by: Jason Cameron <jason.cameron@stanwith.me>
2026-03-18 14:17:28 +00:00
Xe Iaso
c6d968874d chore: update spelling
Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-03-18 14:15:35 +00:00
Xe Iaso
14a8d0c75e chore: add uvensys logo
Closes: #1517
Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-03-18 14:14:48 +00:00
Xe Iaso
0ea13dcee2 ci(ssh): disable homelab jobs because it's offline and i'm halfway across the world, oh well
Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-03-17 14:54:04 +00:00
dependabot[bot]
a2a4cdebd6 build(deps): bump the npm group across 1 directory with 6 updates (#1512)
Bumps the npm group with 6 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [preact](https://github.com/preactjs/preact) | `10.28.3` | `10.28.4` |
| [@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli) | `20.4.1` | `20.4.3` |
| [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional) | `20.4.1` | `20.4.3` |
| [baseline-browser-mapping](https://github.com/web-platform-dx/baseline-browser-mapping) | `2.9.19` | `2.10.0` |
| [cssnano](https://github.com/cssnano/cssnano) | `7.1.2` | `7.1.3` |
| [cssnano-preset-advanced](https://github.com/cssnano/cssnano) | `7.0.10` | `7.0.11` |



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

Updates `@commitlint/cli` from 20.4.1 to 20.4.3
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/cli/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v20.4.3/@commitlint/cli)

Updates `@commitlint/config-conventional` from 20.4.1 to 20.4.3
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/config-conventional/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v20.4.3/@commitlint/config-conventional)

Updates `baseline-browser-mapping` from 2.9.19 to 2.10.0
- [Release notes](https://github.com/web-platform-dx/baseline-browser-mapping/releases)
- [Commits](https://github.com/web-platform-dx/baseline-browser-mapping/compare/v2.9.19...v2.10.0)

Updates `cssnano` from 7.1.2 to 7.1.3
- [Release notes](https://github.com/cssnano/cssnano/releases)
- [Commits](https://github.com/cssnano/cssnano/compare/cssnano@7.1.2...cssnano@7.1.3)

Updates `cssnano-preset-advanced` from 7.0.10 to 7.0.11
- [Release notes](https://github.com/cssnano/cssnano/releases)
- [Commits](https://github.com/cssnano/cssnano/compare/cssnano-preset-advanced@7.0.10...cssnano-preset-advanced@7.0.11)

---
updated-dependencies:
- dependency-name: preact
  dependency-version: 10.28.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@commitlint/cli"
  dependency-version: 20.4.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@commitlint/config-conventional"
  dependency-version: 20.4.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: baseline-browser-mapping
  dependency-version: 2.10.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm
- dependency-name: cssnano
  dependency-version: 7.1.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: cssnano-preset-advanced
  dependency-version: 7.0.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-16 10:48:22 +00:00
dependabot[bot]
168fe79802 build(deps): bump the github-actions group across 1 directory with 11 updates (#1516)
Bumps the github-actions group with 11 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [actions/setup-node](https://github.com/actions/setup-node) | `6.2.0` | `6.3.0` |
| [actions/setup-go](https://github.com/actions/setup-go) | `6.2.0` | `6.3.0` |
| [docker/metadata-action](https://github.com/docker/metadata-action) | `5.10.0` | `6.0.0` |
| [docker/login-action](https://github.com/docker/login-action) | `3.7.0` | `4.0.0` |
| [actions/attest-build-provenance](https://github.com/actions/attest-build-provenance) | `3.2.0` | `4.1.0` |
| [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) | `3.12.0` | `4.0.0` |
| [docker/build-push-action](https://github.com/docker/build-push-action) | `6.18.0` | `7.0.0` |
| [actions-hub/kubectl](https://github.com/actions-hub/kubectl) | `1.35.1` | `1.35.2` |
| [dominikh/staticcheck-action](https://github.com/dominikh/staticcheck-action) | `1.4.0` | `1.4.1` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `6.0.0` | `7.0.0` |
| [shimataro/ssh-key-action](https://github.com/shimataro/ssh-key-action) | `2.7.0` | `2.8.0` |



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

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

Updates `docker/metadata-action` from 5.10.0 to 6.0.0
- [Release notes](https://github.com/docker/metadata-action/releases)
- [Commits](c299e40c65...030e881283)

Updates `docker/login-action` from 3.7.0 to 4.0.0
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](c94ce9fb46...b45d80f862)

Updates `actions/attest-build-provenance` from 3.2.0 to 4.1.0
- [Release notes](https://github.com/actions/attest-build-provenance/releases)
- [Changelog](https://github.com/actions/attest-build-provenance/blob/main/RELEASE.md)
- [Commits](96278af6ca...a2bbfa2537)

Updates `docker/setup-buildx-action` from 3.12.0 to 4.0.0
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](8d2750c68a...4d04d5d948)

Updates `docker/build-push-action` from 6.18.0 to 7.0.0
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](263435318d...d08e5c354a)

Updates `actions-hub/kubectl` from 1.35.1 to 1.35.2
- [Release notes](https://github.com/actions-hub/kubectl/releases)
- [Commits](3ece3793e7...5ada4e2c02)

Updates `dominikh/staticcheck-action` from 1.4.0 to 1.4.1
- [Release notes](https://github.com/dominikh/staticcheck-action/releases)
- [Changelog](https://github.com/dominikh/staticcheck-action/blob/master/CHANGES.md)
- [Commits](024238d289...9716614d41)

Updates `actions/upload-artifact` from 6.0.0 to 7.0.0
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](b7c566a772...bbbca2ddaa)

Updates `shimataro/ssh-key-action` from 2.7.0 to 2.8.0
- [Release notes](https://github.com/shimataro/ssh-key-action/releases)
- [Changelog](https://github.com/shimataro/ssh-key-action/blob/v2/CHANGELOG.md)
- [Commits](d4fffb5087...6b84f2e793)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 6.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: actions/setup-go
  dependency-version: 6.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: docker/metadata-action
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: docker/login-action
  dependency-version: 4.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/attest-build-provenance
  dependency-version: 4.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: docker/setup-buildx-action
  dependency-version: 4.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: docker/build-push-action
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions-hub/kubectl
  dependency-version: 1.35.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: dominikh/staticcheck-action
  dependency-version: 1.4.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: shimataro/ssh-key-action
  dependency-version: 2.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-16 06:44:18 -04:00
Max Chernoff
865ba0983e docs: remove developer/code-quality (#1475)
PR #1451 added `CONTRIBUTING.md`, but the commit message guidelines
there conflict with the ones in `developer/code-quality.md`. Since
`CONTRIBUTING.md` is newer, presumably the guidelines there are what's
expected from new commits. But after removing that section from
`code-quality.md`, there's not much content left, so this commit just
deletes the file entirely.

Signed-off-by: Max Chernoff <git@maxchernoff.ca>
2026-03-16 06:43:31 -04:00
Léane GRASSER
27c994d3ce chore(l10n): update French translation (#1496)
Replaces translations from MT engines or AI with better, human-made ones
:)

Signed-off-by: Léane GRASSER <leane.grasser@proton.me>
2026-03-16 06:43:05 -04:00
p0008874
22412d0e22 docs(known-instances): Add missing one. (#1500)
* docs(known-instances): Add missing one.

Dolphin Emulator, FFmpeg, and Valve's official wiki.

Signed-off-by: p0008874 <75534590+p0008874@users.noreply.github.com>

* Update known-instances.md

Signed-off-by: p0008874 <75534590+p0008874@users.noreply.github.com>

---------

Signed-off-by: p0008874 <75534590+p0008874@users.noreply.github.com>
2026-03-16 06:42:25 -04:00
Xe Iaso
c5ff5f0f26 chore: spelling
Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-03-16 10:42:06 +00:00
Max Chernoff
78fe07a78f feat(http): set "Cache-Control: no-store" on error responses (#1474)
* refactor(http): split long line in respondWithStatus

Signed-off-by: Max Chernoff <git@maxchernoff.ca>

* feat(http): set `Cache-Control: no-store` on error responses

Since #132, Anubis has set `Cache-Control: no-store` on challenge
responses. However, this does not apply to deny responses, meaning that
if Anubis is configured to block certain user agents and is behind a
caching reverse proxy, this error page will be cached and served to all
subsequent requests, even those with an allowed user agent. This commit
configures the error page responder to also set the `Cache-Control`
header, meaning that deny and challenge responses will now both have the
same behaviour.

Signed-off-by: Max Chernoff <git@maxchernoff.ca>

* chore(spelling): add new words to allowlist

Signed-off-by: Max Chernoff <git@maxchernoff.ca>

* chore(actions): bump Go version to fix govulncheck errors

Signed-off-by: Max Chernoff <git@maxchernoff.ca>

---------

Signed-off-by: Max Chernoff <git@maxchernoff.ca>
Signed-off-by: Xe Iaso <xe.iaso@techaro.lol>
Co-authored-by: Xe Iaso <xe.iaso@techaro.lol>
2026-03-16 10:36:40 +00:00
Xe Iaso
04fef9e033 ci: purge govulncheck, it's less signal than i hoped (#1515)
* ci: purge govulncheck, it's less signal than i hoped

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

* ci(go): use go stable

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

* ci: use go stable

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

---------

Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-03-16 10:30:43 +00:00
Mozi
fa518e1b8c docs: fix mixed tab/space indentation in Caddy config example (#1506)
Assisted-by: Claude Opus 4.6 via Copilot

Signed-off-by: Mozi <29089388+pzhlkj6612@users.noreply.github.com>
2026-03-12 16:35:53 +00:00
Xe Iaso
f38210fd84 docs(admin/policy): document ReadWritePaths for logging to files (#1469)
The default Anubis systemd configuration is very restrictive in
order to prevent any possible compromise of Anubis to be useful
by threat actors. As such, it assumes all logs will be pushed to
the system journal. Some administrators do not want Anubis' logs
to be pushed to the system journal and want Anubis to log to a
file instead.

This change documents how to set up ReadWritePaths in the Anubis
systemd configuration such that Anubis can lot to a file as
administrators expect.

Closes: #1468

Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-02-19 12:24:34 +00:00
Xe Iaso
35b5e78a0d chore: tag v1.25.0
Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-02-18 15:56:28 +00:00
Martin
4e0df8c643 feat(docs): Add HAProxy Configurations to Docs (#1424)
* Add HAProxy docs

* Add changes to Changelog

* Add CodeBlock import to haproxy.mdc

* Fix typos

* Add exceptions to spelling
2026-02-15 10:32:32 -05:00
dependabot[bot]
c34ec67777 build(deps): bump the npm group across 1 directory with 2 updates (#1452)
Bumps the npm group with 2 updates in the / directory: [preact](https://github.com/preactjs/preact) and [esbuild](https://github.com/evanw/esbuild).


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

Updates `esbuild` from 0.27.2 to 0.27.3
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.27.2...v0.27.3)

---
updated-dependencies:
- dependency-name: preact
  dependency-version: 10.28.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: esbuild
  dependency-version: 0.27.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-15 10:32:07 -05:00
dependabot[bot]
61026976ec build(deps): bump the github-actions group across 1 directory with 6 updates (#1453)
Bumps the github-actions group with 6 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [docker/login-action](https://github.com/docker/login-action) | `3.6.0` | `3.7.0` |
| [actions/attest-build-provenance](https://github.com/actions/attest-build-provenance) | `3.1.0` | `3.2.0` |
| [actions-hub/kubectl](https://github.com/actions-hub/kubectl) | `1.35.0` | `1.35.1` |
| [actions/cache](https://github.com/actions/cache) | `5.0.2` | `5.0.3` |
| [amannn/action-semantic-pull-request](https://github.com/amannn/action-semantic-pull-request) | `5.5.3` | `6.1.1` |
| [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) | `7.2.0` | `7.3.0` |



Updates `docker/login-action` from 3.6.0 to 3.7.0
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](5e57cd1181...c94ce9fb46)

Updates `actions/attest-build-provenance` from 3.1.0 to 3.2.0
- [Release notes](https://github.com/actions/attest-build-provenance/releases)
- [Changelog](https://github.com/actions/attest-build-provenance/blob/main/RELEASE.md)
- [Commits](00014ed6ed...96278af6ca)

Updates `actions-hub/kubectl` from 1.35.0 to 1.35.1
- [Release notes](https://github.com/actions-hub/kubectl/releases)
- [Commits](f6d776bd78...3ece3793e7)

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

Updates `amannn/action-semantic-pull-request` from 5.5.3 to 6.1.1
- [Release notes](https://github.com/amannn/action-semantic-pull-request/releases)
- [Changelog](https://github.com/amannn/action-semantic-pull-request/blob/main/CHANGELOG.md)
- [Commits](0723387faa...48f256284b)

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

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 3.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: actions/attest-build-provenance
  dependency-version: 3.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: actions-hub/kubectl
  dependency-version: 1.35.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: actions/cache
  dependency-version: 5.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: amannn/action-semantic-pull-request
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: astral-sh/setup-uv
  dependency-version: 7.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-15 10:31:51 -05:00
Xe Iaso
189c5c021c chore: sync logo submissions (#1455)
* chore: sync logo submissions

Closes: #1447
Closes: #1438
Signed-off-by: Xe Iaso <me@xeiaso.net>

* chore: update spelling

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

---------

Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-02-15 15:29:32 +00:00
Martin
dde186150b feat(docs): Add ANEXIA Sponsor logo (#1409)
* Add ANEXIA Sponsor logo

* Add changes to CHANGELOG.md

* Add missing words to spelling expect.txt

---------

Signed-off-by: Xe Iaso <xe.iaso@techaro.lol>
Co-authored-by: Xe Iaso <xe.iaso@techaro.lol>
2026-02-15 15:21:44 +00:00
Xe Iaso
a98f721957 docs: add AI coding tools policy (#1454)
* docs: add AI coding tools policy

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

* chore: remove symlinks

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

* docs(AGENTS): make compatible with opencode

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

* chore: update spelling

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

---------

Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-02-15 15:08:59 +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
Timon de Groot
57c0b2b22c Add IP mapped Perplexity user agents (#1393)
Perplexity has some proper documentation available for their crawlers,
with published IP addresses: https://docs.perplexity.ai/guides/bots.

Signed-off-by: Timon de Groot <timon.degroot@team.blue>
2026-01-15 19:57:31 -05:00
Thomas Arrow
186ffeb744 docs: clarify botstopper kubernetes instructions (#1404)
This makes it clear that when generating a kubernetes secret to pull the bot stopper image that:
- no email is required
- a user is required but the actual value of the username is not checked
- the GH token needs to be pasted in

Signed-off-by: Thomas Arrow <tarrow@users.noreply.github.com>
2026-01-15 11:13:10 +00:00
Xe Iaso
ff87aac4e7 fix(web): include base prefix in generated URLs (#1403)
* fix(web): include base prefix in generated URLs

Forgot to add the base prefix to these URLs. Committed a fix for this
and added a test to ensure this does not repeat. Oops!

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

* docs: update CHANGELOG

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

---------

Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-01-14 23:47:44 +00:00
Anton Kesy
3c76724aeb fix: correct typos (#1398) 2026-01-12 01:23:58 +00:00
Andrew Young
1db57e5d23 fix sponsor (Databento) logo size (#1395) 2026-01-09 23:42:03 +00:00
Xe Iaso
6fc2c3c857 docs: document how to import the default config (#1392)
Signed-off-by: Xe Iaso <me@xeiaso.net>
2026-01-08 16:14:52 +00:00
dependabot[bot]
149e864786 build(deps): bump preact from 10.28.0 to 10.28.1 in the npm group (#1387)
Bumps the npm group with 1 update: [preact](https://github.com/preactjs/preact).


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

---
updated-dependencies:
- dependency-name: preact
  dependency-version: 10.28.1
  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@jasoncameron.dev>
2026-01-05 21:44:28 -05:00
Jason Cameron
2aaee6c348 Revert "build(deps): bump the gomod group across 1 directory with 3 updates (…" (#1386) 2026-01-04 00:13:45 +00:00
dependabot[bot]
ebad69a4e1 build(deps): bump the gomod group across 1 directory with 3 updates (#1370)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jason Cameron <jason.cameron@stanwith.me>
2026-01-03 19:06:05 -05:00
lif
71147b4857 fix: respect Accept-Language quality factors in language detection (#1380)
The Accept-Language header parsing was not correctly handling quality
factors. When a browser sends "en-GB,de-DE;q=0.5", the expected behavior
is to prefer English (q=1.0 by default) over German (q=0.5).

The fix uses golang.org/x/text/language.ParseAcceptLanguage to properly
parse and sort language preferences by quality factor. It also adds base
language fallbacks (e.g., "en" for "en-GB") to ensure regional variants
match their parent languages when no exact match exists.

Fixes #1022

Signed-off-by: majiayu000 <1835304752@qq.com>
2026-01-02 08:01:43 -05:00
lif
cee7871ef8 fix: update SSL Labs IP addresses (#1377)
Signed-off-by: majiayu000 <1835304752@qq.com>
Co-authored-by: Jason Cameron <jason.cameron@stanwith.me>
2026-01-01 23:21:31 -05:00
Jason Cameron
26d258fb94 Update check-spelling metadata (#1379) 2026-01-01 23:02:15 +00:00
Xe Iaso
80a8e0a8ae chore: add Databento as diamond tier sponsor
Signed-off-by: Xe Iaso <me@xeiaso.net>
2025-12-30 10:56:58 -05:00
Xe Iaso
359613f35a feat: iplist2rule utility command (#1373)
* feat: iplist2rule utility command

Assisted-By: GLM 4.7 via Claude Code
Signed-off-by: Xe Iaso <me@xeiaso.net>

* docs: update CHANGELOG

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

* chore: fix spelling

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

* chore: fix spelling again

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

* feat(iplist2rule): add comment describing how rule was generated

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

* docs: add iplist2rule docs

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

* chore: fix spelling

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

---------

Signed-off-by: Xe Iaso <me@xeiaso.net>
2025-12-29 17:10:17 +00:00
Xe Iaso
1d8e98c5ec test(nginx): fix tests to work in GHA (#1372)
* test(nginx): fix tests to work in GHA

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

* fix(test): does this work lol

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

* fix(test): does this other thing work lol

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

* fix(test): pki folder location

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

---------

Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Jason Cameron <git@jasoncameron.dev>
Co-authored-by: Jason Cameron <git@jasoncameron.dev>
2025-12-28 23:59:48 -05:00
Jason Cameron
880020095c fix(test): remove interactive flag from nginx smoke test docker run command (#1371) 2025-12-29 03:14:50 +00:00
dependabot[bot]
f5728e96a1 build(deps-dev): bump esbuild from 0.27.1 to 0.27.2 in the npm group (#1368)
Co-authored-by: Jason Cameron <git@jsn.cam>
2025-12-28 22:07:44 -05:00
dependabot[bot]
bcf525dbcf build(deps): bump the github-actions group with 3 updates (#1369)
Co-authored-by: Jason Cameron <git@jasoncameron.dev>
2025-12-28 22:04:16 -05:00
Xe Iaso
d748dc9da8 test: basic nginx smoke test (#1365)
* docs: split nginx configuration files to their own directory

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

* test: add nginx config smoke test based on the config in the docs

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

---------

Signed-off-by: Xe Iaso <me@xeiaso.net>
2025-12-28 23:18:25 +00:00
p0008874
9b210d795e docs(known-instances): Alphabetical order + Add Valve Corporation (#1352)
Co-authored-by: Jason Cameron <git@jasoncameron.dev>
2025-12-26 01:05:26 +00:00
The Ninth
e084e5011e feat(localization): add Polish language translation (#1363)
(cherry picked from commit 1f9c2272e6)

Co-authored-by: bplajzer <b.plajzerr@gmail.com>
2025-12-25 15:14:04 -05:00
dependabot[bot]
2532478abd build(deps): bump the github-actions group with 4 updates (#1355)
Co-authored-by: Jason Cameron <git@jasoncameron.dev>
2025-12-24 01:02:48 -05:00
Xe Iaso
6d9c0abe74 chore: tag v1.24.0
Signed-off-by: Xe Iaso <me@xeiaso.net>
2025-12-23 21:17:59 -05:00
Xe Iaso
a37068a423 fix(default-config): remove browser detection logic (#1360)
Looks like these rules don't work anymore.

Closes: #1353

Signed-off-by: Xe Iaso <me@xeiaso.net>
2025-12-24 02:13:54 +00:00
Xe Iaso
9d9be61c24 fix(default-config): must-accept-rule on browsers only (#1350)
TIL docker clients don't include the Accept header all the time. I would
have thought they did that. Oops.

Closes: #1346

Signed-off-by: Xe Iaso <me@xeiaso.net>
2025-12-19 20:42:24 +00:00
Michael
535ed74b17 i18n(de): improve consistency and wording (#1348)
- Use consistent informal address (fix simplified_explanation)
- Translate "protected_from" ("From" → "Von")
- Standardize "Webseite" → "Website"
- Use more natural phrasing:
  - "Berechnung wird durchgeführt" → "Berechnung läuft"
  - "Zur Hauptseite" → "Zur Startseite"
  - Replace awkward "sozialen Vertrag" phrasing
- "Fingerabdruckerkennung" → "Browser-Fingerprinting" (more common)
- Improve sentence structure and punctuation

Signed-off-by: Michael <87752300+michi-onl@users.noreply.github.com>
2025-12-19 00:29:49 +00:00
Xe Iaso
ba8a1b7caf fix(honeypot/naive): right, we want the client IP, not the load balancer IP
Signed-off-by: Xe Iaso <me@xeiaso.net>
2025-12-16 04:44:59 -05:00
Xe Iaso
40afc13d7f fix(honeypot/naive): implement better IP parsing logic
Signed-off-by: Xe Iaso <me@xeiaso.net>
2025-12-16 04:32:45 -05:00
Xe Iaso
122e4bc072 feat: first implementation of honeypot logic (#1342)
* feat: first implementation of honeypot logic

This is a bit of an experiment, stick with me.

The core idea here is that badly written crawlers are that: badly
written. They look for anything that contains `<a href="whatever" />`
tags and will blindly use those values to recurse. This takes advantage
of that by hiding a link in a `<script>` tag like this:

```html
<script type="ignore"><a href="/bots-only">Don't click</a></script>
```

Browsers will ignore it because they have no handler for the "ignore"
script type.

This current draft is very unoptimized (it takes like 7 seconds to
generate a page on my tower), however switching spintax libraries will
make this much faster.

The hope is to make this pluggable with WebAssembly such that we force
administrators to choose a storage method. First we crawl before we
walk.

The AI involvement in this commit is limited to the spintax in
affirmations.txt, spintext.txt, and titles.txt. This generates a bunch
of "pseudoprofound bullshit" like the following:

> This Restoration to Balance & Alignment
>
> There's a moment when creators are being called to realize that the work
> can't be reduced to results, but about energy. We don't innovate products
> by pushing harder, we do it by holding the vision. Because momentum can't
> be forced, it unfolds over time when culture are moving in the same
> direction. We're being invited into a paradigm shift in how we think
> about innovation. [...]

This is intended to "look" like normal article text. As this is a first
draft, this sucks and will be improved upon.

Assisted-by: GLM 4.6, ChatGPT, GPT-OSS 120b
Signed-off-by: Xe Iaso <me@xeiaso.net>

* fix(honeypot/naive): optimize hilariously

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

* feat(honeypot/naive): attempt to automatically filter out based on crawling

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

* fix(lib): use mazeGen instead of bsGen

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

* docs: add honeypot docs

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

* chore(test): go mod tidy

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

* chore: fix spelling metadata

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

* chore: spelling

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

---------

Signed-off-by: Xe Iaso <me@xeiaso.net>
2025-12-16 04:14:29 -05:00
293 changed files with 6639 additions and 2987 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,12 +1,12 @@
<!-- <!--
delete me and describe your change here, give enough context for a maintainer to understand what and why delete me and describe your change here, give enough context for a maintainer to understand what and why
See https://anubis.techaro.lol/docs/developer/code-quality for more information See https://github.com/TecharoHQ/anubis/blob/main/CONTRIBUTING.md for more information
--> -->
Checklist: Checklist:
- [ ] Added a description of the changes to the `[Unreleased]` section of docs/docs/CHANGELOG.md - [ ] Added a description of the changes to the `[Unreleased]` section of docs/docs/CHANGELOG.md
- [ ] Added test cases to [the relevant parts of the codebase](https://anubis.techaro.lol/docs/developer/code-quality) - [ ] Added test cases to [the relevant parts of the codebase](https://github.com/TecharoHQ/anubis/blob/main/CONTRIBUTING.md)
- [ ] Ran integration tests `npm run test:integration` (unsupported on Windows, please use WSL) - [ ] Ran integration tests `npm run test:integration` (unsupported on Windows, please use WSL)
- [ ] All of my commits have [verified signatures](https://anubis.techaro.lol/docs/developer/signed-commits) - [ ] All of my commits have [verified signatures](https://anubis.techaro.lol/docs/developer/signed-commits)

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

@@ -12,3 +12,25 @@ maintnotifications
azurediamond azurediamond
cooldown cooldown
verifyfcrdns verifyfcrdns
Spintax
spintax
clampip
pseudoprofound
reimagining
iocaine
admins
fout
iplist
NArg
blocklists
rififi
prolocation
Prolocation
Necron
Stargate
FFXIV
uvensys
de
resourced
envoyproxy
unipromos

View File

@@ -87,10 +87,14 @@
^docs/docs/user/known-instances.md$ ^docs/docs/user/known-instances.md$
^docs/manifest/.*$ ^docs/manifest/.*$
^docs/static/\.nojekyll$ ^docs/static/\.nojekyll$
^lib/policy/config/testdata/bad/unparseable\.json$
^internal/glob/glob_test.go$ ^internal/glob/glob_test.go$
^internal/honeypot/naive/affirmations\.txt$
^internal/honeypot/naive/spintext\.txt$
^internal/honeypot/naive/titles\.txt$
^lib/config/testdata/bad/unparseable\.json$
^lib/localization/.*_test.go$
^lib/localization/locales/.*\.json$
^lib/policy/config/testdata/bad/unparseable\.json$
^test/.*$
ignore$ ignore$
robots.txt robots.txt
^lib/localization/locales/.*\.json$
^lib/localization/.*_test.go$
^test/.*$

View File

@@ -1,400 +1,424 @@
acs
acs Actorified
Actorified actorifiedstore
actorifiedstore actorify
actorify agentic
Aibrew Aibrew
alibaba alibaba
alrest alrest
amazonbot amazonbot
anthro anexia
anubis anthro
anubistest anubis
apnic anubistest
APNICRANDNETAU apnic
Applebot APNICRANDNETAU
archlinux Applebot
arpa archlinux
asnc arpa
asnchecker asnc
asns asnchecker
aspirational asns
atuin aspirational
azuretools atuin
badregexes azuretools
bbolt badregexes
bdba bbolt
berr bdba
bezier berr
bingbot bezier
Bitcoin bingbot
bitrate Bitcoin
Bluesky bitrate
blueskybot Bluesky
boi blueskybot
Bokm boi
botnet Bokm
botstopper botnet
BPort botstopper
Brightbot BPort
broked Brightbot
buildah broked
byteslice buildah
Bytespider byteslice
cachebuster Bytespider
cachediptoasn cachebuster
Caddyfile cachediptoasn
caninetools Caddyfile
Cardyb caninetools
celchecker Cardyb
celphase celchecker
cerr celphase
certresolver cerr
cespare certresolver
CGNAT cespare
cgr CGNAT
chainguard cgr
chall chainguard
challengemozilla chall
challengetest challengemozilla
checkpath challengetest
checkresult checkpath
chibi checkresult
cidranger chibi
ckie cidranger
cloudflare ckie
Codespaces CLAUDE
confd cloudflare
connnection cloudsolutions
containerbuild Codespaces
containerregistry confd
coreutils containerbuild
Cotoyogi containerregistry
Cromite coreutils
crt Cotoyogi
Cscript Cromite
daemonizing crt
dayjob Cscript
DDOS daemonizing
Debian databento
debrpm dayjob
decaymap dco
devcontainers DDOS
Diffbot Debian
discordapp debrpm
discordbot decaymap
distros devcontainers
dnf Diffbot
dnsbl discordapp
dnserr discordbot
DNSTTL distros
domainhere dnf
dracula dnsbl
dronebl dnserr
droneblresponse DNSTTL
dropin domainhere
dsilence dracula
duckduckbot dronebl
eerror droneblresponse
ellenjoe dropin
emacs dsilence
enbyware duckduckbot
etld eerror
everyones ellenjoe
evilbot emacs
evilsite enbyware
expressionorlist etld
externalagent everyones
externalfetcher evilbot
extldflags evilsite
facebookgo expressionorlist
Factset externalagent
fahedouch externalfetcher
fastcgi extldflags
FCr facebookgo
fcrdns Factset
fediverse fahedouch
ffprobe fastcgi
financials FCr
finfos fcrdns
Firecrawl fediverse
flagenv ffprobe
Fordola FFXIV
forgejo fhdr
forwardauth financials
fsys finfos
fullchain Firecrawl
gaissmai flagenv
Galvus Fordola
geoip forgejo
geoipchecker forwardauth
gha fsys
GHSA fullchain
Ghz gaissmai
gipc Galvus
gitea geoip
godotenv geoipchecker
goland gha
gomod GHSA
goodbot Ghz
googlebot gipc
gopsutil gitea
govulncheck GLM
goyaml godotenv
GPG goimports
GPT goland
gptbot gomod
Graphene goodbot
grpcprom googlebot
grw gopsutil
gzw govulncheck
Hashcash goyaml
hashrate GPG
headermap GPT
healthcheck gptbot
healthz Graphene
hec grpcprom
helpdesk grw
Hetzner gzw
hmc Hashcash
homelab hashrate
hostable hdr
htmlc headermap
htmx healthcheck
httpdebug healthz
huawei hec
hypertext helpdesk
iaskspider Hetzner
iaso hmc
iat homelab
ifm hostable
Imagesift HSTS
imgproxy htmlc
impressum htmx
inbox httpdebug
ingressed huawei
inp hypertext
internets iaskspider
IPTo iaso
iptoasn iat
isp ifm
iss Imagesift
isset imgproxy
ivh impressum
Jenomis inbox
JGit ingressed
jhjj inp
joho internets
journalctl IPTo
jshelter iptoasn
JWTs isp
kagi iss
kagibot isset
Keyfunc ivh
keypair Jenomis
KHTML JGit
kinda jhjj
KUBECONFIG joho
lcj journalctl
ldflags jshelter
letsencrypt JWTs
Lexentale kagi
lfc kagibot
lgbt Keyfunc
licend keypair
licstart KHTML
lightpanda kinda
limsa KUBECONFIG
Linting lcj
listor ldflags
LLU letsencrypt
loadbalancer Lexentale
lol lfc
lominsa lgbt
maintainership licend
malware licstart
mcr lightpanda
memes limsa
metarefresh Linting
metrix listor
mimi LLU
Minfilia loadbalancer
mistralai lol
mnt lominsa
Mojeek maintainership
mojeekbot malware
mozilla mcr
myclient memes
mymaster metarefresh
mypass metrix
myuser mimi
nbf Minfilia
nepeat mistralai
netsurf mnt
nginx Mojeek
nicksnyder mojeekbot
nobots mozilla
NONINFRINGEMENT myclient
nosleep mymaster
nullglob mypass
oci myuser
OCOB nbf
ogtag Necron
oklch nepeat
omgili netsurf
omgilibot nginx
openai nicksnyder
opendns nikandfor
opengraph nobots
openrc NONINFRINGEMENT
oswald nosleep
pag nullglob
palemoon oci
Pangu OCOB
parseable ogtag
passthrough oklch
Patreon omgili
pgrep omgilibot
phrik openai
pidfile opendns
pids opengraph
pipefail openrc
pki oswald
podkova pag
podman pagegen
Postgre palemoon
poststart Pangu
prebaked parseable
privkey passthrough
promauto Patreon
promhttp perplexitybot
proofofwork pgrep
publicsuffix phrik
purejs pidfile
pwcmd pids
pwuser pipefail
qualys pki
qwant podkova
qwantbot podman
rac Postgre
rawler poststart
rcvar prebaked
redhat privkey
redir promauto
redirectscheme promhttp
refactors proofofwork
remoteip publicsuffix
reputational purejs
risc pwcmd
ruleset pwuser
runlevels qualys
RUnlock qwant
runtimedir qwantbot
runtimedirectory rac
Ryzen rawler
sas rcvar
sasl redhat
screenshots redir
searchbot redirectscheme
searx refactors
sebest remoteip
secretplans reputational
Semrush Rhul
Seo risc
setsebool ruleset
shellcheck runlevels
shirou RUnlock
shopt runtimedir
Sidetrade runtimedirectory
simprint Ryzen
sitemap sas
sls sasl
sni screenshots
snipster searchbot
Spambot searx
sparkline sebest
spyderbot secretplans
srv Semrush
stackoverflow Seo
startprecmd setsebool
stoppostcmd shellcheck
storetest shirou
subgrid shoneypot
subr shopt
subrequest Sidetrade
SVCNAME simprint
tagline sitemap
tarballs sls
tarrif sni
taviso snipster
tbn Spambot
tbr spammer
techaro sparkline
techarohq spyderbot
telegrambot srcip
templ srv
templruntime stackoverflow
testarea Stargate
Thancred startprecmd
thoth stoppostcmd
thothmock storetest
Tik strcmp
Timpibot subgrid
TLog subr
traefik subrequest
trunc SVCNAME
uberspace tagline
Unbreak tarballs
unbreakdocker tarrif
unifiedjs taviso
unmarshal tbn
unparseable tbr
uvx techaro
UXP techarohq
valkey telegrambot
Varis templ
Velen templruntime
vendored testarea
verify Thancred
vhosts thoth
vkbot thothmock
VKE Tik
vnd Timpibot
VPS TLog
Vultr traefik
weblate trunc
webmaster txn
webpage uberspace
websecure Unbreak
websites unbreakdocker
Webzio unifiedjs
whois unmarshal
wildbase unparseable
withthothmock updown
wolfbeast uvx
wordpress UXP
workaround valkey
workdir Varis
wpbot Velen
XCircle vendored
xeiaso vhosts
xeserv vkbot
xesite VKE
xess vnd
xff VPS
XForwarded Vultr
XNG WAIFU
XOB weblate
XOriginal webmaster
XReal webpage
yae websecure
YAMLTo websites
Yda Webzio
yeet whois
yeetfile wildbase
yourdomain withthothmock
yyz wolfbeast
Zenos wordpress
zizmor workaround
zombocom workdir
zos wpbot
XCircle
xeiaso
xeserv
xesite
xess
xff
XForwarded
XNG
XOB
XOriginal
XReal
Y'shtola
yae
YAMLTo
Yda
yeet
yeetfile
yourdomain
yyz
Zenos
zizmor
zombocom
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@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.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@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with: with:
go-version: '1.25.4' go-version: "1.25.7"
- 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,18 +26,18 @@ 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@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.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@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with: with:
go-version: '1.25.4' go-version: "stable"
- uses: ko-build/setup-ko@d006021bd0c28d1ce33a07e7943d48b079944c8d # v0.9 - uses: ko-build/setup-ko@d006021bd0c28d1ce33a07e7943d48b079944c8d # v0.9
- name: Docker meta - name: Docker meta
id: meta id: meta
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0 uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with: with:
images: ghcr.io/${{ github.repository }} images: ghcr.io/${{ github.repository }}

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,17 +36,17 @@ 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@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.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@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with: with:
go-version: '1.25.4' go-version: "stable"
- uses: ko-build/setup-ko@d006021bd0c28d1ce33a07e7943d48b079944c8d # v0.9 - uses: ko-build/setup-ko@d006021bd0c28d1ce33a07e7943d48b079944c8d # v0.9
- name: Log into registry - name: Log into registry
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0
with: with:
registry: ghcr.io registry: ghcr.io
username: ${{ github.repository_owner }} username: ${{ github.repository_owner }}
@@ -54,7 +54,7 @@ jobs:
- name: Docker meta - name: Docker meta
id: meta id: meta
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0 uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with: with:
images: ${{ env.IMAGE }} images: ${{ env.IMAGE }}
@@ -68,7 +68,7 @@ jobs:
SLOG_LEVEL: debug SLOG_LEVEL: debug
- name: Generate artifact attestation - name: Generate artifact attestation
uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a # v3.0.0 uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4.1.0
with: with:
subject-name: ${{ env.IMAGE }} subject-name: ${{ env.IMAGE }}
subject-digest: ${{ steps.build.outputs.digest }} subject-digest: ${{ steps.build.outputs.digest }}

View File

@@ -17,15 +17,15 @@ 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
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
- name: Log into registry - name: Log into registry
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0
with: with:
registry: ghcr.io registry: ghcr.io
username: techarohq username: techarohq
@@ -33,7 +33,7 @@ jobs:
- name: Docker meta - name: Docker meta
id: meta id: meta
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0 uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with: with:
images: ghcr.io/techarohq/anubis/docs images: ghcr.io/techarohq/anubis/docs
tags: | tags: |
@@ -42,7 +42,7 @@ jobs:
- name: Build and push - name: Build and push
id: build id: build
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7.0.0
with: with:
context: ./docs context: ./docs
cache-to: type=gha cache-to: type=gha
@@ -53,14 +53,14 @@ jobs:
push: true push: true
- name: Apply k8s manifests to limsa lominsa - name: Apply k8s manifests to limsa lominsa
uses: actions-hub/kubectl@2639090a038d46a3b9b98b220ae0837676ded8b7 # v1.34.3 uses: actions-hub/kubectl@5ada4e2c02eacc03978c2437e95c8b0f979a9619 # v1.35.2
env: env:
KUBE_CONFIG: ${{ secrets.LIMSA_LOMINSA_KUBECONFIG }} KUBE_CONFIG: ${{ secrets.LIMSA_LOMINSA_KUBECONFIG }}
with: with:
args: apply -k docs/manifest args: apply -k docs/manifest
- name: Apply k8s manifests to limsa lominsa - name: Apply k8s manifests to limsa lominsa
uses: actions-hub/kubectl@2639090a038d46a3b9b98b220ae0837676ded8b7 # v1.34.3 uses: actions-hub/kubectl@5ada4e2c02eacc03978c2437e95c8b0f979a9619 # v1.35.2
env: env:
KUBE_CONFIG: ${{ secrets.LIMSA_LOMINSA_KUBECONFIG }} KUBE_CONFIG: ${{ secrets.LIMSA_LOMINSA_KUBECONFIG }}
with: with:

View File

@@ -13,16 +13,16 @@ 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
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
- name: Docker meta - name: Docker meta
id: meta id: meta
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0 uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with: with:
images: ghcr.io/techarohq/anubis/docs images: ghcr.io/techarohq/anubis/docs
tags: | tags: |
@@ -31,7 +31,7 @@ jobs:
- name: Build and push - name: Build and push
id: build id: build
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7.0.0
with: with:
context: ./docs context: ./docs
cache-to: type=gha cache-to: type=gha

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@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with: with:
go-version: '1.25.4' go-version: "stable"
- 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@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.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@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with: with:
go-version: '1.25.4' go-version: "stable"
- name: Cache playwright binaries - name: Cache playwright binaries
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
id: playwright-cache id: playwright-cache
with: with:
path: | path: |
@@ -55,10 +55,10 @@ jobs:
run: npm run test run: npm run test
- name: Lint with staticcheck - name: Lint with staticcheck
uses: dominikh/staticcheck-action@024238d2898c874f26d723e7d0ff4308c35589a2 # v1.4.0 uses: dominikh/staticcheck-action@9716614d4101e79b4340dd97b10e54d68234e431 # v1.4.1
with: with:
version: "latest" version: "latest"
- name: Govulncheck - name: Govulncheck
run: | run: |
go tool govulncheck ./... go tool govulncheck ./... ||:

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@48f256284bd46cdaab1048c3721360e808335d50 # v6.1.1
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@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.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@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with: with:
go-version: '1.25.4' go-version: "stable"
- 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@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.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@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with: with:
go-version: '1.25.4' go-version: "stable"
- name: install node deps - name: install node deps
run: | run: |
@@ -41,7 +41,7 @@ jobs:
run: | run: |
go tool yeet go tool yeet
- uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with: with:
name: packages name: packages
path: var/* path: var/*

View File

@@ -23,22 +23,23 @@ jobs:
- healthcheck - healthcheck
- i18n - i18n
- log-file - log-file
- nginx
- palemoon/amd64 - palemoon/amd64
#- palemoon/i386 #- palemoon/i386
- robots_txt - robots_txt
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@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.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@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with: with:
go-version: '1.25.4' go-version: "stable"
- uses: ko-build/setup-ko@d006021bd0c28d1ce33a07e7943d48b079944c8d # v0.9 - uses: ko-build/setup-ko@d006021bd0c28d1ce33a07e7943d48b079944c8d # v0.9
@@ -56,7 +57,7 @@ jobs:
run: echo "ARTIFACT_NAME=${{ matrix.test }}" | sed 's|/|-|g' >> $GITHUB_ENV run: echo "ARTIFACT_NAME=${{ matrix.test }}" | sed 's|/|-|g' >> $GITHUB_ENV
- name: Upload artifact - name: Upload artifact
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f
if: always() if: always()
with: with:
name: ${{ env.ARTIFACT_NAME }} name: ${{ env.ARTIFACT_NAME }}

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,19 +18,19 @@ 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
persist-credentials: false persist-credentials: false
- name: Log into registry - name: Log into registry
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0
with: with:
registry: ghcr.io registry: ghcr.io
username: ${{ github.repository_owner }} username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }} password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
- name: Build and push - name: Build and push
run: | run: |
cd ./test/ssh-ci cd ./test/ssh-ci

View File

@@ -12,32 +12,33 @@ permissions:
jobs: jobs:
ssh: ssh:
if: github.repository == 'TecharoHQ/anubis' if: github.repository == 'TecharoHQ/anubis'
runs-on: alrest-techarohq #runs-on: alrest-techarohq
runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
host: host:
- riscv64 - riscv64
- ppc64le - ppc64le
- aarch64-4k #- aarch64-4k
- 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
persist-credentials: false persist-credentials: false
- name: Install CI target SSH key - name: Install CI target SSH key
uses: shimataro/ssh-key-action@d4fffb50872869abe2d9a9098a6d9c5aa7d16be4 # v2.7.0 uses: shimataro/ssh-key-action@6b84f2e793b32fa0b03a379cadadec75cc539391 # v2.8.0
with: with:
key: ${{ secrets.CI_SSH_KEY }} key: ${{ secrets.CI_SSH_KEY }}
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@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with: with:
go-version: '1.25.4' go-version: "stable"
- 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,20 +16,20 @@ 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@1e862dfacbd1d6d858c55d9b792c756523627244 # v7.1.4 uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7.3.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@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 uses: github/codeql-action/upload-sarif@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v4.31.9
with: with:
sarif_file: results.sarif sarif_file: results.sarif
category: zizmor category: zizmor

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

@@ -24,8 +24,7 @@ build: assets
lint: assets lint: assets
$(GO) vet ./... $(GO) vet ./...
$(GO) tool staticcheck ./... $(GO) tool staticcheck ./...
$(GO) tool govulncheck ./...
prebaked-build: prebaked-build:
$(GO) build -o ./var/anubis -ldflags "-X 'github.com/TecharoHQ/anubis.Version=$(VERSION)'" ./cmd/anubis $(GO) build -o ./var/anubis -ldflags "-X 'github.com/TecharoHQ/anubis.Version=$(VERSION)'" ./cmd/anubis
$(GO) build -o ./var/robots2policy -ldflags "-X 'github.com/TecharoHQ/anubis.Version=$(VERSION)'" ./cmd/robots2policy $(GO) build -o ./var/robots2policy -ldflags "-X 'github.com/TecharoHQ/anubis.Version=$(VERSION)'" ./cmd/robots2policy

View File

@@ -20,12 +20,27 @@ Anubis is brought to you by sponsors and donors like:
<a href="https://www.raptorcs.com/content/base/products.html"> <a href="https://www.raptorcs.com/content/base/products.html">
<img src="./docs/static/img/sponsors/raptor-computing-logo.webp" alt="Raptor Computing Systems" height=64 /> <img src="./docs/static/img/sponsors/raptor-computing-logo.webp" alt="Raptor Computing Systems" height=64 />
</a> </a>
<a href="https://databento.com/?utm_source=anubis&utm_medium=sponsor&utm_campaign=anubis">
<img src="./docs/static/img/sponsors/databento-logo.webp" alt="Databento" height="64" />
</a>
### Gold Tier ### Gold Tier
<a href="https://www.unipromos.com/?utm_campaign=github&utm_medium=referral&utm_content=anubis">
<img src="./docs/static/img/sponsors/unipromos.webp" alt="Unipromos" height="64" />
</a>
<a href="https://uvensys.de/?utm_campaign=github&utm_medium=referral&utm_content=anubis">
<img src="./docs/static/img/sponsors/uvensys.webp" alt="Uvensys" height="64">
</a>
<a href="https://distrust.co?utm_campaign=github&utm_medium=referral&utm_content=anubis"> <a href="https://distrust.co?utm_campaign=github&utm_medium=referral&utm_content=anubis">
<img src="./docs/static/img/sponsors/distrust-logo.webp" alt="Distrust" height="64"> <img src="./docs/static/img/sponsors/distrust-logo.webp" alt="Distrust" height="64">
</a> </a>
<a href="https://about.gitea.com?utm_campaign=github&utm_medium=referral&utm_content=anubis">
<img src="./docs/static/img/sponsors/gitea-logo.webp" alt="Gitea" height="64">
</a>
<a href="https://prolocation.net?utm_campaign=github&utm_medium=referral&utm_content=anubis">
<img src="./docs/static/img/sponsors/prolocation-logo.svg" alt="Prolocation" height="64">
</a>
<a href="https://terminaltrove.com/?utm_campaign=github&utm_medium=referral&utm_content=anubis&utm_source=abgh"> <a href="https://terminaltrove.com/?utm_campaign=github&utm_medium=referral&utm_content=anubis&utm_source=abgh">
<img src="./docs/static/img/sponsors/terminal-trove.webp" alt="Terminal Trove" height="64"> <img src="./docs/static/img/sponsors/terminal-trove.webp" alt="Terminal Trove" height="64">
</a> </a>
@@ -55,6 +70,9 @@ Anubis is brought to you by sponsors and donors like:
height="64" height="64"
/> />
</a> </a>
<a href="https://www.anexia.com/">
<img src="./docs/static/img/sponsors/anexia-cloudsolutions-logo.webp" alt="ANEXIA Cloud Solutions" height="64">
</a>
## Overview ## Overview

View File

@@ -1 +1 @@
1.24.0-pre1 1.25.0

View File

@@ -418,8 +418,8 @@ func main() {
var redirectDomainsList []string var redirectDomainsList []string
if *redirectDomains != "" { if *redirectDomains != "" {
domains := strings.Split(*redirectDomains, ",") domains := strings.SplitSeq(*redirectDomains, ",")
for _, domain := range domains { for domain := range domains {
_, err = url.Parse(domain) _, err = url.Parse(domain)
if err != nil { if err != nil {
log.Fatalf("cannot parse redirect-domain %q: %s", domain, err.Error()) log.Fatalf("cannot parse redirect-domain %q: %s", domain, err.Error())

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

@@ -10,6 +10,7 @@ import (
"net/http" "net/http"
"os" "os"
"regexp" "regexp"
"slices"
"strings" "strings"
"github.com/TecharoHQ/anubis/lib/config" "github.com/TecharoHQ/anubis/lib/config"
@@ -210,11 +211,8 @@ func parseRobotsTxt(input io.Reader) ([]RobotsRule, error) {
// Mark blacklisted user agents (those with "Disallow: /") // Mark blacklisted user agents (those with "Disallow: /")
for i := range rules { for i := range rules {
for _, disallow := range rules[i].Disallows { if slices.Contains(rules[i].Disallows, "/") {
if disallow == "/" { rules[i].IsBlacklist = true
rules[i].IsBlacklist = true
break
}
} }
} }

View File

@@ -158,8 +158,8 @@ func TestDataFileConversion(t *testing.T) {
} }
if strings.ToLower(*outputFormat) == "yaml" { if strings.ToLower(*outputFormat) == "yaml" {
var actualData []interface{} var actualData []any
var expectedData []interface{} var expectedData []any
err = yaml.Unmarshal(actualOutput, &actualData) err = yaml.Unmarshal(actualOutput, &actualData)
if err != nil { if err != nil {
@@ -178,8 +178,8 @@ func TestDataFileConversion(t *testing.T) {
t.Errorf("Output mismatch for %s\nExpected:\n%s\n\nActual:\n%s", tc.name, expectedStr, actualStr) t.Errorf("Output mismatch for %s\nExpected:\n%s\n\nActual:\n%s", tc.name, expectedStr, actualStr)
} }
} else { } else {
var actualData []interface{} var actualData []any
var expectedData []interface{} var expectedData []any
err = json.Unmarshal(actualOutput, &actualData) err = json.Unmarshal(actualOutput, &actualData)
if err != nil { if err != nil {
@@ -419,6 +419,6 @@ Disallow: /`
// compareData performs a deep comparison of two data structures, // compareData performs a deep comparison of two data structures,
// ignoring differences that are semantically equivalent in YAML/JSON // ignoring differences that are semantically equivalent in YAML/JSON
func compareData(actual, expected interface{}) bool { func compareData(actual, expected any) bool {
return reflect.DeepEqual(actual, expected) return reflect.DeepEqual(actual, expected)
} }

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,5 +3,6 @@
- name: qualys-ssl-labs - name: qualys-ssl-labs
action: ALLOW action: ALLOW
remote_addresses: remote_addresses:
- 64.41.200.0/24 - 69.67.183.0/24
- 2600:C02:1020:4202::/64 - 2600:C02:1020:4202::/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

@@ -95,50 +95,6 @@ bots:
# weight: # weight:
# adjust: -10 # adjust: -10
# Assert behaviour that only genuine browsers display. This ensures that Chrome
# or Firefox versions
- name: realistic-browser-catchall
expression:
all:
- '"User-Agent" in headers'
- '( userAgent.contains("Firefox") ) || ( userAgent.contains("Chrome") ) || ( userAgent.contains("Safari") )'
- '"Accept" in headers'
- '"Sec-Fetch-Dest" in headers'
- '"Sec-Fetch-Mode" in headers'
- '"Sec-Fetch-Site" in headers'
- '"Accept-Encoding" in headers'
- '( headers["Accept-Encoding"].contains("zstd") || headers["Accept-Encoding"].contains("br") )'
- '"Accept-Language" in headers'
action: WEIGH
weight:
adjust: -10
# The Upgrade-Insecure-Requests header is typically sent by browsers, but not always
- name: upgrade-insecure-requests
expression: '"Upgrade-Insecure-Requests" in headers'
action: WEIGH
weight:
adjust: -2
# Chrome should behave like Chrome
- name: chrome-is-proper
expression:
all:
- userAgent.contains("Chrome")
- '"Sec-Ch-Ua" in headers'
- 'headers["Sec-Ch-Ua"].contains("Chromium")'
- '"Sec-Ch-Ua-Mobile" in headers'
- '"Sec-Ch-Ua-Platform" in headers'
action: WEIGH
weight:
adjust: -5
- name: should-have-accept
expression: '!("Accept" in headers)'
action: WEIGH
weight:
adjust: 5
# Generic catchall rule # Generic catchall rule
- name: generic-browser - name: generic-browser
user_agent_regex: >- user_agent_regex: >-

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

@@ -4,5 +4,5 @@
# - Claude-User: No published IP allowlist # - Claude-User: No published IP allowlist
- name: "ai-clients" - name: "ai-clients"
user_agent_regex: >- user_agent_regex: >-
ChatGPT-User|Claude-User|MistralAI-User ChatGPT-User|Claude-User|MistralAI-User|Perplexity-User
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

@@ -0,0 +1,8 @@
# Acts on behalf of user requests
# https://docs.perplexity.ai/guides/bots
- name: perplexity-user
user_agent_regex: Perplexity-User/.+; \+https\://perplexity\.ai/perplexity-user
action: ALLOW
# https://www.perplexity.com/perplexity-user.json
remote_addresses:
["44.208.221.197/32", "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

@@ -0,0 +1,55 @@
# Assert behaviour that only genuine browsers display. This ensures that modern Chrome
# or Firefox versions will get through without a challenge.
#
# These rules have been known to be bypassed by some of the worst automated scrapers.
# Use at your own risk.
- name: realistic-browser-catchall
expression:
all:
- '"User-Agent" in headers'
- '( userAgent.contains("Firefox") ) || ( userAgent.contains("Chrome") ) || ( userAgent.contains("Safari") )'
- '"Accept" in headers'
- '"Sec-Fetch-Dest" in headers'
- '"Sec-Fetch-Mode" in headers'
- '"Sec-Fetch-Site" in headers'
- '"Accept-Encoding" in headers'
- '( headers["Accept-Encoding"].contains("zstd") || headers["Accept-Encoding"].contains("br") )'
- '"Accept-Language" in headers'
action: WEIGH
weight:
adjust: -10
# The Upgrade-Insecure-Requests header is typically sent by browsers, but not always
- name: upgrade-insecure-requests
expression: '"Upgrade-Insecure-Requests" in headers'
action: WEIGH
weight:
adjust: -2
# Chrome should behave like Chrome
- name: chrome-is-proper
expression:
all:
- userAgent.contains("Chrome")
- '"Sec-Ch-Ua" in headers'
- 'headers["Sec-Ch-Ua"].contains("Chromium")'
- '"Sec-Ch-Ua-Mobile" in headers'
- '"Sec-Ch-Ua-Platform" in headers'
action: WEIGH
weight:
adjust: -5
- name: should-have-accept
expression: '!("Accept" in headers)'
action: WEIGH
weight:
adjust: 5
# Generic catchall rule
- name: generic-browser
user_agent_regex: >-
Mozilla|Opera
action: WEIGH
weight:
adjust: 10

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

@@ -8,4 +8,5 @@
- import: (data)/crawlers/marginalia.yaml - import: (data)/crawlers/marginalia.yaml
- import: (data)/crawlers/mojeekbot.yaml - import: (data)/crawlers/mojeekbot.yaml
- import: (data)/crawlers/commoncrawl.yaml - import: (data)/crawlers/commoncrawl.yaml
- import: (data)/crawlers/wikimedia-citoid.yaml
- import: (data)/crawlers/yandexbot.yaml - import: (data)/crawlers/yandexbot.yaml

View File

@@ -4,5 +4,5 @@
# - Claude-SearchBot: No published IP allowlist # - Claude-SearchBot: No published IP allowlist
- name: "ai-crawlers-search" - name: "ai-crawlers-search"
user_agent_regex: >- user_agent_regex: >-
OAI-SearchBot|Claude-SearchBot OAI-SearchBot|Claude-SearchBot|PerplexityBot
action: DENY action: DENY

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

@@ -0,0 +1,17 @@
# Indexing for search, does not collect training data
# https://docs.perplexity.ai/guides/bots
- name: perplexitybot
user_agent_regex: PerplexityBot/.+; \+https\://perplexity\.ai/perplexitybot
action: ALLOW
# https://www.perplexity.com/perplexitybot.json
remote_addresses:
[
"107.20.236.150/32",
"3.224.62.45/32",
"18.210.92.235/32",
"3.222.232.239/32",
"3.211.124.183/32",
"3.231.139.107/32",
"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

@@ -0,0 +1,18 @@
# Wikimedia Foundation citation services
# https://www.mediawiki.org/wiki/Citoid
- name: wikimedia-citoid
user_agent_regex: "Citoid/WMF"
action: ALLOW
remote_addresses: [
"208.80.152.0/22",
"2620:0:860::/46",
]
- name: wikimedia-zotero-translation-server
user_agent_regex: "ZoteroTranslationServer/WMF"
action: ALLOW
remote_addresses: [
"208.80.152.0/22",
"2620:0:860::/46",
]

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

@@ -3,5 +3,7 @@
- import: (data)/bots/ai-catchall.yaml - import: (data)/bots/ai-catchall.yaml
- import: (data)/crawlers/ai-training.yaml - import: (data)/crawlers/ai-training.yaml
- import: (data)/crawlers/openai-searchbot.yaml - import: (data)/crawlers/openai-searchbot.yaml
- import: (data)/crawlers/perplexitybot.yaml
- import: (data)/clients/openai-chatgpt-user.yaml - import: (data)/clients/openai-chatgpt-user.yaml
- import: (data)/clients/mistral-mistralai-user.yaml - import: (data)/clients/mistral-mistralai-user.yaml
- import: (data)/clients/perplexity-user.yaml

View File

@@ -2,5 +2,7 @@
- import: (data)/bots/ai-catchall.yaml - import: (data)/bots/ai-catchall.yaml
- import: (data)/crawlers/openai-searchbot.yaml - import: (data)/crawlers/openai-searchbot.yaml
- import: (data)/crawlers/openai-gptbot.yaml - import: (data)/crawlers/openai-gptbot.yaml
- import: (data)/crawlers/perplexitybot.yaml
- import: (data)/clients/openai-chatgpt-user.yaml - import: (data)/clients/openai-chatgpt-user.yaml
- import: (data)/clients/mistral-mistralai-user.yaml - import: (data)/clients/mistral-mistralai-user.yaml
- import: (data)/clients/perplexity-user.yaml

View File

@@ -79,50 +79,6 @@
# weight: # weight:
# adjust: -10 # adjust: -10
# Assert behaviour that only genuine browsers display. This ensures that Chrome
# or Firefox versions
- name: realistic-browser-catchall
expression:
all:
- '"User-Agent" in headers'
- '( userAgent.contains("Firefox") ) || ( userAgent.contains("Chrome") ) || ( userAgent.contains("Safari") )'
- '"Accept" in headers'
- '"Sec-Fetch-Dest" in headers'
- '"Sec-Fetch-Mode" in headers'
- '"Sec-Fetch-Site" in headers'
- '"Accept-Encoding" in headers'
- '( headers["Accept-Encoding"].contains("zstd") || headers["Accept-Encoding"].contains("br") )'
- '"Accept-Language" in headers'
action: WEIGH
weight:
adjust: -10
# The Upgrade-Insecure-Requests header is typically sent by browsers, but not always
- name: upgrade-insecure-requests
expression: '"Upgrade-Insecure-Requests" in headers'
action: WEIGH
weight:
adjust: -2
# Chrome should behave like Chrome
- name: chrome-is-proper
expression:
all:
- userAgent.contains("Chrome")
- '"Sec-Ch-Ua" in headers'
- 'headers["Sec-Ch-Ua"].contains("Chromium")'
- '"Sec-Ch-Ua-Mobile" in headers'
- '"Sec-Ch-Ua-Platform" in headers'
action: WEIGH
weight:
adjust: -5
- name: should-have-accept
expression: '!("Accept" in headers)'
action: WEIGH
weight:
adjust: 5
# Generic catchall rule # Generic catchall rule
- name: generic-browser - name: generic-browser
user_agent_regex: >- user_agent_regex: >-

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

@@ -226,7 +226,7 @@ So far Anubis supports the following languages:
- English (Simplified and Traditional) - English (Simplified and Traditional)
- French - French
- Portugese (Brazil) - Portuguese (Brazil)
- Spanish - Spanish
If you want to contribute translations, please [file an issue](https://github.com/TecharoHQ/anubis/issues/new) with your language of choice or submit a pull request to [the `lib/localization/locales` folder](https://github.com/TecharoHQ/anubis/tree/main/lib/localization/locales). We are about to introduce features to the translation stack, so you may want to hold off a hot minute, but we welcome any and all contributions to making Anubis useful to a global audience. If you want to contribute translations, please [file an issue](https://github.com/TecharoHQ/anubis/issues/new) with your language of choice or submit a pull request to [the `lib/localization/locales` folder](https://github.com/TecharoHQ/anubis/tree/main/lib/localization/locales). We are about to introduce features to the translation stack, so you may want to hold off a hot minute, but we welcome any and all contributions to making Anubis useful to a global audience.

View File

@@ -69,7 +69,7 @@ I am waiting to hear back from NLNet on if Anubis was selected for funding or no
Anubis now supports localized responses. Locales can be added in [lib/localization/locales/](https://github.com/TecharoHQ/anubis/tree/main/lib/localization/locales). This release includes support for the following languages: Anubis now supports localized responses. Locales can be added in [lib/localization/locales/](https://github.com/TecharoHQ/anubis/tree/main/lib/localization/locales). This release includes support for the following languages:
- [Brazilian Portugese](https://github.com/TecharoHQ/anubis/pull/726) - [Brazilian Portuguese](https://github.com/TecharoHQ/anubis/pull/726)
- [Chinese (Simplified)](https://github.com/TecharoHQ/anubis/pull/774) - [Chinese (Simplified)](https://github.com/TecharoHQ/anubis/pull/774)
- [Chinese (Traditional)](https://github.com/TecharoHQ/anubis/pull/759) - [Chinese (Traditional)](https://github.com/TecharoHQ/anubis/pull/759)
- [Czech](https://github.com/TecharoHQ/anubis/pull/849) - [Czech](https://github.com/TecharoHQ/anubis/pull/849)

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

@@ -11,9 +11,45 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
- Build experimental windows binaries in CI and production builds.
- fix: prevent nil pointer panic in challenge validation when threshold rules match during PassChallenge (#1463).
- Instruct reverse proxies to not cache error pages.
- Fixed mixed tab/space indentation in Caddy documentation code block.
<!-- This changes the project to: --> <!-- This changes the project to: -->
## v1.24.0 [pre1]: Y'shtola Rhul ## v1.25.0: Necron
Hey all,
I'm sure you've all been aware that things have been slowing down a little with Anubis development, and I want to apologize for that. A lot has been going on in my life lately (my blog will have a post out on Friday with more information), and as a result I haven't really had the energy to work on Anubis in publicly visible ways. There are things going on behind the scenes, but nothing is really shippable yet, sorry!
I've also been feeling some burnout in the wake of perennial waves of anger directed towards me. I'm handling it, I'll be fine, I've just had a lot going on in my life and it's been rough.
I've been missing the sense of wanderlust and discovery that comes with the artistic way I playfully develop software. I suspect that some of the stresses I've been through (setting up a complicated surgery in a country whose language you aren't fluent in is kind of an experience) have been sapping my energy. I'd gonna try to mess with things on my break, but realistically I'm probably just gonna be either watching Stargate SG-1 or doing unreasonable amounts of ocean fishing in Final Fantasy 14. Normally I'd love to keep the details about my medical state fairly private, but I'm more of a public figure now than I was this time last year so I don't really get the invisibility I'm used to for this.
I've also had a fair amount of negativity directed at me for simply being much more visible than the anonymous threat actors running the scrapers that are ruining everything, which though understandable has not helped.
Anyways, it all worked out and I'm about to be in the hospital for a week, so if things go really badly with this release please downgrade to the last version and/or upgrade to the main branch when the fix PR is inevitably merged. I hoped to have time to tame GPG and set up full release automation in the Anubis repo, but that didn't work out this time and that's okay.
If I can challenge you all to do something, go out there and try to actually create something new somehow. Combine ideas you've never mixed before. Be creative, be human, make something purely for yourself to scratch an itch that you've always had yet never gotten around to actually mending.
At the very least, try to be an example of how you want other people to act, even when you're in a situation where software written by someone else is configured to require a user agent to execute javascript to access a webpage.
Be well,
Xe
PS: if you're well-versed in FFXIV lore, the release title should give you an idea of the kind of stuff I've been going through mentally.
- 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))
- Fix honeypot and imprint links missing `BASE_PREFIX` when deployed behind a path prefix ([#1402](https://github.com/TecharoHQ/anubis/issues/1402))
- Add ANEXIA Sponsor logo to docs ([#1409](https://github.com/TecharoHQ/anubis/pull/1409))
- Improve idle performance in memory storage
- Add HAProxy Configurations to Docs ([#1424](https://github.com/TecharoHQ/anubis/pull/1424))
## v1.24.0: Y'shtola Rhul
Anubis is back and better than ever! Lots of minor fixes with some big ones interspersed. Anubis is back and better than ever! Lots of minor fixes with some big ones interspersed.
@@ -27,6 +63,14 @@ Anubis is back and better than ever! Lots of minor fixes with some big ones inte
- Add support to simple Valkey/Redis cluster mode - Add support to simple Valkey/Redis cluster mode
- Open Graph passthrough now reuses the configured target Host/SNI/TLS settings, so metadata fetches succeed when the upstream certificate differs from the public domain. ([1283](https://github.com/TecharoHQ/anubis/pull/1283)) - Open Graph passthrough now reuses the configured target Host/SNI/TLS settings, so metadata fetches succeed when the upstream certificate differs from the public domain. ([1283](https://github.com/TecharoHQ/anubis/pull/1283))
- Stabilize the CVE-2025-24369 regression test by always submitting an invalid proof instead of relying on random POW failures. - Stabilize the CVE-2025-24369 regression test by always submitting an invalid proof instead of relying on random POW failures.
- Refine the check that ensures the presence of the Accept header to avoid breaking docker clients.
- Removed rules intended to reward actual browsers due to abuse in the wild.
### Dataset poisoning
Anubis has the ability to engage in [dataset poisoning attacks](https://www.anthropic.com/research/small-samples-poison) using the [dataset poisoning subsystem](./admin/honeypot/overview.mdx). This allows every Anubis instance to be a honeypot to attract and flag abusive scrapers so that no administrator action is required to ban them.
There is much more information about this feature in [the dataset poisoning subsystem documentation](./admin/honeypot/overview.mdx). Administrators that are interested in learning how this feature works should consult that documentation.
### Deprecate `report_as` in challenge configuration ### Deprecate `report_as` in challenge configuration

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

@@ -51,9 +51,8 @@ If you are using Kubernetes, you will need to create an image pull secret:
kubectl create secret docker-registry \ kubectl create secret docker-registry \
techarohq-botstopper \ techarohq-botstopper \
--docker-server ghcr.io \ --docker-server ghcr.io \
--docker-username your-username \ --docker-username any-username \
--docker-password your-access-token \ --docker-password <your-access-token> \
--docker-email your@email.address
``` ```
Then attach it to your Deployment: Then attach it to your Deployment:
@@ -85,7 +84,7 @@ Follow [the upstream Docker compose directions](https://anubis.techaro.lol/docs/
OG_EXPIRY_TIME: "24h" OG_EXPIRY_TIME: "24h"
+ # botstopper config here + # botstopper config here
+ CHALLENGE_TITLE: "Doing math for your connnection!" + CHALLENGE_TITLE: "Doing math for your connection!"
+ ERROR_TITLE: "Something went wrong!" + ERROR_TITLE: "Something went wrong!"
+ OVERLAY_FOLDER: /assets + OVERLAY_FOLDER: /assets
+ volumes: + volumes:

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."
} }
} }

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